官网
http://coap.technology/
WiKi
https://en.wikipedia.org/wiki/Constrained_Application_Protocol
开源库
https://github.com/miri64/libcoap
1. COAP 架构
COAP运行于UDP协议之上,架构如下图
2. 消息类型
CoAP协议共有4中不同的消息类型。
- CON——需要被确认的请求,如果CON请求被发送,那么对方必须做出响应。
- NON——不需要被确认的请求,如果NON请求被发送,那么对方不必做出回应。
- ACK——应答消息,接受到CON消息的响应。
- RST——复位消息,当接收者接受到的消息包含一个错误,接收者解析消息或者不再关心发送者发送的内容,那么复位消息将会被发送。
3. COAP 消息格式
- 一个COAP消息最小为4个字节;
- CoAP协议总是以“头”的形式出现在负载之前,而负载和CoAP头之间使用单字节0xFF分离;
- 具体格式如下图
字段 | 长度 | 说明 |
---|---|---|
ver | 2bit | 版本号 |
Type | 2bit | 消息类型:CON/NON/ACK/RST |
TKL(TokenLength) | 4bit | 标识符长度CoAP协议中具有两种功能相似的标识符,一种为MessageID(报文编号),一种为Token(标识符)。其中每个报文均包含消息编号,但是标识符对于报文来说是非必须的 |
Code | 8bit | 功能码/响应码:前3位一部分,后5位一部分;为了方便描述它被写成了c.dd结构。其中0.XX表示CoAP请求的某种方法,而2.XX、4.XX或5.XX则表示CoAP响应的某种具体表现(具体Code见下面👇)。 |
Message ID | 16bit | 报文编号,用于重复消息检测,匹配消息类型等 |
Token | nBit | 标识符具体内容,通过TKL指定Token长度 |
Option | nBit | 报文选项,通过报文选项可设定CoAP主机,CoAP URI,CoAP请求参数和负载媒体类型等等。 |
3.1 COAP Code 字段
请求字段
- Req:0.xx
响应字段
- Success : 2.xx
- Client Error : 4.xx
- Server Error : 5.xx
3.1.1 请求消息类型
Code码 | 方法 | 解释 |
---|---|---|
0.01 | GET | 用于获得某资源 |
0.02 | POST | 用于创建某资源 |
0.03 | PUT | 用于更新某资源 |
0.04 | DELETE | 用于删除某资源 |
3.1.2 响应消息类型
- Success 2.xx
Code码 | 方法 | 解释 |
---|---|---|
2.01 | Created | 回复POST或者PUT。 |
2.02 | Deleted | 回复DELETE,有些情况下的POST。 |
2.03 | Valid | 表示响应是有效的所以,Response必须带ETag Option。 |
2.04 | Changed | 回复POST和PUT。 |
2.05 | Content | 回复GET。 |
- Client Error 4.xx
Code码 | 解释 |
---|---|
4.00 | Bad Resuest. |
4.01 | Unauthorized |
4.02 | Bad Option |
4.03 | Forbidden |
4.04 | Not Found |
4.05 | Method Not Allowed |
4.06 | Not Acceptable |
4.12 | Precondition Failed |
4.13 | Request Entity Too Large |
4.15 | Unsupported Content-Format |
- Server Error 5.xx
Code码 | 解释 |
---|---|
5.00 | Internal Server Error |
5.01 | Not Implemented |
5.02 | Bad Gateway |
5.03 | Service Unavailable |
5.04 | Gateway Timeout |
5.05 | Proxying Not Supported |
3.2 COAP Option 字段
每个Optoin由以下三部分组成
- OptionDelta : 表示Option的增量,当前的Option的具体编号等于之前所有Option Delta的总和。
- OptionLength : 表示Option Value的具体长度
- OptionValue : 表示Option具体内容
Opton的数据可以跟随多个,每个的格式都一致
例子:
- 第一个Option Delta=11,表示该Option表示Uri-Path(11)
- 第二个Option Delta=1,表示该Option=1+11,表示Content-Format(12)
- 第三个Option Delta=3,表示该Option=3+1+11,表示Uri-Query(15)
CoAP采用这样的方式表示多个Option,而每种Option都可以在HTTP协议中找到对应项。
3.2.1 Option 格式
CoAP中所有的Option都采用编号的方式,这些Option及编号的定义如下图所示
Option之中的各个字段的含义如下:
【Option Delta】
- Option Delta:4-bit无符号整型。值0-12代表option delta。其它3个值作为特殊情况保留:
- 当值为13:有一个8-bit无符号整型(extended)跟随在第一个字节之后,本option的实际delta是这个8-bit值加13。
- 当值为14:有一个16-bit无符号整型(网络字节序)(extended)跟随在第一个字节之后,本option的实际delta是这个16-bit值加269。
- 当值为15:为payload标识符而保留。如果这个字段被设置为值15,但这个字节不是payload标识符,那么必须当作消息格式错误来处理。
【Option Length】
- Option Length:4-bit无符号整数。值0-12代表这个option值的长度,单位是字节。其它3个值是特殊保留的:
- 当值为13:有一个8-bit无符号整型跟随在第一个字节之后,本option的实际长度是这个8-bit值加13。
- 当值为14:一个16-bit无符号整型(网络字节序)跟随在第一个字节之后,本option的实际长度是这个16-bit值加269。
- 当值为15:保留为将来使用。如果这个字段被设置为值15,必须当作消息格式错误来处理。
【Option value】
- Option Value:共option Length个字节。option Value字段的长度和格式取决于具体的option,有可能定义变长的值。
【Option value的格式】
- Empty:长度为0。
- Opaque:一个(用户自定义的)字节序列。
- Uint:一个非负的整数,以网络字节序表现,由option Length字段指定其长度。
option有可能指定字节数的范围。如果有选择的话,发送者应该用尽可能少的字节数表示这个整数,如省略开头为的0的字节。例如,数字0用空的option值来表示(0长度字节序列),数字1用一个单字节表示,MSB first(高位优先)下为0b00000001。接收端必须能够处理0开头的值。
实现注意:在一些高受限的、模板化的实现(比如由硬件实现)下,允许发送者使用固定长度的option。 - String:Unicode字符串,使用UTF-8[RFC3629]编码,使用Net-Unicode格式[RFC5198]。
注意 : 在CoAP协议中,所有使用UTF-8编码的字符串可以不需要经过标准化转换而被直接使用,或者作为用户自定义的字节序列比较,除非该Unicode字符串是从CoAP协议之外的资源中引入的。注意,所有的ASCII(不作为特殊控制字符使用)字符都是合法的UTF-8 Net-Unicode字符串。
4. COAP 观察者模式
当你需要去监控某个传感器例如温度或湿度等。在这种情况下,CoAP客户端并不需要不停的查询CoAP服务器端的数据变化情况。
CoAP客户端可以发送一个观察请求到服务器端。从该时间点开始计算,服务器便会记住客户端的连接信息,一旦温度发生变化,服务器将会把新结果发送给客户端。
如果客户端不在希望获得温度检测结果,那么客户端将会发送一个RST复位请求,此时服务器便会清除与客户端的连接信息。
5. CoAP块传输
CoAP协议的特点是传输的内容小巧精简,但是在某些情况下不得不传输较大的数据。在这种情况下可以使用CoAP协议中的某个选项设定分块传输的大小,那么无论是服务器或客户端可完成分片和组装这两个动作。
COAP 总结
适合运行于小设备
- 小设备:256KB Flash 32KB RAM 20MHz主频….的设备
特点总结
- 满足资源受限的网络需求。
- 无状态HTTP映射,可以通过HTTP代理实现访问CoAP资源,或者在CoAP智商构建HTTP接口。
- 使用UDP实现可靠IP单播和最大努力IP多播。
- 异步消息交换
- 很小的消息头载荷及解析复杂度。
- 支持URI和内容类型(Content-type).
- 支持代理和缓存.
- 内建资源发现.
- 可以使用DTLS作为安全加密层。
- 资源消耗低,所需RAM和ROM资源均小于10KB。
- 其双层(事务层,请求/响应层)处理方式可支持异步通信.
- 支持观察模式。
- 支持块传输