微控圈（MCU Loop） - CoAP
type: channel
link: https://www.mculoop.com/tag/CoAP/
items: CoAP 通信协议

CoAP 通信协议
type: item
date: 2026-05-23T13:30:00+00:00
description: CoAP（Constrained Application Protocol，受限应用协议）是一种计算机协议，专门用于资源受限的物联网设备，具有轻量级、可靠传输和高效数据交换的特点，适用于资源受限的环境。 由于物联网设备的内存和计算能力有限，传统的 HTTP 协议在这些设备上显得过于庞大和复杂。因此，IETF 的 CoRE 工作组提出了基于 REST 架构的 CoAP 协议（ RFC 7252）。 CoAP 协议有两个不同的层：消息负载和请求/响应层。消息层处理 UDP 和异步消息，而请求/响应层基于请求/响应消息来管理请求/响应交互。CoAP 消息模型是 CoAP 的最低层，处理端点之间的 UDP 交换消息。每个 CoAP 消息都有一个唯一的 ID，这有助于检测消息重复。CoAP 协议使用两种消息：确认消息和不可确认的消息。确认消息是可靠消息，客户端可以使用这种消息确保消息将到达服务器。而不可确认的消息则不需要服务器确认。 协议特点 CoAP 协议网络传输层由 TCP 改为 UDP，以适应资源受限设备的需要。 它基于 REST 架构，这意味着服务器上的资源地址与互联网中的 URL 格式类似。客户端可以使用类似于 HTTP 的 POST、GET、PUT 和 DELETE 方法来访问服务器，这使得对 HTTP 的请求进行了简化。 CoAP 采用二进制格式，相比之下，HTTP 是文本格式，因此 CoAP 更加紧凑，可以减少传输的数据量。 CoAP 协议轻量化，最小长度仅为 4B，相比之下，一个 HTTP 头部可能达到几十个字节。 CoAP 支持可靠传输、数据重传和块传输，确保数据可靠到达。 CoAP 还支持 IP 多播，这意味着可以同时向多个设备发送请求。 CoAP 采用非长连接通信，适用于低功耗物联网场景。这与 TCP 的机制类似，对方必须确认收到消息，以实现可靠的消息传输。 消息类型 CoAP 协议有 4 种消息类型：CON、NON、ACK、RST CON：需要被确认的请求，如果 CON 请求被发送，那么对方必须做出响应。 NON：不需要被确认的请求，如果 NON 请求被发送，那么对方不必做出回应。这适用于消息会重复频繁的发送，丢包不影响正常操作。 ACK：应答消息，对应的是 CON 消息的应答。 RST：复位消息，可靠传输时候接收的消息不认识或错误时，不能回 ACK 消息，必须回 RST 消息。 消息格式 消息头 必备，固定 4 个 byte。 Ver：2 bit，版本信息，当前为 0x01。 T： 2 bit， 消息类型，包括 CON, NON, ACK, RST 这 4 种。 TKL：4 bit，token 长度， 当前支持 0 ~ 8 B 长度，其他长度保留将来扩展用。 Code：8 bit，分成前 3 bit（0 ~ 7）和后 5 bit（0 ~ 31），前 3 bit 代表类型。 0.00 Indicates an Empty message 0.01-0.31 Indicates a request 1.00-1.31 Reserved 2.00-5.31 Indicates a response. 6.00-7.31 Reserved Message ID：16 bit， 代表消息 MID，每个消息都有一个 ID ，重发的消息 MID 不变。在一次会话中 ID 总是保持不变。但在这个会话之后该 ID 会被回收利用。 token 可选，用于将响应与请求匹配。 token 值为 0 到 8 字节的序列。每个请求都带有一个客户端生成的 token, 服务器在任何结果响应中都必须对其进行回应。token 类似消息 ID，用以标记消息的唯一性。token 还是消息安全性的一个设置，使用全 8 字节的随机数，使伪造的报文无法获得验证通过。标记是 ID 的另一种表现。 option 可选，0 个或者多个。请求消息与回应消息都可以有零到多个 options。 主要用于描述请求或者响应对应的各个属性，类似参数或者特征描述，比如是否用到代理服务器，目的主机的端口等。CoAP 选项类似于 HTTP 请求头，它包括 CoAP 消息本身，例如 CoAP 端口号，CoAP 主机和 CoAP 查询字符串等。 payload 可选。实际携带数据内容， 若有， 前面加 payload 标识符 “0xFF”，如果没有 payload 标识符，那么就代表这是一个 0 长度的 payload。如果存在 payload 标识符但其后跟随的是 0 长度的 payload，那么必须当作消息格式错误处理。 请求方法（requests） 0.01 GET 方法——用于获得某资源 0.02 POST 方法——用于创建某资源 0.03 PUT 方法——用于更新某资源…