跳到主要内容

CoAP 协议

简介

CoAP(Constrained Application Protocol)是一种专为受限环境下的设备(如传感器、执行器等)设计的轻量级通信协议,用于在低带宽、高时延和不稳定的网络中进行通信,是物联网中重要的通信协议。

CoAP 通常位于 OSI 七层模型中的应用层或传输层,取决于具体的实现方式。底层基于 UDP 协议,但为了弥补 UDP 传输的不可靠性,CoAP 定义了带有重传机制的事务处理机制,实现类似 HTTP 协议的请求/响应模型。

为了克服 HTTP 对于受限环境的劣势,CoAP 既考虑到数据报长度的最优化,又考虑到提供可靠通信。相对于使用文本格式的 HTTP 协议,CoAP 采用二进制格式,因此报文更加紧凑,CoAP 报文的最小长度仅仅 4 个字节,而一个 HTTP 的头大小就约有几十个字节。

协议特点

CoAP 协议具有以下特点:

  • 消息模型,以消息为数据通信载体,通过交换网络消息来实现设备间数据通信;
  • 对云端设备资源操作都是通过请求与响应机制来完成,类似 HTTP,设备端可通过 4 个请求方法(GET、PUT、POST、DELETE)对服务器端资源进行操作;
  • 协议包轻量级,采用紧凑的二进制格式,最小长度仅为 4 字节;
  • 支持可靠传输、数据重传、块传输,确保数据可靠到达;
  • 支持 IP 多播, 即可以同时向多个设备发送请求;
  • 非长连接通信,适用于低功耗物联网场景。

协议格式

报文的格式如下所示:

协议字段具体说明:

  • Ver:版本号占 2bit,固定为 01。
  • T:报文类型,占 2bit,CoAP 中有四种报文类型,分别是 CON、NON、ACK 和 Reset 报文。
  • TKL:标签长度指示,占 4bit,用于指示后面的 Token 占几个字节,可以取值为 0000、0001、0010、0100,分别表示没有 Token、Token 占 1 字节、Token 占 2 字节、Token 占 4 字节。
  • Code:占 8bit,其中前 3bit 为 Class 部分,后 5bit 为 Detail 部分,采用 c.dd 形式来描述。在 CoAP 请求报文中表示请求方法,在 CoAP 响应报文中表示响应状态。
  • Messages ID:报文序号,占 2 字节,大端格式,一组对应的 CoAP 请求和响应使用相同的报文序号。
  • Token:标签,长度由 TKL 标签长度指示确定,与是资源的“身份证”,CoAP 有 3 种不同的请求/响应模式,即携带模式、分离模式和非确认模式,Token 在分离模式起重要作用,携带模式可以忽略。
  • Options:选项。
  • 分隔符 0xFF,占1字节。
  • Payload:负载。

请求/响应码

CoAP 中的 Code 字段采用 c.dd 格式来描述请求方法和响应状态,具体说明如下。

Code 值CoAP 请求方法Code 值CoAP 响应状态
0.01GET方法0.00空报文
0.02POST方法2.xx正确响应
0.03PUT方法4.xx表示客户端错误
0.04DELETE方法5.xx表示服务器错误

报文类型

类型描述T 值
CON 报文Confirmable,需要被确认的报文T=00
NON 报文Non-Confirmable,不需要被确认的报文T=01
ACK 报文Acknowledgement,应答报文T=10
Reset 报文复位报文T=11

具体来说:

  • CON:请求必须要接收者发送 ACK 或者 RST 确认,如果发送者规定时间内内有收到 ACK 或者 RST,则会重发。
  • NON:不要求接收者确认。
  • ACK:用于确认 Messages ID 一致的 CON 报文,ACK 的 payload 可能为空(在分离模式)。
  • RST:用于对应无法处理 CON 的报文,Messages ID 需要与 CON 一致,且 payload 一定为空。

CoAP 方法

方法描述
GET查询资源
POST要求请求中的资源描述内容被服务器处理,比如创建(返回 2.01 create)、修改(返回 2.04 changed)、删除(返回 2.02 delete)
PUT要求服务器根据请求中的URI和payload更新服务器指定资源,比如创建(返回 2.01 create)、修改(返回 2.04 changed)
DELETE要求根据请求中的 URI 删除服务器指定资源内容,返回删除(返回 2.02 delete)

工作流程

携带模式

ACK 的 payload 部分包含响应负载,最少 2 个报文就可得到数据。

分离模式

客户端同样发送 CON 请求,服务器立即回复 ACK,但是 ACK 中没有 payload,而是过段时间后服务器再回应 CON,其中这个 CON 的 Token 要与客户端之前发送 CON 的 Token 一致,该 CON 还包含 payload,客户端收到后用 ACK 回应。至少需要 4 个报文。

非确认模式

这种客户端发送 NON 报文,不需要服务器回应。

小结

CoAP 是一种专为受限环境下的设备设计的轻量级通信协议,具有高效、灵活、可靠的特点。它使得受限设备能够通过简单的 RESTful 接口进行通信,实现了对资源的发现、观察和控制。CoAP 协议的出现大大促进了物联网设备之间的互联互通,推动了物联网技术的发展和应用。