- 简介
Discovery 是一种基于coap 通讯协议的设备发现机制;Coap(Constrained Application Protocol)是一种可使用在资源受限的物联网设备上,并支持可靠传输的轻量化类web协议。它详细规范定义在 RFC 7252, coap 协议支持IP多播, 便可以同时向多个设备发送请求,鸿蒙OS的设备发现功能也是基于这个特性;用户使用discovery功能时,须要保证发现端设备与被发现端设备在同一个局域网内,而且都能收到对方coap协议报文;目前discovery服务仅支持基于Wi-Fi通讯方式的设备发现机制。web
- 代码分析
代码目录结构以下图:socket
Discovery 对外提供PublishService() 接口来实现设备的发现功能,其函数实现解读以下:函数
PublishService主要的代码流程图以下,因为篇幅有限咱们本次不作详细的介绍。spa
被发现端主要是经过PublishService()这个函数发布服务。PublishService()函数的实如今discovery_service.c文件中,咱们来看看这个函数的主流程代码;线程
函数参数三个:3d
moduleName:调用者的模块名称code
info:PublishInfo结构体,发布的信息server
cb:发布成功或者失败的回调函数blog
在函数实现中,咱们能够看到权限检查,参数检验,信号量建立之类等代码;这里就不作介绍;咱们从初始化服务 InitService()函数看,接口
InitCommonManager() 函数主要是调用InitLocalDeviceInfo()给g_deviceInfo结构体初始化;
RegisterWifiCallback(WifiEventTrigger)函数将WifiEventTrigger(unsigned int para)函数赋值给全局变量g_wifiCallback
最主要看CoapInit()函数
这里面咱们优先分析下CoapInitSocket() 和 CreateCoapListenThread()
CoapInitSocket()函数实现以下:
能够看到CoapInitSocket()函数里面其实就是调用了socket()函数建立了socket,而后调用bind()绑定到指定的ip跟port,而后将socket描述符赋值给全局变量g_serverFd。以便后面GetCoapServerSocket()函数调用获取socket描述符。
CreateCoapListenThread() 建立线程接收消息,函数实现以下;
CoapReadHandle 接收并处理收到的消息
HandleReadEvent函数实现以下,咱们分别看看CoapSocketRecv()、COAP_SoftBusDecode()、PostServiceDiscover()函数;
CoapSocketRecv()实现就是调用recvfrom()接收消息。
收到消息放到recvBuffer里面 而后调用COAP_SoftBusDecode()解码收到的消息。解码以后放到decodePacket里面而后调用PostServiceDiscover()函数对接收到的消息进行回应。
PostServiceDiscover()函数代码以下:
其中GetServiceDiscoverInfo(),这个函数能够获取到对端的ip 和remoteUrl。
这里能够获取到设备信息,也就是deviceInfo 结构体成员以下:
获取到这些信息以后咱们就能够调用CoapResponseService()函数回复消息了。这里就看看主要的回复消息流程,其余的流程有兴趣能够本身继续钻研。
调用socket()建立socket 并将socket描述符返回跟全局变量g_clientFd,以便后面函数GetCoapClientSocket()获取socket描述符。
调用sendto发送消息。
此文档只是介绍了收发消息的主要流程,其余的细节这里并无详细介绍。感兴趣的同窗能够根据这个主流程继续钻研下其余的功能实现。