2. CoAP 协议基础:CoAP 与 HTTP 对比、CoAP 消息模型、CoAP URI 结构

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 流程如下:

  1. 客户端发送 CON 请求:携带 Message ID,请求资源(如温度值)。
  2. 服务端处理并回复 ACK + 响应:ACK 携带与请求相同的 Message ID,并在 Payload 中返回资源表示。
  3. 若服务端需要更长时间处理:可先回复空 ACK(Separate Response),待处理完成后发送新的 CON 响应。
  4. 重传机制:若客户端未收到 ACK,会以指数退避方式重传 CON 请求(默认最多 4 次)。
低功耗优化提示:对于周期性上报数据的传感器,建议使用 NON 消息发送数据,避免 ACK 交互带来的额外唤醒和功耗。ThingsBoard 的 CoAP 集成默认支持 NON 消息的接收。

下图展示了 CoAP 的两种典型交互模式:

CoAP 消息模型:CON 确认交互 vs NON 非确认交互 CON 确认交互 客户端 服务端 CON GET /temp (MID=0x1a2b) ACK + 2.05 Content (MID=0x1a2b) CON GET /heavy 空 ACK (延迟处理) CON 2.05 Content NON 非确认交互 客户端 服务端 NON POST /data (MID=0x3c4d) NON 2.04 Changed (可选,无重传) NON POST /data NON POST /data NON POST /data

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 接收设备数据。