COAP(Constrained Application Protocol )協議由RFC7252定義,是用於受限設備和網絡的傳輸協議。受限的意思是指設備內存較小,網絡傳輸速率較低,而且丟包率比較高。所以,COAP協議主要用於設備到設備(M2M)通信。鴻蒙OS將COAP協議用於分佈式通信中的主從設備發現。服務器
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_Buffer和COAP_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來處理。對於報文的處理,涉及到具體的報文解析,將在後續解讀。