MQTT是一种轻量级的开放式消息传递协议,它为资源受限的网络客户端提供了一种在低带宽环境中分发遥测信息的简单方法。该协议采用发布/订阅通信模式,用于机器对机器 ( M2M ) 通信。
作为一种低开销协议创建以适应带宽和 CPU 限制,MQTT 被设计为在嵌入式环境中运行,它可以提供可靠、有效的通信路径。MQTT 适用于连接代码占用空间小的设备,对于由于偶尔的带宽限制或不可靠的连接而经历不同延迟水平的无线网络来说,它是一个不错的选择。该协议适用于从汽车到能源再到电信等行业。
管 MQTT 最初是用于与石油和天然气行业的监控和数据采集 ( SCADA ) 系统进行通信的专有协议,但它已在智能设备领域变得流行,如今已成为连接物联网的领先开源协议 ( IoT ) 和工业 IoT ( IIoT ) 设备。
虽然 MQTT 中的TT代表 Telemetry Transport,但MQ指的是一种名为 IBM MQ 的产品。尽管MQTT的拼写有时被称为消息队列遥测传输,但 MQTT 通信中没有消息队列。
为了最大化可用带宽,MQTT 的发布/订阅(pub/sub)通信模型是直接与端点通信的传统客户端-服务器架构的替代方案。相比之下,在pub/sub 模型中,发送消息的客户端(发布者)与接收消息的客户端(或订阅者)分离。因为发布者和订阅者之间都没有直接联系,所以第三方——经纪人——负责他们之间的联系。
MQTT 客户端包括发布者和订阅者,这些术语指的是客户端是发布消息还是订阅接收消息。这两个功能可以在同一个 MQTT 客户端中实现。当设备(或客户端)想要向服务器(或代理)发送数据时,它被称为发布。当操作反向时,它被称为订阅。在发布/订阅模式下,多个客户端可以连接到代理并订阅他们感兴趣的主题。
如果从订阅客户端到代理的连接中断,那么代理将缓冲消息并在订阅者重新联机时将它们推送给订阅者。如果从发布客户端到代理的连接在没有通知的情况下断开,那么代理可以关闭连接并向订阅者发送包含发布者指令的缓存消息。
一个 MQTT 会话分为四个阶段:连接、认证、通信和终止。客户端首先使用代理的操作员定义的标准端口或自定义端口创建与代理的传输控制协议/互联网协议 ( TCP/IP ) 连接。创建连接时,重要的是要认识到如果为服务器提供了重用的客户端身份,它可能会继续旧会话。
标准端口是 1883 用于非加密通信和 8883 用于加密通信 - 使用安全套接字层 ( SSL )/传输层安全性 ( TLS )。在 SSL/TLS 握手期间,客户端验证服务器证书并验证服务器。客户端还可以在握手期间向代理提供客户端证书。代理可以使用它来验证客户端。虽然不是 MQTT 规范的具体部分,但代理已经习惯于使用 SSL/TLS 客户端证书支持客户端身份验证。
因为 MQTT 协议旨在成为资源受限和 IoT 设备的协议,所以 SSL/TLS 可能并不总是一种选择,并且在某些情况下可能不需要。在这种情况下,身份验证显示为明文用户名和密码,由客户端发送到服务器——这是 CONNECT/CONNACK 数据包序列的一部分。此外,一些经纪商,尤其是在互联网上发布的公开经纪商,将接受匿名客户。在这种情况下,用户名和密码只需留空即可。
MQTT 被认为是一种轻量级协议,因为其所有消息的代码占用量都很小。每条消息都由一个固定的标头(2个字节)、一个可选的可变标头、一个限制为 256 兆字节 (MB) 信息的消息有效负载和一个服务质量 ( QoS ) 级别组成。
在通信阶段,客户端可以执行发布、订阅、取消订阅和ping操作。发布操作将二进制数据块(内容)发送到发布者定义的主题。
MQTT 支持最大 256 MB 的消息二进制大对象 (BLOB)。内容的格式将是特定于应用程序的。使用 SUBSCRIBE/SUBACK 数据包对进行主题订阅,并且使用 UNSUBSCRIBE/UNSUBACK 数据包对类似地执行取消订阅。