Sparkplug为MQTT消息定义主题名,用来管理连接状态,实现双向测点(Metric)信息交换,可以用在许多典型实时SCADA/IIoT、监视、和数据收集系统中。定义的消息类型包括:
- NBIRTH – MQTT边缘节点上线
- NDEATH – MQTT边缘节点下线
- DBIRTH – 设备上线
- DDEATH – 设备下线
- NDATA – 节点数据(从节点读数据)
- DDATA – 设备数据(从设备读数据)
- NCMD – 节点命令(向节点写数据)
- DCMD – 设备命令(向设备写数据)
- STATE – 主应用状态
使用这些预定义消息,SCADA/IIoT主机应用能够:
- 发现所有元数据,监视连接到MQTT网络的EoN/设备状态
- 发现所有测点数据,包括诊断信息、属性、元数据和当前状态值
- 向EoN/设备写入测点值(发送命令)
本节定义主题名及其用法。
对实时SCADA/IIoT应用而言,关键之一是确保核心MQTT SCADA/IIoT主机节点知道,在MQTT保活周期内(见MQTT规范3.1.2.10),边缘节点的“状态”。为此,定义了遗嘱主题和遗嘱消息。遗嘱主题和遗嘱消息包含在MQTT CONNECT会话里,合起来我们称之为死亡证明(下线消息)。在MQTT意外下线时,下线消息的分发是MQTT协议规范而非Sparkplug规范的一部分(详见MQTT规范3.1节 CONNECT关于MQTT会话是如何建立和保持的)。
与下线消息机制属于MQTT传输协议不同,上线消息是Sparkplug定义的。上线消息与下线消息逻辑上成对,表明有关MQTT 边缘节点已经建立了MQTT会话,可以开始提供实时度量数据了。
边缘节点建立MQTT会话后必须发布的首条MQTT消息是:边缘节点上线消息。
7.1.1 边缘节点下线(NDEATH)
边缘节点下线主题名:
namespace/group_id/NDEATH/edge_node_id
这里的下线消息主题和负载不是客户端“发布”的,而是作为MQTT客户端开始建立连接时的MQTT CONNECT包的参数。

收到边缘节点下线消息,关注边缘节点的MQTT客户端应立即设置相关的测点数据质量为STALE(过时),并记录下线时间。
负载中可以包含一个上线/下线顺序号,用来追踪和同步上线和下线次序。由于负载是预先定义的,存放在MQTT服务器中,只在MQTT会话终止时分发,放不了太多辅助诊断信息。
边缘节点上线主题名:
namespace/group_id/NBIRTH/edge_node_id
边缘节点上线消息的负载包含可以构造该边缘节点全部测点的数据结构的所有信息。边缘节点的在线状态应该置为真,并记录上线时间。注意,上线消息仅表明节点自身是在线的,在MQTT会话中,任何曾经发布过DBIRTH的设备(即曾经在线的设备),其测点数据质量仍为“STALE”,直到这些设备用DBIRTH上线为止。
7.2 边缘节点数据(NDATA)
边缘节点通过NBIRTH上线后,就开始变化通知(RBE)或周期性变化通知,从而发挥了MQTT内在的持续会话感知优势,监视连接的MQTT 边缘节点状态,基于变化通知(RBE)消息获知测点状态的变化。
边缘节点数据主题名:
namespace/group_id/NDATA/edge_node_id
负载包含变化的测点值。
7.3 设备上线、下线
与7.1节MQTT 边缘节点下线消息利用了MQTT传输层不同,设备上线和下线是由Sparkplug规范定义和管理的,是边缘节点发布的应用层负载,不属于MQTT传输协议。
设备上线主题名:
namespace/group_id/DBIRTH/edge_node_id/device_id
负载包含可以构造该设备全部测点的数据结构的所有信息。设备的在线状态应该置为真,并记录上线时间。
MQTT 边缘节点负责管理所有关联的物理的/逻辑的设备。边缘节点发布NBIRTH,应用确认边缘节点的测点树为在线状态。节点关联的物理的/逻辑的设备还要提供其DBIRTH,然后应用建立/更新设备的测点树,设置相关测点状态为“GOOD”。
7.3.2 设备下线(DDEATH)
设备下线主题名:
namespace/group_id/DDEATH/edge_node_id/device_id
MQTT 边缘节点负责设备的实时状态,对物理设备通过本地请求-响应协议,如果设备因为种种原因(无响应,CRC错误,等等)不可用,边缘节点负责代替设备发布DDEATH。
收到DDEATH后,订阅该设备的MQTT客户端立即将所有相关测点数据质量置为“STALE”,并应记录下线时间。
边缘节点和设备都在线后,就开始变化通知(RBE),从而发挥了MQTT内在的持续会话感知优势,监视连接设备的状态,利用变化通知(RBE)消息获知测点值的变化。
设备数据主题名:
namespace/group_id/DDATA/edge_node_id/device_id
负载包含变化的测点值。
7.5 SCADA/IIoT主机节点上线、下线
在多MQTT服务器以实现冗余性、可扩展性的系统中,MQTT 边缘节点需要直到核心SCADA/IIoT主机应用的“状态”。这是通过SCADA/IIoT主机MQTT客户端在建立MQTT会话时,必须发布上线/下线消息实现的。与MQTT 边缘节点的NBIRTH/NDEATH类似,SCADA/IIoT主机的上线/下线消息也利用了MQTT遗嘱主题和遗嘱负载组合出下线消息,并对应一个应用层的上线消息。
SCADA/IIoT主机节点的上线和下线消息主题相同,主题名:
STATE/scada_host_id
利用了MQTT传输中的“RETAINED”特征,发布和保持主节点MQTT客户端的会话状态到所有MQTT服务器上。核心主机状态的使用在Sparkplug MQTT 会话管理章节中详述。
scada_host_id可以是合法的字符串,但不能含有保留字符+/#。
7.5.1 SCADA/IIoT主节点下线负载 (STATE)
当SCADA/IIoT主节点MQTT客户端与MQTT服务器建立MQTT会话时,下线消息主题和负载作为MQTT CONNECT包的参数。遗嘱主题名:
STATE/scada_host_id
遗嘱负载为UTF-8字符串“OFFLINE”。
遗嘱RETAIN标志置位真,遗嘱QoS置为1。
7.5.2 SCADA/IIoT主节点上线负载 (STATE)
SCADA/IIoT主节点MQTT客户端发布的第一条消息必须是上线消息。SCADA/IIoT主节点下线消息包含在了MQTT连接负载(遗嘱)参数中,在会话因故终断时由MQTT协议发布。
这里定义的上线消息是应用层消息,由SCADA/IIoT主节点MQTT客户端发布。
上线消息主题与下线消息主题相同:
STATE/scada_host_id
负载为UTF-8字符串“ONLINE”。
RETAIN标志置位真,QoS置为1。
7.6 边缘节点命令(NCMD)
NCMD命令主题提供用来发送命令给连接的边缘节点的主题名,也就是发送更新的值给包含在NBIRTH测点列表中的测点。
边缘节点数据主题名:
namespace/group_id/NCMD/edge_node_id
7.7 设备命令(DCMD)
DCMD命令主题提供用来向连接的设备发布测点的主题名,也就是发送新的值给包含在DBIRTH测点列表中的测点。
边缘节点数据主题名:
namespace/group_id/DCMD/edge_node_id/device_id
链接:
0. 目录
6. Sparkplug MQTT主题名