MQTT 是什么及其工作原理
MQTT 的互操作性
MQTT 的实时性能
MQTT 的安全性
MQTT 的实现
MQTT 的应用场景
自动化的未来以工业 4.0、工业物联网(IIoT)、智能工厂和智能设备等术语为特征。这一新技术时代的核心是连接性 —— 具有分层结构的刚性自动化金字塔正逐渐被更大的网络结构所取代,在这些网络结构中,各个节点相互连接并交换数据。对于这种智能联网,设备必须具备工业物联网能力,即标准化、可扩展、兼具 IT 和 OT 能力,并且可互操作。此外,它们必须能够进行安全通信。实现这种智能通信有多种通信协议可供选择,例如 MQTT、OPC UA、AMQP 和 REST API。在我们的多部分博客系列文章中,您可以了解这些工业物联网通信协议的特点以及它们特别适合的应用场景。该系列的第一篇文章是关于 MQTT 的。
MQTT(消息队列遥测传输)是一种紧凑的二进制开放式消息传递协议,易于实现,采用发布 / 订阅模式。它是由 OASIS 技术委员会管理的经认证的 OASIS 和 ISO 标准(ISO/IEC 20922:2016)。MQTT 最早出现于 1999 年,是为解决石油管道带宽和电池能源高效监控问题而提出的技术解决方案。14 年后的 2013 年,IBM 将 MQTT 提交给 OASIS 规范委员会,随后该协议于 2014 年作为 OASIS 标准发布。从那时起,它便开始征服工业市场,尤其是在精简代码、最小化开销和限制网络流量等需求较高的领域。下图(图 1)概述了 MQTT 的基本功能。MQTT 客户端(包括发布者和订阅者)连接到 MQTT 代理服务器。一些 MQTT 客户端订阅特定主题,在此示例中为温度值。一旦发布消息的 MQTT 客户端向代理服务器发送数据,代理服务器就会记住必须将此消息发送给所有已订阅的 MQTT 客户端。这种拓扑结构的显著优势在于发布者和订阅者的解耦。无需在它们之间建立大量连接,而是由代理服务器负责将数据从一端传输到另一端。
图 1:MQTT 的工作原理 —— 典型的 MQTT 应用
MQTT 规范包含几个显著特点:
主题(Topic)
这是 MQTT 协议中的基本元素。通过网络发送的每条消息除了报头信息外,还包含一个主题和有效载荷。主题是代理服务器可用于过滤消息的信息,也是订阅者订阅的内容。主题可以包含多个层级,例如 “home/sensor1/identification” 包含三个主题层级,而 “home/sensor1/data/temperature” 包含四个主题层级。每个主题层级用斜杠分隔,主题结构区分大小写。主题的一个或多个层级中还可以包含占位符。在单个层级使用占位符时,需用加号表示,例如:“home/+/data/temperature”。这样,所有内部传感器记录的温度值都会发布到已订阅的 MQTT 客户端。第二种占位符是多层级占位符,使用井号符号表示。例如 “home/sensor1/#”,它会将传感器 1 发布的所有数据传输到已订阅的 MQTT 客户端。
服务质量(Quality of Service, QoS)
该功能用于为每条消息设置传递安全性,目的是定义不同的安全级别以确保消息到达订阅者端。这些级别包括:QoS 0(最多一次)、QoS 1(至少一次)和 QoS 2(恰好一次)。QoS 2 是最高质量级别,需要最多的通信确认和实施措施。
会话感知(Session Awareness)
MQTT 中有多种机制可确保代理服务器与发布者 / 订阅者之间的连接保持完好。最基本的机制是保活消息(keep-alive message)。客户端会定期向代理服务器发送保活消息,以确认连接仍然存在。这使代理服务器能够检测客户端是否已离线。此外,客户端在初始连接过程中会向代理服务器提供一条 “遗嘱”(Last Will and Testament, LWT)声明。客户端离线后,代理服务器会将此消息发送给网络上的其他客户端,通知它们该客户端已离线。
持久会话(Persistent Session)
当代理服务器与订阅者之间建立持久会话时,代理服务器会存储消息,直到订阅者准备好接收消息。此功能在网络不稳定的情况下尤其有用。
MQTT 是所有协议中最紧凑的,且未定义任何标准化级别。有效载荷(消息)被发送到特定主题,主题拼写错误或以非预期格式发送数据不被视为错误。自 MQTT 5 起,元数据可在报头中发送。然而,这并不妨碍各个设备采用完全不同的命名约定和元数据信息。因此,除非所有主题和消息都由人工定义,否则 MQTT 不足以支持机器对机器的交互。对于人与机器之间的交互,人在与机器交互之前,必须首先研究确定可用的主题及其数据结构。机器无法确定用户可以订阅哪些主题。
由于开销低,MQTT 可实现较短的传输时间。理论上,如果发布者与代理服务器之间没有延迟,并且订阅者已连接到代理服务器并主动监听,则可以实现所承诺的 “近实时” 和 “无延迟” 响应。
MQTT 在连接初始化阶段支持使用用户名和密码进行身份验证。自 MQTT 5 起,仅密码字段可用于令牌传输,因此需要额外的安全机制,例如挑战响应身份验证。
MQTT 是所有协议中最紧凑的,实现起来所需的工作量最小。与所有其他协议相比,在运行时,它对存储空间、计算能力和传输容量等系统资源的需求显著减少。仅额外的安全措施可能会增加工作量。
例如,当只需要一个简单、紧凑的解决方案时,MQTT 是完美的选择。以下场景均适用:从多个传感器收集数据,或同时向许多相同类型的传感器发送相同信息,或需要低功耗和极低内存需求的情况。MQTT 已在各种场景中得到应用,如联网汽车、军事应用、工业设备网络、无人机控制等。