潤小云解讀鴻蒙OS系列(六):分佈式軟總線之discovery+COAP全流程

 

  • 簡介

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發送消息。

 

此文檔只是介紹了收發消息的主要流程,其餘的細節這裏並無詳細介紹。感興趣的同窗能夠根據這個主流程繼續鑽研下其餘的功能實現。

相關文章
相關標籤/搜索