discovery_service提供了設備的發佈接口。網絡
鴻蒙OS支持的設備多線程
discovery\discovery_service\include\common_info_manager.h中,定義了目前鴻蒙OS支持的設備類型和設備級別,從定義不難看出,目前鴻蒙OS只支持L0和L1的設備。分佈式
這裏要補充一下,因爲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首先調用InitCommonManager,InitCommonManager再調用InitLocalDeviceInfo初始化本地設備信息。本地設備的信息被保存在g_deviceInfo這個全局變量中。接下來,服務啓動函數InitService初始化了兩個全局變量,g_publishModule和g_capabilityData,分別用來存放發佈的模塊和能力描述數據。以後,調用CoapInit函數,CoapInit則會調用NSTACKX_Init,NSTACKX_Init調用CoapInitDiscovery來啓動COAP端口監聽。CoapInitDiscovery的解析詳見潤小云解讀鴻蒙OS系列(三):分佈式軟總線之COAP協議。