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}]。这种强约束让任何符合规范的平台都能自动解析,而不需要为每个厂商写适配器。

普通 MQTT 与 Sparkplug B 的层次对比 普通 MQTT:只有传输层 应用自定义主题 factory/line1/temp 自定义载荷格式 JSON / 字符串 / 二进制 无统一状态语义 离线/在线靠 LWT 自行约定 平台需逐厂商适配 互操作性弱 结果:能通,但难管 数据模型不统一 Sparkplug B:传输层 + 语义层 固定主题命名空间 spBv1.0/Group/NDATA/Node Protocol Buffers 载荷 Metric 列表,强类型 出生/死亡/状态机 NBIRTH / NDEATH / STATE 命令与响应闭环 NCMD / DCMD / 回执 结果:即插即用 跨厂商互操作 规范约束 Sparkplug B 不替代 MQTT,而是在 MQTT 之上定义统一的主题、载荷与状态语义

四、典型场景与常见误区

假设一条产线有 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 版几乎是当前最务实的选择。