物联网协议:命令、遥测和状态主题分开设计

所有数据都发到一个主题,接收端很快就会靠猜字段判断用途。

edyang · 2018-01-05

所有数据都发到一个主题,接收端很快就会靠猜字段判断用途。主题规划需要反映业务方向。

本文使用MQTT 3.1.1、HTTP 或 CoAP 的演示设备与消息。设备通信需要同时定义身份、数据语义、时序与失败处理。协议传输确认不自动代表业务动作完成,采样时间也不能简单用服务器收到消息的时刻替代。

1. 从现象推到机制

遥测描述采样事实,命令表达希望设备执行的动作,状态报告设备当前已确认情况。命令号和设备号承担不同身份,响应要关联原命令。主题权限还要限制设备只能发布或订阅属于自身的范围。

物联网协议:命令、遥测和状态主题分开设计的处理、反馈与观察关系

图中的四个节点分别表示设备身份、遥测事实、控制命令、状态反馈。顺着实线检查输入如何变成输出,再沿虚线核对反馈条件。图示表达的是本文讨论的关系,不是实测曲线或现场截图。

2. 最小实现与输入条件

用虚构 sensor-7 定义三类主题和消息版本。时间字段区分设备采样与网关接收,单位直接放在结构约定中。

1
2
3
4
5
demo/device/sensor-7/telemetry
demo/device/sensor-7/command
demo/device/sensor-7/state
command: command_id, desired_state
state: command_id, reported_state, observed_at

在独立代理与虚构设备标识下实验,保留发布端、代理和消费端记录。命令与遥测使用不同主题及权限;网络断开、重复消息和设备重启都要作为正常分支观察。

3. 用对照区分原因

下表列出需要主动改变的条件。预期行为来自机制分析,复现时还需记录运行环境和原始输出,不能将预期当作已经测得的结果。

改变的条件 需要验证的行为
设备收到命令但尚未执行 不能直接把目标状态当真实状态
同设备重复上报采样 需要判断是重传还是新样本
设备订阅另一设备命令 应由主题权限阻止

对照 1:设备收到命令但尚未执行

不能直接把目标状态当真实状态。观察时记录desired 与 reported 字段。把这个条件与基准情形分开,有助于判断变化来自哪一层;若得到相反结果,应先核对前提,再修改实现。

对照 2:同设备重复上报采样

需要判断是重传还是新样本。观察时记录采样身份与序号。把这个条件与基准情形分开,有助于判断变化来自哪一层;若得到相反结果,应先核对前提,再修改实现。

对照 3:设备订阅另一设备命令

应由主题权限阻止。观察时记录代理 ACL 与实际设备身份。把这个条件与基准情形分开,有助于判断变化来自哪一层;若得到相反结果,应先核对前提,再修改实现。

4. 适用条件与取舍

主题名本身不形成认证。代理账号、访问控制与传输保护需要单独配置,消息结构也应有版本演进策略。

一次正常运行只覆盖了这组输入。继续扩展前,应把上面的异常对照保留下来,尤其关注“设备订阅另一设备命令”这一分支。后续方案若改变了图中任意一处依赖,原来的判断就要重新验证,不能仅凭界面相似或返回值相同沿用结论。

同月延伸

参考资料

  1. MQTT 3.1.1 标准
  2. CoAP:RFC 7252