OPC-UA、Modbus、MQTT、Sparkplug、HTTP 工业通信效率对比
OPC-UA、HTTP、Modbus、MQTT 和 Sparkplug 是工业通信中常用的主流技术,每种技术都是为特定的通信级别和目的而设计的。
OPC-UA 通常用于车间环境,HTTP 常用于互联网通信,MQTT 适用于本地或云平台通信,而 Modbus 则普遍用于设备级通信。
虽然这些技术的设计目的各不相同,但我们可以从通信效率的角度对它们进行比较。在本文中,我们将基于影响传输带宽的四个通信标准来对它们进行比较:
- 连接开销
- 连接持久性
- 数据变化
- 数据压缩
本文中的数据和结论基于 2019 年的 Johnathan Hottell 实验。
连接开销
当两个设备通过网络通信时,它们通常要先建立连接才能交换数据。这个过程涉及到的几个步骤会导致连接开销,包括:
- 握手:在数据传输开始之前,设备需要通过交换一系列消息来建立连接,这称为握手。握手的作用是验证设备的身份,协商通信的参数,并确保双方都已经准备好发送和接收数据。这个协商和验证过程会带来时间和网络资源的开销。
- 协议开销:为了确保数据传输的可靠性和有序性,网络协议(如 TCP/IP)会引入一些额外的开销。这些协议在数据中添加控制信息、错误检测机制、排序和确认机制,以确保数据的完整性和可靠传递。尽管这些功能提高了网络通信的可靠性,但也增加了处理负担和网络资源的开销。
OPC-UA: OPC-UA 的架构复杂,功能丰富,因此会产生额外的开销。要建立 OPC-UA 连接,需要经过多个步骤,包括握手、安全协商和创建会话,这些都会增加连接开销。
Modbus: Modbus 的连接开销很低,因为该协议不需要复杂的握手或会话管理。Modbus 主要专注于直接访问数据点,连接建立的开销很小,一般只涉及网络连接和设备寻址。
HTTP: HTTP 的连接开销比其他协议高。每个 HTTP 请求-响应周期通常都要建立新的连接,这就会带来握手、头部交换和会话管理等方面的额外开销。
MQTT: MQTT 设计轻量高效,因此连接开销很低。它使用简单的二进制协议,头部大小很小,减少了建立和维持连接所需的数据量。
Sparkplug: Sparkplug 与 MQTT 相比,引入的额外开销很小,因为它主要是定义了有效载荷格式和数据表示,而没有改变连接行为。
简而言之,OPC-UA 作为一种更健壮、功能更丰富的协议,比其他技术具有更高的连接开销。MQTT 作为一个更简单和轻量级的协议,通常有较低的连接开销。HTTP 和 Modbus 采用请求和响应模型,它们的连接开销也不高。parkplug 由于有“Birth”消息,所以连接时数据量稍大。图中的实验结果与我们的结论相符。
连接持久性
连接建立后需要一些开销来保持它。其中包括周期性地交换保活消息以确保连接保持活动状态,以及管理两端的连接状态信息。另外,面向连接的协议如果连接中断或丢失,可能要重新建立连接,这也会增加开销。所以,让连接处于活动状态,可以减少新建连接的开销,提升效率。
OPC-UA:OPC-UA 是客户端-服务器模型。客户端和服务器可以是持久连接也可以是非持久连接,这根据应用或协议的需求和特性而定。但我们这里假设使用的是持久连接。
Modbus:Modbus 也是客户端-服务器模型。Modbus 本身不需要客户端和服务器之间的持久连接。而是每个请求都会建立一个连接,收到响应后,连接就会关闭。
HTTP:HTTP 是一种主要用于网络通信的无状态协议。每个 HTTP 请求-响应周期都是独立的,默认情况下,请求之间的连接不会保持活动状态。
MQTT:MQTT 使用持久连接模型。客户端与 MQTT Broker 一旦建立连接,连接就会一直保持活动状态,除非客户端或 Broker 主动关闭。它还提供了保活机制和自动重连等功能,以保证在网络中断时连接的可靠性。
Sparkplug:Sparkplug 基于 MQTT 开发,继承了 MQTT 的连接特性。它采用持久连接模型,使客户端和 MQTT Broker 能够长期保持连接。我们假设 Sparkplug 与 MQTT 有相似的结果。
OPC-UA 和 MQTT 都是支持连接持久性的协议,能够在同一个连接上处理多个请求,从而减少建立连接的开销。HTTP 和 Modbus 在默认配置下,一般使用短连接,这可能会导致每个请求的连接开销更高。
数据变化
“变化时传送”是工业自动化和通信协议中常用的一种机制,它只在被监测的变量或参数的值有变化或更新时才传输数据。不同于按固定间隔不断传输数据,"变化时传送"方法只在必要时发送数据更新,从而能够节省网络带宽。
在需要监测或控制大量数据的系统中,定期传输所有数据可能造成网络资源的浪费。"变化时传送"通过只在被监测的变量的值有重要变化时才发送数据更新,从而降低网络流量和数据传输开销。
OPC-UA:OPC-UA 通过订阅模型支持“变化时传送”机制。OPC-UA 客户端可以订阅服务器中的特定变量或节点,服务器只在订阅的数据有变化时,才向客户端发送数据更新。
Modbus:Modbus 是个简单和传统的协议,没有内置的"变化时传送"机制。它主要专注于提供直接访问数据点的功能,而不包含报告数据变化的机制。
HTTP:HTTP 没有"变化时传送"功能,但可以在应用层用长轮询或服务器发送事件(SSE)技术来实现。这些技术让服务器能够在数据变化时,向客户端推送数据更新。
MQTT:MQTT 作为标准规范,并不自带"变化时传送"机制。但是,MQTT 可以和其他协议或应用逻辑配合,来实现"变化时传送"功能。
Sparkplug:Sparkplug 原生支持"变化时传送"机制。它定义了一个标准的有效载荷格式,包括元数据和数据值。订阅的客户端只有在数据值变化时,才收到更新。
OPC-UA 发布/订阅模型和 MQTT 支持数据变化发送机制,即只有在数据发生变化时才发送数据,减少了不必要的网络流量,提高了效率。而 OPC 读写模型、HTTP 和 Modbus 则通常定期或轮询获取数据,这可能造成网络流量过大和带宽利用效率不高。Johnathan 实验显示 "变化时传送"机制可以大大减少网络流量。
数据压缩
通信中的数据压缩是指为了在通信网络或信道上高效传输数据,减小数据大小的过程。它包括在发送数据前对数据采用压缩技术,然后在接收端对数据进行解压缩,还原原始数据。要注意的是,通信系统中的发送方和接收方必须使用相同的压缩算法,才能保证压缩和解压缩的正确性。
OPC-UA:OPC-UA 使用 UA-XML、UA-JSON 或 UA-binary 作为数据传输格式,这些格式并不支持数据压缩。OPC-UA 使用 base64 对数据进行编码,但它本身并没有压缩功能。对于 OPC-UA 二进制数据,除非以服务方式提供压缩数据,否则无法提高带宽效率。
Modbus:Modbus 没有内置的数据压缩功能。它主要侧重于以简单高效的方式传输数据,而无需额外的开销。
HTTP:HTTP 本身不提供原生的数据压缩。它支持像内容编码这样的特性,可以对传输的有效载荷进行数据压缩。
MQTT:MQTT 并没有将数据压缩作为其核心规范的一部分。然而,MQTT 可以与其他压缩技术或库结合使用,在传输之前对有效载荷数据进行压缩。
Sparkplug:Sparkplug 是一种专为工业物联网应用开发而设计的消息协议,它基于 MQTT 建立。Sparkplug 使用 Google Protobuf 作为其有效载荷数据格式。Protobuf 是一种具有一定压缩能力的数据格式。因此,Sparkplug 可以被视为一种具备数据压缩功能的协议。
OPC-UA 提供了内置的数据压缩支持,但其压缩率并不高,对于提高数据的传输效率没有太大帮助。HTTP 和 MQTT 可以支持数据压缩,但这不是它们的标准功能,需要额外的配置或在应用层面进行实现。Modbus 不支持任何数据压缩。而 Sparkplug 将有效载荷定义为 Google Protobuf,这是一种在传输中具有一定压缩效果的数据格式。
对比概览
协议 | 连接开销 | 连接持久性 | 数据变化 | 数据压缩 |
---|---|---|---|---|
OPC-UA | 差 | 差 | 不支持 | 一般 |
Modbus | 优秀 | 一般 | 不支持 | 差 |
HTTP | 优秀 | 差 | 用户定义 | 用户定义 |
MQTT | 优秀 | 好 | 用户定义 | 用户定义 |
Sparkplug | 好 | 好 | 支持 | 优秀 |
结语
从上面的对比可以看出,Sparkplug 协议是最适合工业场景的高效协议。它原生支持"变化时传送"机制,非常适合高效地传输数据更新。由于它是采用持久连接模型的轻量级协议,所以它的连接开销很低,保证了持续的通信和高效的消息传递。
EMQX 和 Neuron 都支持 Sparkplug 协议。EMQX 提供了负载均衡、集群和消息持久化等高级功能,保障了使用 Sparkplug 协议进行数据传输的效率和可靠性,而 Neuron 提供了数据聚合和设备管理等功能,便于大规模工业物联网设备的部署。