0%

CoAP协议的定义

简单来说,CoAP协议主要是用在一些性能、功耗等受到限制的设备节点上
其运行在UDP协议之上,是一个完整的二进制应用层协议
并且其实现参考了HTTP

回到源代码上,在软总线模块里面,CoAP协议被定义在discovery/coap/include/coap_def.h之中

首先是CoAP协议的头部(COAP_Header):

1
2
3
4
5
6
7
8
9
10
typedef struct {
unsigned int ver : 2;
unsigned int type : 2;
unsigned int tokenLen : 4;
unsigned int code : 8;
union {
unsigned short msgLen;
unsigned short msgId;
} varSection;
} COAP_Header;
  • ver为 2 bit大小的无符号整形,代表了CoAP的版本号

  • type为 2 bit大小的无符号整形,代表了CoAP的消息类型,四种类型如下:

    • 需要确认消息 CON
    • 不需要确认消息 NON
    • 确认应答消息 ACK
    • 复位消息 RST

    其最主要实现了两种传输质量,即可靠消息传输 与 不可靠消息传输。

  • tokenLen为 4 bit大小的无符号整形,代表了Token字段的长度

  • code为 8 bit大小的无符号整形,代表了消息的详细类型,如请求(COAP_MethodTypeEnum)和响应的具体类型


紧接着下面是CoAP协议的数据段和设置段的定义:

1
2
3
4
5
6
7
8
9
10
typedef struct {
const unsigned char *buffer;
unsigned int len;
} COAP_Buffer;

typedef struct {
unsigned short num;
const unsigned char *optionBuf;
unsigned int len;
} COAP_Option;

再往下就是CoAP的完整数据包的定义:

1
2
3
4
5
6
7
8
9
typedef struct {
enum COAP_ProtocolTypeEnum protocol;
unsigned int len;
COAP_Header header;
COAP_Buffer token;
unsigned char optionsNum;
COAP_Option options[COAP_MAX_OPTION];
COAP_Buffer payload;
} COAP_Packet;
  • len代表了该报文的长度

  • header指的是上面的CoAP的头部

  • payload指的是该报文的有效负载的数据

  • 另外protocol定义了该报文是基于UDP或是TCP协议进行传输的

1
2
3
4
enum COAP_ProtocolTypeEnum {
COAP_UDP = 0,
COAP_TCP
};

另外CoAP协议参考了HTTP协议,其请求的方法里面就有规定了四种请求方法

  • GET,通常用于获取
  • POST,通常用于提交
  • PUT,通常用于修改
  • DELETE,通常用于删除
1
2
3
4
5
6
enum COAP_MethodTypeEnum {
COAP_METHOD_GET = 1,
COAP_METHOD_POST = 2,
COAP_METHOD_PUT = 3,
COAP_METHOD_DELETE = 4
};