基于SCADA系统使用MQTT,获得一个可用的消息中间件(Message Oriented Middleware, MOM),首先必须定义主题名。MQTT妙在你可以随便用一个主题,例如“波特兰/温度”,连接到MQTT服务器,发布温度值,那些想利用温度数据的MQTT客户端应用需要先理解主题名。
发布出来的MQTT消息都包含主题和负载,是MQTT消息的主体,传输时以字节数来度量。Sparkplug 规范设计在保证含义准确、易于理解同时,避免冗长的主题名给数据交换带宽和时长带来负面影响。
6.1 Sparkplug MQTT主题名元素
所有采用Sparkplug 规范的MQTT客户端需遵循如下主题名结构:
namespace/group_id/message_type/edge_node_id/[device_id]
6.1.1 namespace元素
namespace是主题名的根元素,定义了剩余元素的结构和相关负载数据的编码。目前,Sparkplug规范定义了两种namespace,一个对应Sparkplug负载定义A,另一个对应Sparkplug负载定义B。
对于Sparkplug A负载定义,namespace为UTF-8字符串:
“spAv1.0”
对于Sparkplug B负载定义,namespace为UTF-8字符串:
“spBv1.0”
注意,Sparkplug版本不管是A还是B,主题名和会话状态管理都是相同的。A和B两个版本的Sparkplug MQTT消息负载编码格式在附件中分别定义。
6.1.2 group_id元素
group_id元素提供对MQTT 边缘节点的逻辑分组。group_id可以是任意合法的UTF-8字符串,但不能含有保留字符+/#。为减少带宽占用,应语义明确并尽可能短。例如,在油气应用中,一条管线上各段MQTT EoN的group_id相同;工厂应用可以按照分厂或产线来对MQTT 边缘节点进行分组。
6.1.3 message_type元素
message_type元素说明消息的负载如何处理。注意,负载的编码取决于namespace元素所指的Sparkplug版本。
Sparkplug主题名定义了如下message_type:
- NBIRTH – MQTT 边缘节点上线
- NDEATH – MQTT 边缘节点下线
- DBIRTH – 设备上线
- DDEATH – 设备下线
- NDATA – 节点数据(从节点读数据)
- DDATA – 设备数据(从设备读数据)
- NCMD – 节点命令(向节点写数据)
- DCMD – 设备命令(向设备写数据)
- STATE – 主应用状态
每个message_type元素详细说明见下文。
6.1.4 edge_node_id元素
edge_node_id元素唯一标识MQTT 边缘节点,group_id/edge_node_id必须是唯一的。edge_node_id可以是任意合法的UTF-8字符串,但不能含有保留字符+/#。EoN发布每条消息都要带上edge_node_id,因此要尽可能短。
6.1.5 device_id元素
device_id元素标识一台关联到MQTT 边缘节点的(物理的或逻辑的)设备。device_id元素是可选的,一些消息直接源于或发送到edge_node_id,不需要device_id。device_id可以是任意合法的UTF-8字符串,但不能含有保留字符+/#。同一个边缘节点下的device_id必须唯一,不同边缘节点之间的device_id可以重复,每次发布设备消息都要带上device_id元素,因此要尽可能短。
链接:
0. 目录
5. 通用消息流