分布式通信子系统之发起 discover 请求 | 解读鸿蒙源码
背景
偶然在doc/readme目录里看到readme/分布式通信子系统README.md · OpenHarmony/docs - 码云 - 开源中国 对这个还是比较感兴趣的,所以决定把这个部分拿出来解读下,加上还没有看到有人写。 特定到网上搜了下“分布式通信子系统 鸿蒙”,只搜到一篇,我觉得还是比较相关的,讲了分布式通信的需求来源,解析鸿蒙操作系统,不过他这个题目起的有点随意。
理解计划
如何阅读理解分布式通信子系统的源代码呢? 这边的思路主要是:
- 阅读文档入手;
- 绘制思维导图;
- 通过关键词定位源代码,通过调用关系确定执行流程(流程图可视化)
- 流程,剩下的基本就是数据结构和算法方面的事情了;
思维导图
用思维导图的树形结构就够了(下图里的蓝色方块就是这篇博文关注的部分):
事实上这个文档读起来还是比较费力的,但是软件毕竟数学,工程的东西,你多重复读几遍没有看不懂的。
先说几个名词的个人理解: 能力:能力应该是一种拟人化的说法,其实就是功能吧,能力的使用者是服务。 服务:服务是一个日常口语,我理解就是现代流行的以人为本的抽象,比如为人民服务,这里的服务就多了去了,需求方式人民,政府和人民之间的抽象层就是服务,当然服务有很多服务,所以可以都给起个名字。 会话:又是一个日常口语,如果服务相对静态,会话就是一次具体的服务,如何称呼呢?分配一个会话id就好了,会话完成什么事呢,从底层来讲就是二进制流,层次再高点就是字节流,层次再高点就是数据流,层次再高点就是业务数据流。所以会话就是完成数据传输。
执行流程
看了上面的思维导图,还是不放心,不知道具体是怎么实现的。 下面按照文档里的使用步骤,根据关键词到代码里搜一下,整理成流程图,如果可能再拷贝出来形成demo执行下。 134个仓库已经从网上下载下来了,把【涉及仓】拷贝到单独文件夹,然后通过vscode打开文件夹。
1. 设备发现
用户使用发现功能时,需要保证发现端设备与被发现端设备在同一个局域网内,并且互相能收到对方以下流程的报文。
(1) 发现端设备,发起 discover 请求后,使用coap协议在局域网内发送广播。
这部分代码是如何实现的?也就是这篇在vscode里搜 discover 
按照理解计划,下面就先注释代码吧: 


可以定位到ParseServiceDiscover() 的调用者是 GetServiceDiscoverInfo():
其他操作和截图里类似,就是通过不断搜索上一层调用函数,就可以把调用流程画出来,用代码阅读软件应该能智能做到这一步,不过手工的方法印象会更深刻,流程图如下:
截图里相同颜色表示相同的源文件,可以发现一个发送 discover 请求的执行函数还是很多的,不过他这个函数分解还是挺好理解的,好像每个函数都是需要的。
具体的函数内部代码怎么调用的还没有看,感觉可以用到了看看,应该对代码实现能力有帮助。
(2)被发现端设备使用PublishService接口发布服务,接收端收到广播后,发送coap协议单播给发现端。
占位
(3)发现端设备收到报文会更新设备信息。
占位
1. 传输
软总线提供统一的基于Session的传输功能,业务可以通过sessionId收发数据或获取其相关基本属性。当前本项目只实现被动接收Session连接的功能,业务可根据自身需要及Session自身属性判断是否接受此Session,如不接受,可以主动拒绝此连接。本项目暂未提供打开Session的相关能力。 占位




