背景偶然在doc/readme目录里看到readme/分布式 通信子系统README.md · OpenH ARMony/docs - 码云 - 开源中国对这个还是比较感兴趣的,所以决定把这个部分拿出来解读下,加上还没有看到有人写。 特定到网上搜了下“分布式通信子系统 鸿蒙”,只搜到一篇,我觉得还是比较相关的,讲了分布式通信的需求来源,解析鸿蒙操作系统,不过他这个题目起的有点随意。
理解计划如何阅读理解分布式通信子系统的源代码呢? 这边的思路主要是:
思维导图用思维导图的树形结构就够了(下图里的蓝色方块就是这篇博文关注的部分): 在线浏览链接 事实上这个文档读起来还是比较费力的,但是软件毕竟数学,工程的东西,你多重复读几遍没有看不懂的。 先说几个名词的个人理解: 能力:能力应该是一种拟人化的说法,其实就是功能吧,能力的使用者是服务。服务:服务是一个日常口语,我理解就是现代流行的以人为本的抽象,比如为人民服务,这里的服务就多了去了,需求方式人民,***和人民之间的抽象层就是服务,当然服务有很多服务,所以可以都给起个名字。 会话:又是一个日常口语,如果服务相对静态,会话就是一次具体的服务,如何称呼呢?分配一个会话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的相关能力。 占位
参考资料
|