1.1 什么是 CoAP 协议?
CoAP(Constrained Application Protocol,受限应用协议)是 IETF 为资源受限的物联网设备设计的轻量级 UDP 应用层协议(RFC 7252)。它在 HTTP 请求/响应模型基础上,通过二进制头压缩、慢启动 UDP 重传和资源发现机制,使 MCU、传感器等低算力设备也能接入互联网。
适用边界:CoAP 并非 HTTP 的替代品,而是专为 8‑bit MCU、≤ 256KB RAM、丢包率高的无线网络(如 6LoWPAN、LoRaWAN)场景设计的“结构化 Web 协议”。它天然支持 UDP 多播和资源发现,适合 1:N 设备群通信。
1.1.1 核心特性一览
- UDP 传输 + 可靠性保障:默认基于 UDP,通过 CON(Confirmable)消息与 ACK/RST 握手实现重传保障;非确认消息 NON 用于实时流数据。
- 二进制头部(4 字节基础):头部紧凑,相比 HTTP 文本头部大幅节省带宽。
- RESTful 语义:沿用 GET/POST/PUT/DELETE 方法 + URL 路径,与 Web 开发体系自然衔接。
- 内置资源发现:通过
/.well-known/core路径查询设备支持的资源列表。 - 观察者模式(Observe):客户端订阅资源变化,服务端主动推送更新,避免轮询。
- 块传输(Block):将超过 UDP 报文 MTU 的负载分片传输,支持大负载固件升级。
1.1.2 与 MQTT / HTTP 的对比
| 对比维度 | CoAP | MQTT | HTTP |
|---|---|---|---|
| 传输层 | UDP(可协商 DTLS) | TCP(可加 TLS) | TCP(可加 TLS) |
| 报文大小 | 4 字节头 + 载荷 | 固定头 2 字节 + 可变头 | 文本头 > 100 字节 |
| 通信模式 | 请求/响应 + 观察者 | 发布/订阅(Broker) | 请求/响应 |
| 资源发现 | 内建 (/.well-known/core) | 需 Broker 或扩展 | 需额外描述(如 OpenAPI) |
| 可靠性 | CON + 重传 / NON | QoS 0/1/2 | TCP 保底 + 状态码 |
| 多播支持 | 原生 UDP 多播 | 不支持 | 不支持 |
| 适用设备 | MCU、传感器、低功耗节点 | 网关、移动端、边缘服务器 | PC、服务器、浏览器 |
1.1.3 典型适用场景
- 智能楼宇传感器网络:温度、湿度、光照等节点通过 6LoWPAN 或 LoRaWAN 接入,CoAP 提供资源描述 + 多播查询,同一网络中数百节点可同时上报。
- 工业现场瞬时控制:对实时性要求高的开关量(如电磁阀动作),使用 NON 消息减少确认延时;固件升级时通过块传输分批推送。
- 农业物联网:电池供电的土壤传感器每隔 5 分钟上传数据,CoAP 的观察者订阅模式让网关只推送变化值,节省能耗。
- 智慧路灯:路灯控制器支持 CoAP 资源发现;运维平台通过
GET /lights/strip1获取状态,通过PUT /lights/strip1/level调节亮度。
1.1.4 设备接入流程拆解(最小可行)
- 资源建模:将设备功能抽象为 URL 路径 + 方法语义。例如温度传感器在设备上暴露
/temp资源,对外提供 GET 操作。 - 服务端启动:在 MCU 上嵌入 CoAP 栈(如 coap‑thon、CoAP.NET、libcoap),绑定 UDP 端口 5683(普通)或 5684(DTLS 加密)。
- 客户端发现:客户端(网关或云端)向设备发送 GET 请求
/.well-known/core,设备返回可用资源列表,如</temp>;rt="temperature"。 - 数据交互:客户端使用对应的 REST 方法读取或写入资源;若开启 Observe,客户端在请求中携带
Observe:0选项,设备在资源变化时自动推送响应。 - 安全防护:对敏感设备启用 DTLS;在非受信网络中搭配预共享密钥或证书。
实践清单(本章核心):
1. 确认设备 MCU 能否运行 UDP 协议栈(6LoWPAN、LoRaWAN、NB‑IoT 底层均支持 UDP)。
2. 明确设备的数据模型:哪些值需要远程读/写/订阅。
3. 选择 CoAP 实现库:嵌入式 C 推荐 libcoap,Python 原型推荐 CoAPthon3。
4. 测试环境中使用
5. 对比同一场景下的 MQTT/HTTP 带宽与内存开销,确认 CoAP 的削峰效果。
1. 确认设备 MCU 能否运行 UDP 协议栈(6LoWPAN、LoRaWAN、NB‑IoT 底层均支持 UDP)。
2. 明确设备的数据模型:哪些值需要远程读/写/订阅。
3. 选择 CoAP 实现库:嵌入式 C 推荐 libcoap,Python 原型推荐 CoAPthon3。
4. 测试环境中使用
coap-client 工具(libcoap 命令行)进行资源发现和请求调试。5. 对比同一场景下的 MQTT/HTTP 带宽与内存开销,确认 CoAP 的削峰效果。
选型陷阱提醒:CoAP 虽然轻量,但不适用于以下场合:需要长连接双向推送(MQTT 更优),需要完整文本书记录(HTTP 更优),设备内存小于 4KB 且没有 UDP 硬件加速(Bare‑Metal 蓝牙广播更合适)。请在项目初期根据节点数、报文大小、网络频率、功耗预算双向评估。