MQTT 设备协议规范(v1.2)

三端唯一契约:嵌入式固件 / Windows GUI / 云端都以此文件为准。 契约变更只能由主代理发起,三端同步更新。modbus-rs 里的旧版已冻结,不再作为依据。 2026-10-01 从 modbus-rs 同步为 v1。

版本注记:v1.2(2026-11-02):新增 firmware_update 升级命令动作(网关 OTA,见第四节)。v1.1(2026-10-02,三端联调修复批)变更记录: - telemetry 精简版键定义收紧:只认 r{N} 键(见第二节),F407/H743 固件统一改发此形状; - status 必备字段定稿 device_id / online / version,上线 retained、遗嘱 offline retained(见第三节); - cmd_ack 键名定稿 message(不是 msg),未知命令回执文案与 ping 回执内容写死(见第四、五节); - 新增第八节 CONNECT 约定(username {tenant}/{device}、password=设备 token、遗嘱); - 第七节实现状态按 2026-10-02 实况刷新。

Windows GUI(产品版)、嵌入式设备、采集器、云端统一讲这一种话。 GUI 不碰工业协议,只经 MQTT 跟设备通信——这是地基。

一、话题命名

v1/tenants/{tenant}/devices/{device}/telemetry   设备 → 云/GUI:遥测数据
v1/tenants/{tenant}/devices/{device}/status       设备 → 云/GUI:在线状态
v1/tenants/{tenant}/devices/{device}/cmd          云/GUI → 设备:下行命令(QoS 1)
v1/tenants/{tenant}/devices/{device}/cmd_ack      设备 → 云/GUI:命令回执

二、telemetry(遥测)

完整版(采集器 / 资源充足的设备):

{
  "customer": "c1",
  "tenant_id": "t1",
  "device_id": "dev001",
  "timestamp": 1759270000000,
  "source": "monitor",
  "points": [
    {"area": "holding", "address": 0, "data_type": "u16", "value": 123, "quality": "good"}
  ]
}

精简版(F407 / H743 等 no_std 嵌入式,手工拼 JSON,v1.1 定稿的唯一精简形状):

{"unit": 1, "v": 3, "r0": 123, "r1": 456}

三、status(状态)

{"device_id": "dev001", "timestamp": 1759270000000, "online": true, "version": "0.3.0"}

四、cmd(下行命令)

{"cmd_id": "c-001", "action": "ping", "params": {}}

五、cmd_ack(命令回执)

{"cmd_id": "c-001", "ok": true, "message": "", "data": {"uptime_s": 3600}}

六、QoS / retained 约定

方向 QoS retained
telemetry 0(量大,丢一两条无妨) 否
status 上线 1 是(GUI 上线即得设备列表)
cmd 1 否
cmd_ack 1 否

七、实现状态(2026-10-02)

八、CONNECT 约定(v1.1 新增)

设备连接 Broker 时:

GUI 用户连接 Broker 时(凭证由云端登录响应下发,见 rest-api.md 第一节):