潤小云解讀鴻蒙OS系列(五):分佈式軟總線之discovery_service

discovery_service提供了設備的發佈接口。網絡

 

鴻蒙OS支持的設備多線程

discovery\discovery_service\include\common_info_manager.h中,定義了目前鴻蒙OS支持的設備類型和設備級別,從定義不難看出,目前鴻蒙OS只支持L0L1的設備。分佈式

 

這裏要補充一下,因爲L0的設備不支持多線程而且只支持輕量級的TCP/IP協議,所以在涉及多線程和網絡通訊的代碼,多會看到以下的條件編譯語句:函數

上述條件編譯表示其中到代碼是專門爲L0設備提供的。spa

上述條件編譯表示其中代碼是專門爲L1設備提供。.net

 

用戶使用發現功能時,須要保證發現端設備與被發現端設備在同一個局域網內,而且互相能收到對方如下流程的報文。線程

1)發現端設備,發起discover請求後,使用coap協議在局域網內發送廣播。3d

2)被發現端設備使用PublishService接口發佈服務,接收端收到廣播後,發送coap協議單播給發現端。blog

3)發現端設備收到報文會更新設備信息。接口

 

下面是設備的定義,分爲本地設備(被發現端設備)和外部設備,從中不難看出鴻蒙OS的分佈式特性,本地設備能夠經過PublishService函數將自身的服務發佈出去,供外部設備發現並使用。鴻蒙OS的設備發現機制是被發現設備在COAP端口監聽來自發現設備的廣播包,這也符合按需使用的原則。

 

PublishService的啓動過程

被發現端設備經過調用PublishService向外部發佈設備的能力,接口使用示例以下:

 

咱們分2段來看PublishService這個函數。

PublishService首先將檢查是否有發佈權限以及檢查了一些發佈參數的合法性,其次確認發佈協議是否是COAP

而後,考慮到被發現端上可能有多個設備對外部發布服務,所以建立了一個信號量g_serviceSemId來防止衝突。進入信號量以後,

主要調用InitService函數來啓動服務,並將模塊註冊到全局變量g_publishModule中,服務註冊到g_capabilityData中。

下面咱們來看一下服務啓動函數InitService,由於InitService可能被多個設備所調用,所以經過全局變量g_isServiceInit來確認服務是否啓動,若是其餘設備以及啓動則直接略過。若是沒有,則須要作不少初始化工做。

 

服務啓動函數InitService首先調用InitCommonManagerInitCommonManager再調用InitLocalDeviceInfo初始化本地設備信息。本地設備的信息被保存在g_deviceInfo這個全局變量中。接下來,服務啓動函數InitService初始化了兩個全局變量,g_publishModuleg_capabilityData,分別用來存放發佈的模塊和能力描述數據。以後,調用CoapInit函數,CoapInit則會調用NSTACKX_InitNSTACKX_Init調用CoapInitDiscovery來啓動COAP端口監聽。CoapInitDiscovery的解析詳見潤小云解讀鴻蒙OS系列(三):分佈式軟總線之COAP協議

相關文章
相關標籤/搜索