2. CoAP协议基础
CoAP(Constrained Application Protocol,受限应用协议)是 IETF 为物联网场景设计的轻量级应用层协议,运行于 UDP 之上。它本质上是将 HTTP 的 RESTful 语义映射到低功耗、低带宽的受限网络中。理解 CoAP 与 HTTP 的差异、消息模型及 URI 结构,是后续在 ThingsBoard 中配置设备接入与优化功耗的前提。
2.1 CoAP 与 HTTP 核心对比
CoAP 并非 HTTP 的替代品,而是其“受限网络适配版”。下表从协议栈、传输方式、消息格式、可靠性机制等维度进行对比:
| 对比维度 | HTTP | CoAP |
|---|---|---|
| 传输层 | TCP(面向连接,可靠有序) | UDP(无连接,尽力交付) |
| 消息格式 | 文本(ASCII/UTF-8),头部较大 | 二进制(4 字节固定头部 + 选项),极简 |
| 可靠性 | TCP 内置重传与确认 | 应用层 CON/NON 机制(可选确认) |
| 请求/响应模型 | 严格 Request/Response,同步或异步 | Request/Response + 观察者模式(Observe) |
| 方法 | GET / POST / PUT / DELETE / PATCH 等 | GET / POST / PUT / DELETE(与 HTTP 语义对齐) |
| 资源标识 | URI(http://host:port/path?query) | URI(coap://host:port/path?query) |
| 头部开销 | 通常 200~800 字节 | 固定 4 字节,选项压缩 |
| 适用场景 | Web 应用、浏览器、API 网关 | 传感器、执行器、低功耗嵌入式设备 |
关键结论:CoAP 通过二进制编码、UDP 传输、轻量头部和可选确认机制,将单次交互的带宽消耗降低到 HTTP 的 10%~20%,非常适合 ThingsBoard 中电池供电的传感器节点。
2.2 CoAP 消息模型:Request / Response
CoAP 消息模型分为两种类型:确认型(CON,Confirmable)和非确认型(NON,Non-confirmable)。CON 消息要求接收方回复 ACK(确认)或 RST(复位),NON 消息则无需确认。响应消息同样可以携带 CON 或 NON 标记。
典型的 CoAP Request/Response 流程如下:
- 客户端发送 CON 请求:携带 Message ID,请求资源(如温度值)。
- 服务端处理并回复 ACK + 响应:ACK 携带与请求相同的 Message ID,并在 Payload 中返回资源表示。
- 若服务端需要更长时间处理:可先回复空 ACK(Separate Response),待处理完成后发送新的 CON 响应。
- 重传机制:若客户端未收到 ACK,会以指数退避方式重传 CON 请求(默认最多 4 次)。
低功耗优化提示:对于周期性上报数据的传感器,建议使用 NON 消息发送数据,避免 ACK 交互带来的额外唤醒和功耗。ThingsBoard 的 CoAP 集成默认支持 NON 消息的接收。
下图展示了 CoAP 的两种典型交互模式:
2.3 CoAP URI 结构
CoAP 的 URI 结构与 HTTP 高度相似,但使用 coap:// 或 coaps://(DTLS 加密)作为 scheme。标准格式如下:
coap://[host]:[port]/[path]?[query]
coaps://[host]:[port]/[path]?[query]
各组成部分说明:
| 组件 | 示例 | 说明 |
|---|---|---|
| scheme | coap:// |
协议标识,coap 为明文,coaps 为 DTLS 加密 |
| host | thingsboard.cloud 或 192.168.1.100 |
服务端域名或 IPv4/IPv6 地址 |
| port | 5683(默认) |
CoAP 默认端口 5683,coaps 默认 5684 |
| path | /api/v1/DEVICE_TOKEN/telemetry |
资源路径,ThingsBoard 使用固定路径模板 |
| query | ?key=temp&value=25.5 |
查询参数,用于过滤或附加数据 |
ThingsBoard 路径约定:设备接入时,CoAP URI 必须遵循 ThingsBoard 的固定模板:
coap://[host]:5683/api/v1/[DEVICE_TOKEN]/[method]。其中 [method] 可选 telemetry(遥测)、attributes(属性)、rpc(RPC 命令)。DEVICE_TOKEN 是设备接入凭证,不可泄露。
以下是一个完整的 CoAP 请求示例,用于向 ThingsBoard 上报温度数据:
请求行:
coap://demo.thingsboard.io:5683/api/v1/ABC123DEF456/telemetry
方法:POST
Payload(JSON 格式):
{"temperature": 25.5, "humidity": 60.2}
消息类型:NON(非确认型,适合周期性上报)
2.4 小结
- CoAP 与 HTTP 的核心差异在于传输层(UDP vs TCP)、消息格式(二进制 vs 文本)和可靠性机制(可选确认 vs 强制确认)。
- CON 消息提供可靠传输,适合控制指令;NON 消息减少交互开销,适合高频传感器数据上报。
- CoAP URI 遵循
coap://host:port/path?query结构,ThingsBoard 使用固定路径模板/api/v1/DEVICE_TOKEN/telemetry接收设备数据。