用途
设备通过 HTTPS 调用云平台 REST API 上报 JSON 数据,易与 Web 技术栈集成。间歇上报场景可每次短连接,避免维持 TCP;高频场景可评估 HTTP/2 或改用 MQTT。TLS 证书链与时钟同步是常见故障点。
优化
合并上报、压缩载荷、使用会话复用可降低流量。弱网下设置合理超时与重试退避。
安全
OAuth2、设备证书与双向 TLS 常用于身份;防重放需 nonce 与时间戳。
蜂窝场景下的 API 设计
REST 在物联网中常面临「请求多、头部大、TLS 握手贵」的问题。可通过合并上报、二进制协议(如 CBOR)或 gRPC 网关减轻,但需与现有云平台兼容。幂等键应放在 Header 或路径中,避免 PATCH 语义歧义。分页与游标应稳定,防止弱网重试导致重复拉取。CDN 与边缘缓存对设备 API 通常不适用,需注意源站限流与地域路由。
观测与版本治理
应对每个设备类型记录 HTTP 状态码分布、首字节时延与 TLS 握手失败原因,区分证书问题与运营商劫持。API 版本升级要保留旧版本窗口期,并在模组 OTA 中同步升级。错误体应包含可机器解析的错误码与建议重试间隔,减少客服与现场排障成本。
工程实践补充
针对「HTTP/REST」的跨团队协同:硬件提供阻抗与电源预算,射频提供杂散与灵敏度余量,嵌入式明确线程模型与存储寿命,云端明确 SLA 与限流。对 NB-IoT 等场景,业务模型需与唤醒周期、包长与下行容量匹配;对车载与移动场景,需考虑切换与漫游时的会话保持。项目收尾做一次「红队」式复盘:弱网、掉电、证书过期、时钟跳变与存储写满是否都有定义行为。
无状态请求与蜂窝建连代价
HTTP/REST 把设备与云之间的一次操作看成无状态请求:方法、路径、首部和正文表达意图,服务器不依赖上一条连接里的隐式上下文。幂等的读取和带幂等键的创建可以安全重放,非幂等的扣费、出货则不行。对蜂窝模组,真正贵的往往不是 JSON 正文,而是 DNS、TCP 三次握手和 TLS 握手;间歇上报若每次都新建连接,证书链和首部会比遥测本身更占流量和时间。HTTP/2 的多路复用能摊薄握手,但模组协议栈和中间网关都要支持,不能只在服务器打开。
适合 REST 的条件是交互不频繁、云端已经是 Web 技术栈、单次载荷能在一次请求里传完。需要服务器随时推送、或设备长时间在线收命令时,短连接轮询会把射频唤醒次数放大,应改成长连接协议。使用前还要确认设备时钟能校到证书有效期之内,APN 允许访问相应域名,并且响应体大小受路径 MTU 限制时有分块或压缩方案。
证书时间与重试窗口
时钟停在出厂默认值时,TLS 会因证书“尚未生效”或“已经过期”失败,日志若只写握手失败,现场会去查天线。重试不带退避,弱网下会在 NAT 映射和服务器限流上叠出风暴。把业务主键只放在内存里,掉电重传会再 POST 一次出货或扣款。只认 HTTP 200、不解析业务错误码,通道成功但订单被拒绝时设备仍显示已上报。证书链缺少中间证书时,浏览器能补全,嵌入式 TLS 栈不能。
域名解析异常要和蜂窝 DNS分开排查;长连接被中间设备回收时,对照NAT 与私网的超时,而不是把心跳间隔抄局域网的默认值。错误响应应给出可解析的错误码和建议的下次重试时间,模组按这个时间休眠,避免固定每秒重试。
把一次上报设计成可以安全重放:服务器以订单号或消息号识别重复,设备在收到明确成功之前把正文留在本地。超时后先查状态再决定是否重发,而不是无条件再 POST。请求体里避免塞进与本次业务无关的大字段,头部能省则省,蜂窝上每个字节都占用射频时间。压缩要和服务器约定算法,只在一端打开会解不开。证书轮换要有重叠期,旧证书尚未过期时新证书已经下发,避免一整批设备在同一天握手失败。排障时分开看域名是否解析、握手停在哪一步、业务码是什么,三者对应不同的责任界面。
为每类设备记录状态码分布和握手失败原因,证书问题与服务器拒绝不要记成同一种网络错误。接口升级保留旧路径一段时间,模组固件和服务器同时切换。重试间隔由服务器在错误体里给出,设备照此休眠。正文使用双方约定的编码,未声明压缩时不要发送压缩字节。
短连接场景把域名解析缓存的有效期写清楚,解析失败不要当成射频故障反复重启模组。大响应体分段读取,避免一次分配超过模组内存后把连接重置,表面却像服务器主动断开。