CoAP协议
1 CoAP协议综述
和其他TCP/IP协议簇中的协议一样,CoAP协议总是以头
的形式出现在负载(数据)之前,而负载和CoAP头之间使用单字节0xFF分离。
【ver】版本编号
-
表示CoAP协议的版本号,类似于HTTP1.0/HTTP1.1
-
版本编号占2位
0b01
二进制表示格式01
【T】报文类型,CoAP协议定了4种不同形式的报文
- CON
0b00
——需要被确认的请求,如果CON请求被发送,那么对方必须做出响应。(重要的消息) - NON
0b01
——不需要被确认的请求,如果NON请求被发送,那么对方不必做出回应。(不太重要的消息) - ACK
0b10
——应答消息,接受到CON消息的响应。(回复信息) - RST
0b11
——复位消息,当接收者接受到的消息包含一个错误,接受者解析消息或者不再关心发送者发送的内容,那么复位消息将会被发送。(拒绝信息)
【TKL】Token长度 CoAP标识符长度
- 标识符对于报文来说是非必须的
- Token是用来标记同一个请求和回复的。(确认请求和响应是正确对应的)
- 4-bit无符号整型。表示变长的Token字段(0-8字节)的长度。长度9-15是保留的,不能设置长度为9-15。如果设置了长度为9-15,必须被当作消息格式错误来处理
【Code】列代码
-
8-bit无符号整型。拆分为3-bit的分类信息和5-bit详细信息。
-
写作”c.dd”。c是高3位(Class)3-bit长,从0到7,dd是低5位(Detail)5-bit长,从00到31。
-
信息c可以代表是一个
请求
(0)、一个成功的响应
(2)、一个客户端错误响应
(4)、或者一个服务端错误响应
(5)。 -
000 00000 //前面三位是整数,后面五位表示的是小数
- 对于请求方法,有
GET
,POST
,PUT
,DELETE
+------+--------+-------------+ | Code | Name | bit | +------+--------+-------------+ | 0.01 | GET | [000 00001] | | 0.02 | POST | [000 00010] | | 0.03 | PUT | [000 00011] | | 0.04 | DELETE | [000 00100] | +------+--------+-------------+
- 对于响应消息
+------+------------------------------+-----------------------------+ | Code | Description | bit | +------+------------------------------+-----------------------------+ | 2.01 | Created 资源已创建 | [010 00001] | | 2.02 | Deleted 已删除资源 | [010 00010] | | 2.03 | Valid 资源未更新,执行缓存 | [010 00011] | | 2.04 | Changed 资源已更新 | [010 00100] | | 2.05 | Content 请求已执行 | [010 00101] | | 4.00 | Bad Request 请求错误 服务器无法处理 | [100 00000] | | 4.01 | Unauthorized 客户端无操作权限 | [100 00001] | | 4.02 | Bad Option 请求包含一个或多个错误选项 | [100 00010] | | 4.03 | Forbidden 服务器拒绝请求 | [100 00011] | | 4.04 | Not Found 服务器无法找到地址资源 | [100 00100] | | 4.05 | Method Not Allowed 客户端请求非法 | [100 00101] | | 4.06 | Not Acceptable 请求选项和服务器生成内容选项不一致 | [100 00110] | | 4.12 | Precondition Failed 请求参数不足 | [100 01100] | | 4.13 | Request Entity Too Large | [100 01101] | | 4.15 | Unsupported Content-Format 不支持请求中的类型 | [100 01111] | | 5.00 | Internal Server Error 服务器内部错误 | [101 00000] | | 5.01 | Not Implemented 服务器无法支持请求内容 | [101 00001] | | 5.02 | Bad Gateway | [101 00010] | | 5.03 | Service Unavailable 服务器过载或者维护停机 | [101 00011] | | 5.04 | Gateway Timeout | [101 00100] | | 5.05 | Proxying Not Supported 服务器不支持代理功能 | [101 00101] | +------+------------------------------+------------------------------+
- 对于请求方法,有
【MessageID】报文编号
-
16-bit无符号整型,网络字节序。
-
用于客户端和服务端建立请求和响应报文之间的一一对应关系,起到报文确认的作用。
-
和Token类似,用来联系一个对应的请求和响应
-
一组对应的CoAP请求和CoAP响应使用相同的MessageID,在同一次会话中ID保持不变
-
此次会话结束,ID会被回收再利用
-
MessageID可以弥补UDP传输方式带来的不可靠性
【Token】标签
- 长度由TKL定义,可以是1字节,2字节或者4字节
- 通常用于应用确认
【Options】 选项
- CoAP请求或响应中可以携带一组或多组Options
- 功能类似于HTTP中的请求头
【0xFF】 分隔符
- 类似于HTTP中的请求空行
- 用于分割头部内容和具体数据(负载)
【Payload】 负载
-
真正有用的用于交互的数据
-
支持二进制、文本、XML、JSON、CBOR等
-
常用媒体类型
2 MQTT和CoAP的区别
-
MQTT更开放,数据内容由用户自己决定,CoAP协议有帮助客户理解的标签信息
-
MQTT是长连接,而CoAP是一次单独通信
-
MQTT是多对多,COAP是单对单通信