工业物联网中MQTT有效负载的挑战
在工业物联网(IIoT)中,从简单的温度传感器到复杂的工业机器,各种设备之间的通信常常存在格式不一致和非标准化的问题。而MQTT并没有规定特定的负载结构,这意味着负载可以是任何格式,从纯文本、二进制数据到JSON或XML等,这种多样性虽然允许使用多种数据类型,但对于需要一致和标准化的MQTT有效负载格式的IIoT实现来说可能并不理想。
以下是不一致和非标准化有效负载格式所带来的挑战:
- 兼容性问题: 如果有效负载没有标准化,不同设备或应用可能发送无法被其他设备或应用正确解读的数据格式,导致集成困难,特别是在涉及多个制造商的大规模IIoT部署中。
- 增加复杂性: 未标准化的有效负载要求开发者为每种不同的负载格式创建自定义解析器,这不仅使代码库复杂化,还增加了错误的可能性。
- 效率降低: 解析非标准化或不一致的有效负载通常需要更多的计算资源。在IIoT设备通常受限于处理能力和内存的情况下,这尤其成问题。
- 维护挑战: 不一致的有效负载结构使系统维护和更新变得更加困难。如果设备改变其有效负载格式,所有订阅实体都必须更新以理解这种新格式。
- 歧义和数据损坏: 没有标准化结构,数据解读错误或损坏的可能性增加,尤其在像医疗保健或工业自动化等关键应用中,后果可能非常严重。
Sparkplug如何实现标准化和结构化的MQTT有效负载
MQTT Sparkplug规范旨在标准化MQTT消息,确保一致的数据结构,以开发基于MQTT的互操作IIoT解决方案。它通过提供有效负载编码机制实现这一点,这不仅保留了MQTT的基本特性 - 轻量级、带宽高效和低延迟 - 同时还整合了适合IIoT环境的现代编码方案。
Sparkplug B(spBv1.0)有效负载格式是一种数据编码方案,使用Google Protocol Buffers或Google Protobufs。Google Protobufs是一种语言中立的结构化数据序列化机制,使Sparkplug B能够有效且可扩展地编码结构化MQTT数据。
Sparkplug B通过以下方式支持丰富的数据模型:
- 使用模板的复杂数据类型
- 数据集
- 增强的指标
- 指标别名支持
- 历史数据集成
- 文件数据管理
MQTT Sparkplug有效负载的关键组件
主要地,Sparkplug有效负载包含一些基本信息,如时间戳和序列号,以及包含键/值对数据的一系列指标。以下是这些及更多组件的详细说明。
- 时间戳: Sparkplug要求每个指标都包含时间戳,确保每个数据点都与其记录时间相关联。
- 指标: Sparkplug有效负载的指标组件由一系列指标组成。在Sparkplug有效负载上下文中,指标指的是设备间通信的具体数据点或值,例如温度读数、压力值或开关状态。为了描述其包含的信息,一个Sparkplug指标表示一个键、值、时间戳、数据类型以及可能与之相关联的任何元数据。
- 序列号: 每个Sparkplug消息包含一个序列号,每个新消息都会增加。如果接收者检测到序列号中有缺口,它知道有消息丢失了。这一特性对于数据的一致性至关重要,使设备或系统能够请求丢失的数据或采取纠正措施。
Sparkplug有效负载指标组件解析
- name(名称): 指标的标识符。
- alias(别名): 指标的数值别名,用于减少重复消息中的有效负载大小。
- timestamp(时间戳): 表示指标采集或创建的时间。
- datatype(数据类型): 指标持有的数据类型(例如,Boolean布尔型、Int32整型、String字符串等)。
- value(值): 实际的数据。
- is_historical(是否为历史值): 一个布尔标志,表示此指标是否代表一个历史值。
- is_transient(是否为瞬时值): 一个布尔标志,表示此指标是否不应被记录为历史数据。
- is_null(是否为空值): 一个布尔标志,表示此指标是否有一个空值。
- metadata(元数据): 与指标相关联的元数据对象。
- properties(属性): 与指标相关联的属性集对象。
Sparkplug B有效负载的示例
下面是一个简单的Sparkplug B有效负载的例子。
{
"timestamp": 1486144502122,
"metrics": [{
"name": "My Metric",
"alias": 1,
"timestamp": 1479123452194,
"dataType": "String",
"value": "Test"
}],
"seq": 2
}
NBIRTH有效负载表示
NBIRTH消息负责通知主机应用程序边缘节点的所有信息,包括将来它将发布数据的每个指标。
以下是一个简单的NBIRTH消息的表示,在主题上:
spBv1.0/DairyPlant/NBIRTH/Refrigeration
Sparkplug B有效负载在NBIRTH消息中的发布可能如下所示:
{
"timestamp": 1486144502122,
"metrics": [{
"name": "bdSeq",
"timestamp": 1486144502122,
"dataType": "Int64",
"value": 0
}, {
"name": "Node Control/Scan Rate",
"timestamp": 1486144502122,
"dataType": "Int64",
"value": 3000
}, {
"name": "Properties/Hardware Make",
"timestamp": 1486144502122,
"dataType": "String",
"value": "Opto22 Groov EPIC"
}, {
"name": "Inputs/Temperature",
"timestamp": 1486144502122,
"dataType": "Float",
"value": 25.6
}, {
"name": "Inputs/Humidity",
"timestamp": 1486144502122,
"dataType": "Float",
"value": 67.8
}, {
"name": "Outputs/Pump",
"timestamp": 1486144502122,
"dataType": "Boolean",
"value": true
}],
"seq": 0
}
NDATA有效负载表示
NDATA消息用于更新边缘节点在NBIRTH消息中最初发布的任何指标的值。当边缘节点的输入发生变化时,将生成NDATA消息并发布到MQTT服务器。如果边缘节点上的多个指标发生变化,它们都可以包含在单个NDATA消息中。
以下是一个简单的NDATA消息的表示,在主题上:
spBv1.0/DairyPlant/NDATA/Refrigeration
Sparkplug B有效负载在NDATA消息中的发布可能如下所示:
{
"timestamp": 1486144502122,
"metrics": [{
"name": "Inputs/Temperature",
"timestamp": 1486144502122,
"dataType": "Float",
"value": 29.2
}, {
"name": "Inputs/Humidity",
"timestamp": 1486144502122,
"dataType": "Float",
"value": 55.9
}],
"seq": 0
}
请注意,如果泵状态的值没有改变,则可以从指标中排除泵状态的值。
结论
总而言之,尽管MQTT在其有效负载结构上提供了灵活性,但这种灵活性可能导致集成挑战和复杂性增加,特别是在使用来自不同厂商的设备和应用程序时。MQTT Sparkplug规范通过提供一致和标准化的有效负载结构来解决这一挑战,专为IIoT量身定制。通过其使用Google Protocol Buffers的Sparkplug B数据编码机制,它确保设备能够高效地交换信息,同时保留MQTT的关键属性。这种统一性不仅简化了开发和集成工作,还增强了IIoT部署中数据通信的可靠性和完整性。
回复