背景
偶然在doc/readme目录里看到readme/分布式通讯子系统README.md · OpenHarmony/docs - 码云 - 开源中国 对这个仍是比较感兴趣的,因此决定把这个部分拿出来解读下,加上尚未看到有人写。 特定到网上搜了下“分布式通讯子系统 鸿蒙”,只搜到一篇,我以为仍是比较相关的,讲了分布式通讯的需求来源,解析鸿蒙操做系统,不过他这个题目起的有点随意。git
理解计划
如何阅读理解分布式通讯子系统的源代码呢? 这边的思路主要是:算法
- 阅读文档入手;
- 绘制思惟导图;
- 经过关键词定位源代码,经过调用关系肯定执行流程(流程图可视化)
- 流程,剩下的基本就是数据结构和算法方面的事情了;
思惟导图
用思惟导图的树形结构就够了(下图里的蓝色方块就是这篇博文关注的部分):json
在线浏览连接 markdown
事实上这个文档读起来仍是比较费力的,可是软件毕竟数学,工程的东西,你多重复读几遍没有看不懂的。session
先说几个名词的我的理解: 能力:能力应该是一种拟人化的说法,其实就是功能吧,能力的使用者是服务。 服务:服务是一个平常口语,我理解就是现代流行的以人为本的抽象,好比为人民服务,这里的服务就多了去了,需求方式人民,政府和人民之间的抽象层就是服务,固然服务有不少服务,因此能够都给起个名字。 会话:又是一个平常口语,若是服务相对静态,会话就是一次具体的服务,如何称呼呢?分配一个会话id就行了,会话完成什么事呢,从底层来说就是二进制流,层次再高点就是字节流,层次再高点就是数据流,层次再高点就是业务数据流。因此会话就是完成数据传输。数据结构
执行流程
看了上面的思惟导图,仍是不放心,不知道具体是怎么实现的。 下面按照文档里的使用步骤,根据关键词到代码里搜一下,整理成流程图,若是可能再拷贝出来造成demo执行下。 134个仓库已经从网上下载下来了,把【涉及仓】拷贝到单独文件夹,而后经过vscode打开文件夹。 数据结构和算法
1. 设备发现
用户使用发现功能时,须要保证发现端设备与被发现端设备在同一个局域网内,而且互相能收到对方如下流程的报文。分布式
(1) 发现端设备,发起 discover 请求后,使用coap协议在局域网内发送广播。
这部分代码是如何实现的?也就是这篇在vscode里搜 discover 能够发现确实搜到了不少函数,代码很少,最好的方法就是把代码所有看一下,再注释下,流程就基本清楚了,否则也没其余方法了。 把目录里的的.git .gitee删除后,而后上传到了gitee,零散地地作了一些注释: https://gitee.com/eatcosmos/openharmony-comment-communication.git
按照理解计划,下面就先注释代码吧: 发现代码虽然很少,可是这么没有方向的注释仍是很难进行下去,因此注释了会,想到markdown文档里有个coap的截图,里面有关键字,能够用来定位下:
可是discovery_service.c里没搜到json_payload.h里声明的两个函数,奇怪,你没调用,为何还include个json_payload.h ? 先注释下下函数 discovery_service.c: PublishService(),由于看这个函数名显然是发布服务的意思,不过第一步不是发布服务而是发起 发现请求,因此应该在discovery_service.c里面搜索 discover,不过没找到含discovery的函数名(后面能够看出,其实discover功能命令确实是从这个源文件发出的,只不过是其余函数内部调用的):
由于那个协议截图里的内容其实确定用到了 json_payload.c 里函数,因此若是要搜代码的话,这是一个突破口,因此这边是从 json_payload.h 里的一个函数 ParseServiceDiscover() 出发:
函数
能够定位到ParseServiceDiscover() 的调用者是 GetServiceDiscoverInfo(): 操作系统
其余操做和截图里相似,就是经过不断搜索上一层调用函数,就能够把调用流程画出来,用代码阅读软件应该能智能作到这一步,不过手工的方法印象会更深入,流程图以下:
截图里相同颜色表示相同的源文件,能够发现一个发送 discover 请求的执行函数仍是不少的,不过他这个函数分解仍是挺好理解的,好像每一个函数都是须要的。
具体的函数内部代码怎么调用的尚未看,感受能够用到了看看,应该对代码实现能力有帮助。
(2)被发现端设备使用PublishService接口发布服务,接收端收到广播后,发送coap协议单播给发现端。
占位
(3)发现端设备收到报文会更新设备信息。
占位
1. 传输
软总线提供统一的基于Session的传输功能,业务能够经过sessionId收发数据或获取其相关基本属性。当前本项目只实现被动接收Session链接的功能,业务可根据自身须要及Session自身属性判断是否接受此Session,如不接受,能够主动拒绝此链接。本项目暂未提供打开Session的相关能力。 占位