4. Sparkplug B主题命名空间
Sparkplug B 的所有通信都建立在 MQTT 主题之上,而主题命名空间就是整套规范的“寻址骨架”。它规定了谁在说话、说的是哪类消息、消息属于哪个边缘节点或设备。理解 spBv1.0 主题格式,是后续理解状态管理、生死消息、命令下发和自动发现的前提。Sparkplug B 的主题不是随意拼接的字符串,而是一个具有固定层级、固定语义、固定约束的结构化地址。
一、核心原理:五段式主题结构
Sparkplug B 的主题命名空间以 spBv1.0 作为固定前缀,其后依次是消息类型、组 ID、边缘节点 ID,以及可选的设备 ID。标准格式如下:
spBv1.0/<消息类型>/<组ID>/<边缘节点ID>[/<设备ID>]
这五段(设备 ID 可选时为四段)各自承担明确语义:
- spBv1.0:命名空间标识,声明该主题遵循 Sparkplug B 1.0 规范,用于与普通 MQTT 主题隔离。
- 消息类型标识符:决定这条消息的语义类别,如 NBIRTH、NDATA、DBIRTH、DDATA、NCMD、DCMD、STATE 等。
- 组 ID(Group ID):逻辑分组,通常代表一个工厂、产线或系统边界,是主题隔离的第一层业务维度。
- 边缘节点 ID(Edge Node ID):代表一个独立的 Sparkplug 边缘节点,通常是网关、PLC 或边缘计算设备。
- 设备 ID(Device ID):可选,代表挂在该边缘节点下的具体物理设备或逻辑设备。
二、消息类型标识符的语义分类
消息类型标识符是主题中最具动态语义的一段。它决定了消息是“出生证明”“实时数据”还是“控制命令”。可以按方向与生命周期分为三类:
| 类别 | 标识符 | 方向 | 语义说明 |
|---|---|---|---|
| 生命周期 | NBIRTH / DBIRTH | 节点→服务端 | 节点或设备上线,声明指标清单与初始值 |
| 生命周期 | NDEATH / DDEATH | 节点→服务端 | 节点或设备离线,触发状态失效 |
| 数据上报 | NDATA / DDATA | 节点→服务端 | 周期性或变化时上报指标数据 |
| 命令下发 | NCMD / DCMD | 服务端→节点 | 向节点或设备写入指标、执行动作 |
| 状态 | STATE | 双向 | 主机应用状态,主题中不含组 ID 与节点 ID |
注意 STATE 是特例,它的主题格式为 spBv1.0/STATE/<主机ID>,不遵循常规五段结构,用于表达主应用(如 SCADA 或 MQTT 服务端)的在线状态。
三、ID 的语义与约束
组 ID、边缘节点 ID、设备 ID 三者共同构成寻址路径,但它们的约束并不相同:
- 组 ID:同一 MQTT 服务端下可存在多个组,组之间主题天然隔离。组 ID 应保持稳定,变更组 ID 等同于迁移整个命名空间。
- 边缘节点 ID:在组内必须唯一。它标识一个 MQTT 客户端会话,一个边缘节点对应一个持久会话。
- 设备 ID:在边缘节点内必须唯一,跨节点可重复。设备 ID 只在 DBIRTH、DDATA、DDEATH、DCMD 中出现。
/、加号 +、井号 # 以及 MQTT 主题通配符字符。使用空格、中文或特殊符号虽然部分 Broker 可接受,但会破坏跨平台互操作性,应统一采用字母、数字、下划线和短横线。
四、案例场景:一条产线的主题映射
假设某工厂有两条产线,分别用组 ID LineA 和 LineB 表示。LineA 下有一台边缘网关 GW01,网关下挂三台设备:Robot01、Robot02、Welder01。则典型主题如下:
spBv1.0/NBIRTH/LineA/GW01
spBv1.0/NDATA/LineA/GW01
spBv1.0/DBIRTH/LineA/GW01/Robot01
spBv1.0/DDATA/LineA/GW01/Robot01
spBv1.0/DCMD/LineA/GW01/Robot01
spBv1.0/NDEATH/LineA/GW01
服务端若只关心 LineA 全部数据,可订阅 spBv1.0/NDATA/LineA/# 与 spBv1.0/DDATA/LineA/#;若只关心 Robot01,则订阅 spBv1.0/+/LineA/GW01/Robot01。通配符的使用必须严格对齐层级,否则会误匹配到其他组或其他节点。
五、误区与复盘
在实际工程中,主题命名空间最常见的错误集中在三点:
- 把设备 ID 当成必填项:NBIRTH、NDATA、NDEATH、NCMD 属于节点级消息,主题中不应出现设备 ID;只有 DBIRTH、DDATA、DDEATH、DCMD 才带设备 ID。混用会导致订阅方解析层级错位。
- 组 ID 与节点 ID 语义混淆:有人把设备名直接放进组 ID 位置,导致一个设备一个组,破坏了“组—节点—设备”的层级聚合能力,后续无法按产线批量订阅。
- 忽略 STATE 的特殊格式:STATE 主题不含组 ID 和节点 ID,若按常规五段去解析,会得到错误的主机标识。
掌握主题命名空间后,就能准确回答“这条消息从哪来、属于谁、是什么类型”三个问题。它是 Sparkplug B 数据模型的地基,也是后续理解指标、别名、序列号和状态机的前提。