定义
CoAP(Constrained Application Protocol)是 IETF 制定的轻量级应用层协议,基于 UDP,采用 RESTful 风格,适用于 NB-IoT、LPWAN 等受限设备。NB-IoT 网关常支持 CoAP、MQTT、HTTP 多种上行协议,满足不同平台对接需求。
协议特性
CoAP 采用请求/响应模型,支持 GET、POST、PUT、DELETE 方法,与 HTTP 语义对应,便于与 Web 服务集成。报文头最小 4 字节,支持无连接(UDP)与可选可靠传输(CON 消息 + 重传)。观察(Observe)机制可实现类似 MQTT 的订阅推送。CoAP 可与 DTLS 结合实现安全传输,支持 NoSec、PreSharedKey、RawPublicKey、Certificate 四种安全模式。资源发现通过 /.well-known/core 实现,支持 Link 格式描述资源。
与 MQTT 对比
CoAP 基于 UDP,无连接建立开销,适合 NB-IoT、LoRa 等低功耗场景;MQTT 基于 TCP,需维持长连接。CoAP 采用 RESTful 资源模型,与 HTTP 兼容;MQTT 采用主题发布/订阅。CoAP 适合请求/响应型、资源有限的设备;MQTT 适合多对多消息分发、需 QoS 保证的场景。NB-IoT 平台常同时支持 CoAP 与 MQTT,按业务选择。CoAP over TCP(RFC 8323)扩展了 CoAP 在 TCP 上的应用。
物联网应用
NB-IoT 设备可通过 CoAP 将传感器数据上报至物联网平台,平台以 CoAP 或 HTTP 响应。LwM2M 设备管理协议基于 CoAP,实现固件升级、配置下发、远程诊断。智能表计、环境监测、农业传感器等低功耗设备常用 CoAP 作为应用层协议。网关可将 CoAP 转换为 MQTT、HTTP 等,实现协议适配与平台对接。
确认报文与观察订阅
受限应用协议把资源当成可寻址的路径,GET、PUT、POST、DELETE 只说明动作,可靠与否由报文类型决定。确认报文要求对端返回复位应答,发出后要按指数退避重传;非确认报文发完即忘,适合允许丢失的周期采样。观察机制是在 GET 上登记兴趣,资源变化时服务器主动发通知,它不是长连接,中间任何一个通知都可以选择确认或不确认。令牌用来配对请求和应答,消息编号用来检测重传,两者不要混成同一个计数器。服务器重启后观察关系消失,客户端若只记着旧令牌,会一直等通知。
使用条件是路径两端对资源地址、内容格式和块大小有约定。低功耗终端的接收窗口很短,服务器若在窗口之外回包,确认报文会重传到放弃,业务层却可能已经成功。块传输适合固件或长日志,每一块都有编号和结束标志,缺一块不能拼成完整对象。DTLS 会话建立的往返比业务报文更贵,预共享密钥适合批量相同的表计,证书模式要考虑终端能否存下链和完成握手。没有安全需求时也要在网络侧限制谁可以写资源,不能因为报文短就省略访问控制。
受限链路上的重传边界
最常见的错误是把确认重传调得比空口调度还密。窄带网络的应答经常晚于默认初始超时,客户端连续重发,服务器对每一份都执行 PUT,执行器被重复动作。初始超时和最大重传次数应按实测往返来设,写操作最好设计成幂等,用序号或目标状态而不是“再开一次”。另一类错误是观察通知没有节流,温度抖动让服务器每个采样都推送,空口被反向占满,电池曲线和“已省电”的设计相反。
NAT 或运营商网关会丢掉长时间没有报文的 UDP 映射。客户端以为观察仍在,服务器通知发到旧端口。需要下行时,应让终端周期性发一个很短的非确认报文刷新映射,或改由终端来拉。代理把 CoAP 转成 HTTP 时,超时时间若短于终端醒来的间隔,HTTP 客户端会先报失败,稍后的 CoAP 应答变成无处投递。内容格式写错时,数值会被当成纯文本,平台入库成功但单位全无。调试时先看消息编号是否连续、令牌是否成对,再判断业务资源本身。
资源路径和内容格式
同一个数值换了内容格式,服务器仍可能返回成功,客户端按错误的格式去解码,温度会变成无法理解的字节。路径末尾多一个斜线、大小写不同,在有的实现里是另一个资源。写操作应带应用层序号,重复的确认重传只执行一次。观察通知要有最小间隔,传感器抖动不能变成每次采样都推送。
代理超时必须长于终端的睡眠间隔,否则网页侧先失败,终端醒来后的应答没有接收者。块传输缺块时要整段作废,不能把缺块位置填零后当作完整固件。安全握手失败应停在失败状态并告警,不能自动退回无保护端口继续上报。资源发现得到的链接只说明服务器声明了什么,不说明现场接线已经正确,仍要用一次真实读数核对单位和量程。
服务器对写请求返回成功,只说明资源被接受,不说明执行器已经走到目标。客户端应再读一次状态资源,读回值与目标不一致就按失败处理,不能把应答码直接当成现场结果。观察关系在服务器重启后消失,客户端要能重新登记,不能一直等旧通知。内容格式和路径写进点表,更换固件后先读发现接口,再决定旧路径是否还在。块传输最后一块要有结束标志,没有结束标志的缓存不得下发。令牌和消息编号分开计数,重传只增加消息编号,不换令牌,否则对端会当成一次新的操作再执行一遍。