COAP系列-入门介绍


官网

http://coap.technology/
WiKi
https://en.wikipedia.org/wiki/Constrained_Application_Protocol
开源库
https://github.com/miri64/libcoap

1. COAP 架构

COAP运行于UDP协议之上,架构如下图

COAP 架构图

2. 消息类型

CoAP协议共有4中不同的消息类型。

  • CON——需要被确认的请求,如果CON请求被发送,那么对方必须做出响应。
  • NON——不需要被确认的请求,如果NON请求被发送,那么对方不必做出回应。
  • ACK——应答消息,接受到CON消息的响应。
  • RST——复位消息,当接收者接受到的消息包含一个错误,接收者解析消息或者不再关心发送者发送的内容,那么复位消息将会被发送。

3. COAP 消息格式

  • 一个COAP消息最小为4个字节;
  • CoAP协议总是以“头”的形式出现在负载之前,而负载和CoAP头之间使用单字节0xFF分离;
  • 具体格式如下图
    COAP 消息格式
字段 长度 说明
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 格式

Option 格式图

CoAP中所有的Option都采用编号的方式,这些Option及编号的定义如下图所示
image.png

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主频….的设备

特点总结

  1. 满足资源受限的网络需求。
  2. 无状态HTTP映射,可以通过HTTP代理实现访问CoAP资源,或者在CoAP智商构建HTTP接口。
  3. 使用UDP实现可靠IP单播和最大努力IP多播。
  4. 异步消息交换
  5. 很小的消息头载荷及解析复杂度。
  6. 支持URI和内容类型(Content-type).
  7. 支持代理和缓存.
  8. 内建资源发现.
  9. 可以使用DTLS作为安全加密层。
  10. 资源消耗低,所需RAM和ROM资源均小于10KB。
  11. 其双层(事务层,请求/响应层)处理方式可支持异步通信.
  12. 支持观察模式。
  13. 支持块传输

文章作者: Alex.Lin
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Alex.Lin !
  目录