潤小云解讀鴻蒙OS系列(三):分佈式軟總線之COAP協議

COAPConstrained Application Protocol )協議由RFC7252定義,是用於受限設備和網絡的傳輸協議。受限的意思是指設備內存較小,網絡傳輸速率較低,而且丟包率比較高。所以,COAP協議主要用於設備到設備(M2M)通信。鴻蒙OSCOAP協議用於分佈式通信中的主從設備發現。服務器

COAP協議的具體說明,這裏不詳細解釋,能夠參考RFC7252的詳細說明或者網上的相關說明。網絡

 

  • COAP包的格式和解析函數

COAP協議的消息RFC7252定義以下:多線程

discovery/coap/include/coap_def.h,經過結構體COAP_Header定義了該協議頭以下:異步

結構體COAP_Packet則描述了一個完整的COAP包:socket

其中enum COAP_ProtocolTypeEnum protocol定義了COAP包用於傳輸的協議類型,缺省的狀況下,COAP是基於UDP協議傳輸。分佈式

對照COAP協議的消息定義和COAP_Packet結構體,不難看出二者的定義是一一對應的。函數

關於COAP_BufferCOAP_Option的定義以下,其中COAP_Buffer很是容易理解,就是len長度的字符串buffer編碼

對於COAP_Option,能夠參考RFC7252中的定義,這裏就不贅述了。spa

discovery/coap/include/coap_adapter.h中定義了對COAP協議的編碼和解碼的函數,線程

         coap_adapter.c中實現了上述函數,其中COAP_SoftBusInitMsgId函數把全局變量g_msgId初始化爲常量RAND_DIVISOR,做爲COAP協議中的Message ID

 

  • COAP包的傳輸

COAP協議和TCP協議相似,也是存在服務器端和客戶端,服務器端負責啓動COAP包的監聽服務,discovery/coap/include/coap_socket.h提供了COAP包的發送和接收服務函數。

COAP服務端在5684端口提供監聽COAP包的服務,CoapInitSocket函數實現了初始化端口的功能。

         CoapInitSocket經過調用CoapCreateUdpServer,而CoapCreateUdpServer經過調用bind系統函數建立了監聽端口。

 

  • 基於COAP的設備發現協議

discovery/coap/source/coap_discover.c實現了基於COAP的設備發現功能。CoapInitDiscovery函數經過調用CoapInitSocket啓動監聽端口,以後經過調用CreateCoapListenThread建立監聽線程。注意,只有在L1的鴻蒙OS上才實現了多線程,所以這裏加入了條件編譯。

CreateCoapListenThread經過調用select實現了異步通信,在端口監聽到包是經過HandleReadEvent函數來處理。

         HandleReadEvent經過調用CoapSocketRecv來讀取socket的內容,而後調用COAP_SoftBusDecode來解碼。

         解碼後的報文交由PostServiceDiscover來處理。對於報文的處理,涉及到具體的報文解析,將在後續解讀。

相關文章
相關標籤/搜索