Sparkplug B 节点
存在像 node-red-contrib-sparkplug-b 或 node-red-contrib-mqtt-sparkplug-plus 这样的节点集。它们在同一个 MQTT 代理上运行,但会自动处理 Sparkplug B 规范(spBv1.0/... 主题 + protobuf 负载 + birth/death 序列)。
网关已经将 Sparkplug B 发送 作为自己的组件实现(参考 advanced/sparkplug),但在 Node-RED 中,您可以用它来创建 接收/监控 或 模拟外部设备 的功能。
2026.05+ 版本的 broker 连接信息
- Broker:
127.0.0.1:1883(HiveMQ,位于同一容器内) - Username / Password:
app.properties中的mqtt.server.user/mqtt.server.password— 生产版本的盒子由 install.sh 为每个盒子随机生成(在/etc/kopens/credentials.txt中查看)。 HiveMQauth.properties的入口脚本会在每次启动时自动与 app.properties 同步。 - Group ID / Edge Node ID:留空则自动使用
edge.site_id/edge.id(例如:SITE_00001/EDGE_00303) - 兼容 Sparkplug 3.0.0 规范(NBIRTH seq=0,DDEATH/NDEATH bdSeq,Properties,alias 选项)
1. 核心概念
| 术语 | 含义 |
|---|---|
| Group ID | 分组(例如:Plant1) |
| Edge Node ID | 单个网关/设备的标识符 |
| Device ID | 其下的单个设备 — 可选 |
| Metric | 对应一个标签(Sparkplug 的度量) |
Birth(NBIRTH/DBIRTH) | 节点/设备一次性发布其度量的“完整定义” — 订阅者立即同步 |
Data(NDATA/DDATA) | 平时的值变化 — 仅变化的度量(增量) |
Death(NDEATH/DDEATH) | 自身通过 LWT 注册的存活消息 — 连接断开时自动发布 |
2. 基本发布流程(边缘 → 云端)
inject (5s) ─▶ 태그값 읽기 ─▶ function (Sparkplug 메트릭 변환) ─▶ sparkplug device out
function:
return {
payload: {
metrics: [{
name: msg.payload.tag_id, // "TAG_TEST_00042"
type: 'Int32',
value: parseInt(msg.payload.value, 10),
timestamp: Date.now()
}]
}
};
sparkplug device out(或 mqtt-sparkplug device)设置:
| 项目 | 值(示例) |
|---|---|
| Group ID | Plant1 |
| Edge Node ID | EDGE_00303 |
| Device ID | (可省略 — 直接在边缘层级发布) |
| Broker | (直接复用上面 MQTT 中创建的 broker) |
Birth/Death 由节点自动处理 — 部署时发布 NBIRTH,节点停止/崩溃时通过 LWT 发布 NDEATH。
3. 接收流程(云端 / 监控中心 → 监控各个边缘节点)
sparkplug client in (Group=Plant1) ─▶ switch (msg.topic 으로 분기) ─▶ ...
sparkplug client in 的一个节点订阅 spBv1.0/Plant1/... 的整个主题,并自动解析消息类型(NBIRTH/NDATA/NDEATH/DBIRTH/...),整理成 msg.command / msg.payload.metrics。
分支示例(switch):
| 条件 | 处理 |
|---|---|
msg.command === 'NBIRTH' | 设备元数据 数据库同步 — 更新度量目录 |
msg.command === 'NDATA' | 存储到时序数据库(InfluxDB / Cassandra 等) |
msg.command === 'NDEATH' | 通知 — “EDGE_00303 断开” |
4. 使用 Sparkplug 时的注意事项
- 度量名称必须在 BIRTH 和 DATA 中保持一致(如果名称改变,则从下一次 BIRTH 开始生效)。
- 如果多个客户端同时使用相同的 Group/Edge Node ID 发布,会导致 seq number 冲突并被标记为 Stale — 请确保 Edge ID 对每个网关唯一。
- 云端发送
Rebirth Request时,需要重新发布 NBIRTH — 库会自动处理,但如果自行实现,则需要实现该功能。
5. 后续步骤
- IIoT 示例 — Sparkplug B 发送
- 网关自带的 Sparkplug 组件:Sparkplug B(高级)