一、MQTT概述
MQTT由IBM的Andy Stanford-Clark博士和Arcom(现为Eurotech)的Arlen Nipper于1999年发明。
MQTT 是物联网 (IoT) 最常用的消息传递协议。MQTT 代表 MQ 遥测传输。该协议是一组规则,用于定义物联网设备如何通过互联网发布和订阅数据。 MQTT 用于物联网和工业物联网 (IIoT) 设备之间的消息传递和数据交换, 如嵌入式设备, 传感器, 工业PLC等.该协议是事件驱动的,并使用发布/订阅(发布/订阅)模式连接设备。发送方(发布方)和接收方(订阅方)通过主题进行通信,并且彼此分离。它们之间的连接由 MQTT 代理处理。MQTT 代理过滤所有传入消息并将其正确分发给订阅者。
MQTT 是一种低开销协议,以适应带宽和 CPU 限制,旨在在嵌入式环境中运行,在那里它可以提供可靠、有效的通信路径。MQTT 适用于连接代码占用量较小的设备,对于由于偶尔的带宽限制或不可靠的连接而经历不同延迟水平的无线网络来说,MQTT 是一个不错的选择。该协议在从汽车到能源再到电信的行业都有应用。
MQTT官网
开始 (mqtt.org)https://mqtt.org/getting-started/ MQTT 使用基于主题的简单发布/订阅通信。
二、MQTT 协议主要组件
1、MQTT 发布者/订阅者
MQTT 中的第一个主要概念是发布者/订阅者系统。发布者设备发布有关特定主题的消息,订阅者设备订阅将由发布者发送的主题。最重要的是,多个设备可以订阅该主题。
2、MQTT – 消息
它是我们希望在通过MQTT协议连接的物联网设备之间共享的数据或命令。
3、MQTT- 主题
主题也是理解 MQTT 的第三个重要概念。在此协议中,多个设备可以订阅发布者,以根据其寄存器兴趣接收特定消息。主题定义我们要发布消息的设备。
4、MQTT 代理
MQTT 代理充当发送消息的客户端和接收这些消息的订阅者的中间人。在邮局的类比中,经纪人是邮局本身。所有消息都必须通过代理,然后才能传递给订阅者。
代理可能需要处理数百万个并发连接的 MQTT 客户端,因此在选择 MQTT 代理时,企业应根据其可扩展性、集成性、监控和抗故障能力对其进行评级。
三、MQTT 是如何工作的?
如前所述,MQTT 协议使资源约束的物联网设备能够将某些主题的信息发布或发送到充当 MQTT 消息代理的服务器。代理的功能是仅将该信息推送到以前订阅该主题的那些客户端。简而言之,我们可以解释这个基本思想,因为发布者负责通过经纪人生成信息并将其传输给订阅者。代理的主要功能是通过检查订阅者和发布者的授权来确保安全性。
为了解释 MQTT 协议的工作原理,我们将 MQTT 会话分为 4 个阶段,例如连接、身份验证、通信和终止。
首先,TCP / IP连接通过使用由代理操作定义的标准或自定义端口从客户端到代理启动。
建立连接时,请务必识别服务器是继续旧会话还是新会话。
如果向代理提供了重用的客户机身份,则旧会话将继续。
1、连接
正如我们上面提到的,MQTT协议是一种资源受限的协议,并且由于它在物联网设备中被广泛使用,因此SSL / TLS并不总是一种选择,因此在某些情况下是不可取的。但在这种情况下,此身份验证显示为明文用户名和密码,客户端通过将其附加到连接/connack 数据包序列将其发送到服务器。
2、身份验证和终止
在通信阶段,客户端可以执行发布、订阅、取消订阅和ping操作等操作。发布的基本功能是发送发布者定义的二进制数据块。内容的格式是特定于应用程序的。对于订阅服务,使用名为订阅/回购的数据包对,对于取消订阅操作,使用取消订阅/取消回购数据包对。
对于ping操作,客户端可以使用pingreq / pingresp数据包序列检查其与代理的连接。它使客户端与经纪人的连接保持活跃。要记住的重要一点是,发布者和订阅者之间没有直接联系。
四、MQTT 的通信类型
MQTT 有两种类型的通信,非加密通信/加密通信。
为这两种类型的通信分配了不同的端口号。如果我们谈论非加密通信的标准端口,则端口号为1883,如果我们需要使用标准端口进行加密通信,则端口号为8883,并且它们使用SSL / TLS
对于所需的SSL / TLS握手进程ID,在此过程中,客户端通过验证服务器证书来验证它将要使用的服务器。当客户端要与代理建立连接时。
客户端在连接建立握手期间向代理提供客户端证书。代理使用此证书对客户端进行身份验证。期望代理在SSL / TLS客户端证书的帮助下支持客户端的身份验证。
五、相关参考
MQTT 要点 - 所有核心概念解释 (hivemq.com)https://www.hivemq.com/mqtt-essentials/ MQTT client/server for C++
GitHub - redboltz/mqtt_cpphttps://github.com/redboltz/mqtt_cpp MQTT python库
泛美卫生组织-MQTT ·皮皮 (pypi.org)https://pypi.org/project/paho-mqtt/