• 128980

    文章

  • 810

    评论

  • 12

    友链

  • 最近新加了换肤功能,大家多来逛逛吧~~~~
  • 喜欢这个网站的朋友可以加一下QQ群,我们一起交流技术。

分布式通信子系统之发起 discover 请求 | 解读鸿蒙源码

服了这份高薪指南,涨多少你说了算>>

背景

偶然在doc/readme目录里看到readme/分布式通信子系统README.md · OpenHarmony/docs - 码云 - 开源中国 对这个还是比较感兴趣的,所以决定把这个部分拿出来解读下,加上还没有看到有人写。 特定到网上搜了下“分布式通信子系统 鸿蒙”,只搜到一篇,我觉得还是比较相关的,讲了分布式通信的需求来源,解析鸿蒙操作系统,不过他这个题目起的有点随意。

理解计划

如何阅读理解分布式通信子系统的源代码呢? 这边的思路主要是:

  1. 阅读文档入手;
  2. 绘制思维导图;
  3. 通过关键词定位源代码,通过调用关系确定执行流程(流程图可视化)
  4. 流程,剩下的基本就是数据结构和算法方面的事情了;

思维导图

用思维导图的树形结构就够了(下图里的蓝色方块就是这篇博文关注的部分):

在线浏览链接 分布式通信子系统思维导图

事实上这个文档读起来还是比较费力的,但是软件毕竟数学,工程的东西,你多重复读几遍没有看不懂的。

先说几个名词的个人理解: 能力:能力应该是一种拟人化的说法,其实就是功能吧,能力的使用者是服务。 服务:服务是一个日常口语,我理解就是现代流行的以人为本的抽象,比如为人民服务,这里的服务就多了去了,需求方式人民,政府和人民之间的抽象层就是服务,当然服务有很多服务,所以可以都给起个名字。 会话:又是一个日常口语,如果服务相对静态,会话就是一次具体的服务,如何称呼呢?分配一个会话id就好了,会话完成什么事呢,从底层来讲就是二进制流,层次再高点就是字节流,层次再高点就是数据流,层次再高点就是业务数据流。所以会话就是完成数据传输。

执行流程

看了上面的思维导图,还是不放心,不知道具体是怎么实现的。 下面按照文档里的使用步骤,根据关键词到代码里搜一下,整理成流程图,如果可能再拷贝出来形成demo执行下。 134个仓库已经从网上下载下来了,把【涉及仓】拷贝到单独文件夹,然后通过vscode打开文件夹。 代码文件夹

1. 设备发现

用户使用发现功能时,需要保证发现端设备与被发现端设备在同一个局域网内,并且互相能收到对方以下流程的报文。

(1) 发现端设备,发起 discover 请求后,使用coap协议在局域网内发送广播。

这部分代码是如何实现的?也就是这篇在vscode里搜 discover 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(): 0AGgqs.png

其他操作和截图里类似,就是通过不断搜索上一层调用函数,就可以把调用流程画出来,用代码阅读软件应该能智能做到这一步,不过手工的方法印象会更深刻,流程图如下:

在线浏览链接 0AGYKH.png

截图里相同颜色表示相同的源文件,可以发现一个发送 discover 请求的执行函数还是很多的,不过他这个函数分解还是挺好理解的,好像每个函数都是需要的。

具体的函数内部代码怎么调用的还没有看,感觉可以用到了看看,应该对代码实现能力有帮助。

(2)被发现端设备使用PublishService接口发布服务,接收端收到广播后,发送coap协议单播给发现端。

占位

(3)发现端设备收到报文会更新设备信息。

占位

1. 传输

软总线提供统一的基于Session的传输功能,业务可以通过sessionId收发数据或获取其相关基本属性。当前本项目只实现被动接收Session连接的功能,业务可根据自身需要及Session自身属性判断是否接受此Session,如不接受,可以主动拒绝此连接。本项目暂未提供打开Session的相关能力。 占位

参考资料


695856371Web网页设计师②群 | 喜欢本站的朋友可以收藏本站,或者加入我们大家一起来交流技术!

0条评论

Loading...


发表评论

电子邮件地址不会被公开。 必填项已用*标注

自定义皮肤 主体内容背景
打开支付宝扫码付款购买视频教程
遇到问题联系客服QQ:419400980
注册梁钟霖个人博客