工业系统需要确保数据的无缝交换,因此对于高效、安全的通信协议具有极高的依赖性。MQTT Sparkplug 和 OPC UA 是两个经常被提到的工业协议。本文将全面比较 MQTT Sparkplug 和 OPC UA 以及它们的衍生版本,帮助您更清楚地了解哪种协议更适合您的需求。
OPC UA 的前身是 OPC Classic(也称为 OPC DA 或 OPC Data Access),是由 OPC 基金会开发的一套工业自动化标准。OPC Classic 规范于 1996 年首次发布,它定义了一种标准化的方法,用于在软件应用和工业硬件设备(如传感器、控制器和可编程逻辑控制器)之间交换数据。
然而,OPC Classic 有个明显缺点:它与微软 Windows 操作系统及其专有的 DCOM 技术紧密耦合。这种依赖性严重影响了协议的可用性、扩展性、互操作性、安全性和平台独立性,这对一个开放标准来说是巨大的制约。
为了克服这些限制,OPC 基金会于 2006 年开始开发了 OPC UA (OPC Unified Architecture) 作为 OPC Classic 规范的后继者。这两种规范在功能上是等效的,但使用不同的底层通信技术。此外,OPC Classic DA 3.0 也于同年发布,并且至今仍在使用中。
在 20 世纪 90 年代末,Andy Stanford-Clark 和 Arlen Nipper 参与了一个关于管道监测的项目,该项目需要一种轻量级协议,用于与远程传感器和设备进行通信。该项目要求在低功耗、低带宽的环境下实现监测功能。然而,当时的消息传输协议,如 HTTP 和 SMTP,被认为过于臃肿和低效,不适合这种特殊的场景。
为了应对这些挑战,一种发布/订阅模式的消息传输协议 MQTT 应运而生。MQTT 以其精简的代码和极低的带宽消耗而著称,因此在低功耗、低带宽的场景下具有显著的优势。它的主要目标是实现设备和系统之间的大规模实时数据交换,即使面对不同的数据格式和结构,也能保证数据通信的标准化。这一特点使得 MQTT 成为物联网和机器对机器(M2M)应用的理想选择。
MQTT 于 2010 年被结构化信息标准促进组织(OASIS)发布为开放标准,从而使其成为各个组织和行业可使用的通信协议。随后,在 2014 年发布了 MQTT 3.1.1,引入了一些新的特性,例如改进的错误处理和对服务质量(QoS)级别的支持。再后来,在 2019 年发布了 MQTT 5.0,进行了重大的改进,包括对自定义属性的支持、持久会话的实现以及错误报告的优化。
MQTT 发布/订阅模型相比经典 OPC UA 客户端-服务器模型有以下几个优势:
2018 年,OPC 基金会发布了 OPC UA 发布/订阅规范,它为 OPC UA 制定了一种发布/订阅的通信模型,该模型可以采用 MQTT 协议作为传输方式。OPC UA 发布/订阅模型非常强大,为工业自动化和物联网应用带来了巨大的好处。
MQTT 协议在物联网场景中取得了巨大的成功,但由于互操作性不足,它在工业自动化系统中的应用受到了限制。为了解决这个问题,Cirrus Link Solutions 在 2016 年推出了 Sparkplug 规范,旨在简化 MQTT 在工业自动化系统中的部署和使用。该规范为 MQTT 消息定义了一个标准化的格式,使得不同设备和应用之间能够方便地进行数据交换。
Sparkplug 的一个显著特点是它支持设备之间的双向通信。这种能力使得设备不仅可以发送命令,还可以接收来自网络中其他设备的反馈。
这篇博客通过介绍 5 个关键概念,阐述了为何 MQTT Broker 是实现 Sparkplug 设计原则的理想选择:Sparkplug 规范中关于 MQTT Broker 的 5 个关键概念。
MQTT 和 OPC UA 是工业自动化和物联网应用中常用的两种协议,它们拥有不同的架构和设计,体现了各自的用途。以下是 MQTT、OPC UA 及其变体在开放系统互联(OSI)模型方面的比较:
OSI 模型 | MQTT | OPC UA | MQTT Sparkplug | OPC UA over MQTT |
---|---|---|---|---|
应用层 | 发布/订阅机制 | OPC UA 通信(60 种数据类型) | Sparkplug 通信(18 种数据类型) | OPC UA 发布/订阅通信 |
表示层 | 未定义 | UA-JSON UA-XML UA-Binary |
Protobuf | UA-JSON UA-XML UA-Binary |
会话层 | 无会话 | 客户端-服务器会话管理 | Sparkplug 会话感知 | 无会话 |
传输层 | TCP/IP | TCP/IP | MQTT | MQTT |
传输层:MQTT 和 OPC UA 都使用 TCP/IP 作为底层通信协议。MQTT Sparkplug 和 OPC UA over MQTT 则使用 MQTT 作为传输协议,它们都采用了 MQTT 的发布/订阅模型。
会话层:OPC UA 包含负责管理客户端和服务器之间连接的会话层,处理诸如会话建立、身份验证和加密等任务。相比之下,MQTT 不具备会话层管理功能。然而,MQTT Sparkplug 通过在会话层引入 Sparkplug 会话感知来弥补这个不足。
表示层:OPC UA 拥有定义良好的信息模型,该模型定义了客户端和服务器进行数据交换时数据的结构和语义,例如 UA-JSON 和 UA-binary。相比之下,MQTT 缺乏正式的信息模型,而是依赖于基于主题的消息来实现客户端和服务器之间的数据通信。MQTT Sparkplug 则是通过指定 Google Protobuf 作为消息格式来弥补这一差距,以增强 MQTT 的能力。
应用层:MQTT 和 OPC UA 在应用层协议上有明显的区别。MQTT 使用发布/订阅模型,通过主题来组织消息,而 OPC UA 使用客户端/服务器模型,通过分层对象模型来组织数据。OPC UA 发布/订阅规范是对 OPC UA 客户端/服务器模型的一种扩展。
MQTT Sparkplug 和 OPC UA 各有优劣,因此在不同的使用场景中,可能会出现某个协议比另一个更加适用的情况。这两种协议及其衍生协议之间的一些主要区别如下:
指标 | MQTT | MQTT Sparkplug | OPC UA | OPC UA over MQTT |
---|---|---|---|---|
消息传输模型 | 发布/订阅 | 发布/订阅 | 客户端/服务器 | 发布/订阅 |
带宽使用 | 开销最低,低带宽和低功耗 | 开销最低,低带宽和低功耗 | 高代码占用,高带宽 | 高代码占用,高带宽 |
消息载荷 | 未定义 | 轻量级消息,通常小于 OPC UA | 复杂的数据类型,其消息大小可以远大于 MQTT Sparkplug | 复杂的数据类型,其消息大小可以远大于 MQTT Sparkplug |
互操作性 | 不具备互操作性 | 具备互操作性(18 种数据类型) | 高度互操作性(60 种数据类型) | 高度互操作性(60 种数据类型) |
扩展性 | 高度可扩展 | 高度可扩展,每秒能处理百万级消息 | 可扩展性较好,但需要更复杂的架构来处理大量数据 | 比 OPC UA 客户端/服务器模型具有更好的可扩展性 |
集成便利性 | 使用简单,配置要求最少 | 使用简单,配置要求最少 | 需要较多的安装和配置 | 需要较多的安装和配置 |
服务质量 | QoS 0(至多一次)、QoS 1(至少一次)和 QoS 2(仅一次) | QoS 0(至多一次)、QoS 1(至少一次)和 QoS 2(仅一次) | 提供可靠的传输层,确保消息传递有序且不丢失 | 提供可靠的传输层,确保消息传递有序且不丢失 |
状态感知 | 否 | 是 | 是 | 是 |
自动发现 | 否 | 否 | 是 | 是 |
应用领域 | 物联网、家庭自动化和 M2M 应用 | 工业物联网和 M2M 应用 | 工业自动化 | 工业自动化 |
实时性 | 是 | 是 | 是 | 是 |
安全性 | 安全性不如 OPC-UA | 安全性不如 OPC-UA | 数字证书、数字签名、数据加密和安全认证 | 数字证书、数字签名、数据加密和安全认证 |
信息模型 | 不具备内置的信息建模支持 | 支持复杂的信息建模,但不及 OPC UA 多 | 支持复杂的信息建模系统,允许创建复杂的数据结构和模型 | 支持复杂的信息建模系统,允许创建复杂的数据结构和模型 |
简而言之,OPC UA 是一个开放标准,它包含了一套定义明确的数据类型规范。而 MQTT Sparkplug 也是一个开放标准,但它在数据类型的标准化方面做得不够。因此,在数据传输过程中,MQTT Sparkplug 产生的协议开销更小。
MQTT Sparkplug 使用了轻量级的消息传输协议,非常适合低带宽或不稳定的网络环境。而 OPC UA 使用了更强大的消息传输协议,能够处理更多的数据量,更适合高速和安全的网络环境。
OPC UA 和 MQTT 之间的竞争一直持续至今。目前,EMQ 正在推出针对汽车行业的 MQTT over QUIC 协议,而 OPC 基金会也发布了 OPC UA over TSN。OPC UA over TSN 提供了一种在以太网上传输实时数据的标准化方法,旨在简化复杂的工业自动化和控制系统。
版权声明: 本文为 EMQ 原创,转载请注明出处。
原文链接:https://www.emqx.com/zh/blog/a-comparison-of-iiot-protocols-mqtt-sparkplug-vs-opc-ua