消息队列遥测传输 (MQTT) 的历史
MQTT 由 Andy Stanford-Clark 与 IBM 和 Arlen Nipper 于 1999 年开发,用于通过卫星将石油管道上的测量设备连接到他们的 SCADA(监督控制和数据采集)系统。他们开发这个协议是因为他们需要一些轻量级、带宽资源丰富且消耗很少功耗的协议来通过卫星链路。
2014年,MQTT正式成为OASIS(结构化信息标准促进组织)开放标准。它旨在保持开源实现,以确保在机器对机器 (M2M) 行业中得到广泛采用。
2019年,OASIS发布了官方更新的MQTT 5.0标准。5.0 版包括诸多新功能:例如原因代码、共享订阅、消息到期和主题别名。
如今,MQTT 已被许多工业领域采用,包括汽车、公用事业、物流、制造、智能家居、消费品和运输,连接全球数百万台设备。
什么是消息队列遥测传输 (MQTT)?
MQTT 代表消息队列遥测传输,是一种使用发布/订阅 (PubSub) 模型用于物联网 (IoT) 和工业 4.0 的通信协议。它非常轻量级,在 TCP/IP 堆栈之上执行,并且设计用于连接需要开发人员最少编码的分布式设备。
MQTT 具有带宽效率且不占用资源。它还可以在安全套接字层 (SSL)/传输层安全 (TLS)(一种建立在 TCP/IP 上的安全协议)上运行,以确保设备之间的所有数据消息都是加密和安全的。
发布订阅模型
在 MQTT PubSub 模型中,客户端是消息生产者(发布者)或消费者(订阅者)。客户端之间不建立直接链接,也不知道彼此的位置或 IP 地址。相反,它们都连接到一个 MQTT 代理,该代理仅充当流量(消息)存储和导向器,如图 1 所示。
图 1. MQTT 中的发布/订阅模型。图片由 Behr Technologies 提供
在这个例子中,有一个发布者和两个订阅者订阅了同一个发布者获得相同的信息。但是,在许多应用程序中,经常会看到多对多关系,如图 2 所示。
图 2. MQTT 中的多对多关系。图片由 ResearchGate 提供
MQTT 代理只将它从发布者接收到的消息发送给订阅了 MQTT 主题的订阅者。接下来我们将讨论 MQTT 主题。
消息队列遥测传输 (MQTT) 的内部
消息队列遥测传输 (MQTT) 主题
在 MQTT 中,主题是指一个分层的 UTF-8 文本字符串,代理使用它来过滤消息并将消息传递给每个订阅者。主题由一个或多个主题级别组成,每个主题级别用正斜杠分隔。所有消息都必须包含一个主题,并且订阅者必须订阅该主题。主题示例以以下格式呈现(重要的是要注意主题区分大小写)。
我的房子/一楼/房间1/温度
我的房子/一楼/房间4/温度
我的房子/二楼/房间2/湿度
MQTT 是一种支持异步通信的消息传递协议。它通过只知道代理的 IP 地址和端口号来发布或订阅消息,从而在空间上解耦消息的生产者和使用者。它还通过在网络断开时为客户端存储消息来解耦时间。这使得该协议在不稳定的网络(如蜂窝和无线电网络)中具有很强的可扩展性。
MQTT 以纯文本形式发送连接凭证,因此不提供安全措施和身份验证本身。这可以通过使用带有用户名、密码保护连接的 TLS 加密并要求客户端提供与代理证书匹配的证书来解决。
默认的未加密 MQTT 端口为 1883。加密端口为 8883。
消息队列遥测传输 (MQTT) 服务质量 (QoS)
MQTT 中的服务质量 (QoS) 是发布者和订阅者之间关于保证传递消息的协议。
QoS分为三个级别:
0–最多一次,代理不确定
1–至少一次,代理向发布者发送确认
2 – 恰好一次,发布者和订阅者之间的握手
当发布者向 MQTT 代理发布消息时,它会确定该消息的 QoS 级别。当代理将消息转发给订阅者时,它也会发送与发布者设置的相同的 QoS。
级别 0 对带宽的负担较小,并在认为连接可靠时使用。使用最高级别 2 可以保证交付,但会增加负载数据传输。
消息队列遥测传输 (MQTT) Sparkplug B
Eclipse Foundation 管理着一个与 MQTT 兼容的 Sparkplug 协议规范,其中 MQTT 是通信协议,Sparkplug 定义了数据结构。通过在 MQTT 之上添加新的要求和功能,为实时和关键任务工业应用选择了该规范。
Sparkplug B 向 MQTT 实现添加了三个主要要求:
强制状态意识。发布者必须在连接时发布证明,定义所有主题,并通过代理向订阅者广播其在线状态。如果与网络断开连接,它还会向代理提交证明以进行分发。图 3 描述了与 MQTT 代理建立设备通信的过程。
图 3. MQTT Sparkplug 中的设备会话建立。图片由 Eclipse 基金会提供 [PDF]
有效载荷定义。MQTT 是数据不可知的,可以与任何客户端一起运行,但同时增加了订阅者将增加数据的负担。Sparkplug 将 MQTT 负载与结构化元数据打包在一起,以便任何 Sparkplug 客户端都可以识别消息。然后将整个有效载荷压缩成更小的占地面积。
标准主题格式。 MQTT 中的主题可能会掩盖互操作性,因为不同的边缘设备可以使用不同的命名约定。 Sparkplug 定义了一种标准的主题格式,以减少客户端之间的不一致并使其能够正确解释数据。
边缘到云的连接
MQTT 是跨平台的。代理可以在 Windows、Linux 和其他平台上安装和运行。展望未来,越来越多的安装将在 Azure 和 Google Cloud 等云服务器上运行。在云上托管代理允许开发人员快速启动、轻松管理和监控代理,并在需要连接更多设备时进行扩展。
当数据通过云时,安全性变得更加重要。开发者必须注意并正确配置和处理安全连接、认证、授权和加密,以维护数据的安全性和完整性。
MQTT 于 1999 年开发用于将石油管道连接到 SCADA,并且一直用于工业环境。它是一种用于各种工业行业的通信协议。
上一篇:MIKROE 的新SiBRAIN MCU 开发标准,轻松更换 MCU 而无硬件代价
下一篇:Intel官宣开发RISC-V处理器:明年首发7nm工艺
推荐阅读最新更新时间:2024-11-13 10:21