润小云解读鸿蒙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来处理。对于报文的处理,涉及到具体的报文解析,将在后续解读。

相关文章
相关标签/搜索