【IoT】基于NB-IoT的CoAP协议浅析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liwei16611/article/details/82700365

CoAP(Constrained Application Protocol) 协议是 IETF 提出的一种面向网络的协议,采用了与 HTTP 类似的特征,核心内容为资源抽象、REST 式交互以及可扩展的头选项等。为了克服 HTTP 对于受限环境的劣势,CoAP 既考虑到数据报长度的最优化,又考虑到提供可靠通信。

CoAP协议具有以下特点:

1)消息模型,以消息为数据通信载体,通过交换网络消息来实现设备间数据通信;

2)对云端设备资源操作都是通过请求与响应机制来完成,类似 HTTP,设备端可通过4个请求方法(GET, PUT, POST, DELETE)对服务器端资源进行操作;

3)协议包轻量级,最小长度仅为 4B

4)支持可靠传输,通过确认和数据重传确保数据可靠到达;

5)支持IP多播, 即可以同时向多个设备发送请求;

6)非长连接通信,适用于低功耗物联网场景。

1、CoAp 协议栈

CoAP 协议栈如图下图所示,CoAP 由 UDP 作为承载,遵循 UDP 基本的协议报文格式,UDP 数据内容部分按照 CoAP 协议报文格式进行写入传输。

1.1、 CoAP 资源请求/响应模型

Requests:请求方法与 HTTP 协议类似,分别为: GET, PUT, POST DELETE

Responses:响应内容也与HTTP协议类似,主要有以下3类:

1Success 2.xx 代表客户端请求被成功接收并被成功处理;

2Client Error 4.xx 代表客户端请求有错误,比如参数错误等;

3Server Error 5.xx 代表服务器在执行客户端请求时出错。

1.2、 CoAP 消息报文定义

如下图所示为 CoAP 消息报文示意图,CoAP 消息报文是通过在 UDP 上传输消息完成,各部分说明如下:

 

  1. CoAP消息报文头部(Header)

头部固定为4个Bytes,包含版本号(Ver)、报文类型(T)、CoAP标识符长度(TKL)、功能码/响应码(Code)以及报文编号(Message ID)。各部分说明如下:

Ver版本号占2位,取值为01B,用于指示CoAP协议的版本号。

T:CoAP协议定了4种不同形式的报文,CON报文,NON报文,ACK报文和RST报文。

TKLCoAP协议中具有两种功能相似的标识符,一种为Message ID(消息编号),一种为Token(标识符)。其中每个报文均包含消息编号,但是标识符对于报文来说是非必须的。

CodeCodeCoAP请求报文和响应报文中具有不同的表现形式,Code占一个字节,它被分成了两部分,前3位一部分,后5位一部分,为了方便描述它被写成了c.dd结构。其中0.XX表示CoAP请求的某种方法,而2.XX4.XX5.XX则表示CoAP响应的某种具体表现。

Message ID:消息编号。

  1. Token(可选)

标识符具体内容,通过TKL指定Token长度。通过token,客户端收到响应后,取出Token,就可以知道该响应是针对之前哪个请求回复的。

3Option(可选,0个或者多个)

请求消息 与回应消息都可以0~多个options 主要用于描述请求或者响应对应的各个属性,类似参数或者特征描述。

41111 1111

CoAP报文和具体负载之间的分隔符。

  1. Payload

实际携带数据内容, 若有携带数据, 前面加payload 标志 OxFF

2、块传输

CoAP 协议的特点是传输的内容小巧精简,但是在某些情况下不得不传输较大的数据。在这种情况下可以使用 CoAP 协议中的选项设定分块传输的大小,服务器和客户端即可完成分片和组装。扩展的块传输协议在 COAP 基础协议上增加了 个 options个 response codes 用于块传输大小协商及控制。当请求消息或者响应消息里面有出息 block1/block2 option时,代表这是块传输通信。需要根据 option block 里面M标识,决定是否继续进行块传输。

2.1、新增option说明

新增加的 个 options 如表7-2所示:

Number

Name

Reference

23

Block2

RFC 7959

27

Block1

RFC 7959

28

Size2

RFC 7959

Option Block2:主要用于服务器端响应时,分块传输, 比如设备端发起资源发现时,由于服务器上资源较多,就要启动分块传输。

Option Block1:主要用于客户端发出请求时,分块传输,比如需要上传一个大的数据包到服务器上。

Option Size2 代表服务器端响应资源总的大小。

Option Block 由三部分组成:

(1)NUM:占用0~3Byte,代表当前块编号,以0开始, 如我们要传10个数据块,则数据块的编号为0~9。

(2)M:占用1bit, 如果设置为1代表还有剩下数据块未传输。如果设置为0,代表数据块都已传输出去。

(3)SZX:占用2bit,取值范围0~6,对应每个block 大小为2(SZX+4),即范围为(16 ~ 1024)Bytes。

7.2.2.2 新增response code说明

新增加的2个response codes如表7-3所示:

Code

Description

Reference

2.31

Continue

RFC 7959

4.08

Request  Entity  Incomplete

RFC 7959

3、安全传输

COAP 使用 DTLS 来做安全传输层,该层运行于 UDP 之上,如下图所示:

 

当前考虑使用 DTLS 时,需要考虑设备终端资源受限情况,有些资源有限设备无法运行 DTLS 安全加密算法。做安全加密,需要根据应用场景需要,对应只上报数据,且数据敏感度不高场景,可以不考虑加入安全层。

 

猜你喜欢

转载自blog.csdn.net/liwei16611/article/details/82700365