3. Sparkplug 规范概览
Sparkplug 是建立在 MQTT 之上的工业物联网互操作规范,它并不改变 MQTT 的传输机制,而是对主题命名、载荷编码、会话行为和状态语义做出统一约定。理解 Sparkplug,关键要抓住三条主线:A 版与 B 版的演进差异、规范背后的核心设计原则,以及它与“裸用 MQTT”的本质区别。
一、A 版与 B 版:从“能用”到“可互操作”
Sparkplug A 版(1.0)解决了“如何用 MQTT 表达工业设备数据”的问题,定义了基于主题层级和 JSON 载荷的基本模型。B 版(2.2 及 3.0)则在此基础上强化了状态机、出生证明、序列号和命令语义,使不同厂商的 MQTT 客户端与平台能够真正互操作。
| 对比维度 | Sparkplug A(1.0) | Sparkplug B(2.2/3.0) |
|---|---|---|
| 载荷编码 | JSON 为主 | Protocol Buffers 二进制 |
| 主题结构 | 命名空间较宽松 | 严格固定层级 |
| 状态语义 | 无强制状态机 | NDEATH 与 STATE 主题配合 |
| 出生证明 | 可选 | 强制 NBIRTH/DBIRTH |
| 序列号 | 无 | 逐消息递增,可检测丢包 |
| 命令支持 | 较弱 | NCMD/DCMD 完整定义 |
| 互操作性 | 依赖厂商约定 | 规范级互操作 |
B 版最显著的变化是引入 bdSeq 与消息序列号。设备每次上线时递增 bdSeq,平台据此判断设备是否重启;消息序列号则让接收端能够发现丢包或乱序。A 版没有这些机制,平台很难区分“设备离线”和“网络抖动”。
二、核心设计原则
Sparkplug 的设计原则可以概括为“一个模型、两种角色、三类消息、四个状态”。
- 统一信息模型:所有设备数据都抽象为“指标(Metric)”,包含名称、数据类型、时间戳、值和质量码,避免厂商自定义字段导致平台无法解析。
- 角色分离:边缘节点(Edge Node)负责采集与转发,设备(Device)挂在节点之下,形成“节点—设备—指标”三级结构。
- 出生与死亡消息:NBIRTH/DBIRTH 声明“我有什么”,NDEATH 声明“我走了”,平台据此维护设备影子。
- 状态机驱动:平台通过 STATE 主题感知自身在线状态,避免“平台已断线但设备仍在发数据”的盲区。
- 报告与命令分离:数据上报走 N/DATA,控制命令走 NCMD/DCMD,方向清晰,便于权限与审计。
核心口诀:先出生、后数据、死要报、命令回。设备上线先发 NBIRTH,再发 NDATA;离线时由 MQTT 遗嘱消息触发 NDEATH;收到 NCMD 后需回 NCMD 响应。
三、与普通 MQTT 的对比
普通 MQTT 只提供“发布/订阅”的传输能力,主题和载荷完全由应用自定义。Sparkplug 则是在 MQTT 之上加了一层“工业语义层”。
普通 MQTT 主题示例:
factory/line1/temp → 载荷:{"value": 23.5}
Sparkplug B 主题示例:
spBv1.0/FactoryA/NDATA/EdgeNode01
spBv1.0/FactoryA/DDATA/EdgeNode01/Device01
载荷:Protocol Buffers 编码的 Metric 列表
可以看到,Sparkplug 的主题不是随意命名的,而是固定为 spBv1.0/{group_id}/{message_type}/{edge_node_id}[/{device_id}]。这种强约束让任何符合规范的平台都能自动解析,而不需要为每个厂商写适配器。
四、典型场景与常见误区
假设一条产线有 3 台 PLC,通过一个边缘网关接入平台。普通 MQTT 方案下,网关可能把三台 PLC 的数据都发到 line1/data,平台需要解析 JSON 中的设备 ID 才能拆分。Sparkplug B 方案下,网关作为 Edge Node 发 NBIRTH,三台 PLC 作为 Device 分别发 DBIRTH,平台自动建立“节点—设备—指标”树,无需额外配置。
常见误区一:认为用了 Sparkplug 就不需要 MQTT Broker 的遗嘱消息。实际上 NDEATH 正是通过 MQTT 遗嘱机制发布的,Broker 配置错误会导致设备离线无法被感知。
常见误区二:把 A 版和 B 版混用。A 版 JSON 载荷与 B 版 Protobuf 载荷不兼容,平台若同时接入两类设备,需要分别解析。
常见误区三:忽略序列号。B 版消息序列号用于检测丢包,若平台不校验,可能把旧数据当成新数据写入时序库。
复盘来看,Sparkplug 的价值不在于“更快的 MQTT”,而在于“更确定的语义”。它用规范换取了互操作性,用固定主题换取了自动发现,用状态机换取了可靠的设备生命周期管理。对于需要接入多厂商设备的工业物联网平台,B 版几乎是当前最务实的选择。