文章目录
一、前言
本篇文章主要介绍MQTT入门基础知识,什么是MQTT、MQTT的特点、MQTT客户端、MQTT Broker、发布-订阅模式、主题、QoS,以及通过一个示例,进行订阅和发布消息,让读者对MQTT的工作原理和工作流程有个直观的了解和感受。就像一盘菜,学习如何炒这盘菜之前,咱们先知道这盘菜的原料,尝尝这盘菜的味道。
二、什么是 MQTT
MQTT(Message Queuing Telemetry Transport 消息队列遥测传输)是一种轻量级、基于发布-订阅模式的消息传输协议,适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境。它在物联网应用中广受欢迎,能够实现传感器、执行器和其它设备之间的高效通信。
三、MQTT的特点
MQTT 所具有的适用于物联网特定需求的特点和功能,使其成为物联网领域最佳的协议之一。它的主要特点包括:
- 轻量级: 物联网设备通常在处理能力、内存和能耗方面受到限制。MQTT 开销低、报文小的特点使其非常适合这些设备,因为它消耗更少的资源,即使在有限的能力下也能实现高效的通信。
- 可靠: 物联网网络常常面临高延迟或连接不稳定的情况。MQTT 支持多种 QoS 等级、会话感知和持久连接,即使在困难的条件下也能保证消息的可靠传递,使其非常适合物联网应用。
- 安全通信: 安全对于物联网网络至关重要,因为其经常涉及敏感数据的传输。为确保数据在传输过程中的机密性,MQTT 提供传输层安全(TLS)和安全套接层(SSL)加密功能。此外,MQTT 还通过用户名/密码凭证或客户端证书提供身份验证和授权机制,以保护网络及其资源的访问。
- 双向通信: MQTT 的发布-订阅模式为设备之间提供了无缝的双向通信方式。客户端既可以向主题发布消息,也可以订阅接收特定主题上的消息,从而实现了物联网生态系统中的高效数据交换,而无需直接将设备耦合在一起。这种模式也简化了新设备的集成,同时保证了系统易于扩展。
- 连续、有状态的会话: MQTT 提供了客户端与 Broker 之间保持有状态会话的能力,这使得系统即使在断开连接后也能记住订阅和未传递的消息。此外,客户端还可以在建立连接时指定一个保活间隔,这会促使 Broker 定期检查连接状态。如果连接中断,Broker 会储存未传递的消息(根据 QoS 级别确定),并在客户端重新连接时尝试传递它们。这个特性保证了通信的可靠性,降低了因间断性连接而导致数据丢失的风险。
- 大规模物联网设备支持: 物联网系统往往涉及大量设备,需要一种能够处理大规模部署的协议。MQTT 的轻量级特性、低带宽消耗和对资源的高效利用使其成为大规模物联网应用的理想选择。通过采用发布-订阅模式,MQTT 实现了发送者和接收者的解耦,从而有效地减少了网络流量和资源使用。此外,协议对不同 QoS 等级的支持使得消息传递可以根据需求进行定制,确保在各种场景下获得最佳的性能表现。
- 语言支持: 物联网系统包含使用各种编程语言开发的设备和应用。MQTT 具有广泛的语言支持,使其能够轻松与多个平台和技术进行集成,从而实现了物联网生态系统中的无缝通信和互操作性。
四、MQTT 客户端
MQTT客户端是一个实现MQTT协议的应用程序或库,或者换一种说法,任何运行 MQTT 客户端库的应用或设备都是 MQTT 客户端。不同编程语言都有相应的MQTT客户端库,例如Python的paho-mqtt和Java的Eclipse Paho等。选择适合的客户端取决于具体的需求和开发环境。
MQTT客户端通常用于物联网设备、移动应用或任何需要低带宽、可靠通信的场景,负责与MQTT Broker(服务器)进行通信。主要功能包括:
- 连接/断开连接: 与MQTT Broker建立并维护连接,可随时断开。
- 订阅主题: 接收特定主题的消息。
- 发布消息: 将消息发送到某个主题。
- 处理消息: 接收和处理从代理发送过来的消息。
五、MQTT Broker
MQTT Broker 是 MQTT 协议中的核心组件,负责管理客户端之间的消息传输。它的主要功能包括:
- 消息路由: 接收来自客户端的消息,并根据主题将消息转发给订阅了该主题的客户端。
- 客户端管理: 处理客户端的连接、断开、订阅和取消订阅请求。
- 消息保留: 对某些主题保留最新消息,供新连接的客户端获取。
- 会话管理: 存储持久会话信息,以便在客户端重新连接时继续传输未收到的消息。
MQTT Broker 确保消息在客户端之间可靠地传递,常用的开源 Broker 有 Mosquitto、EMQX 和 HiveMQ 等。
六、发布-订阅模式
发布-订阅模式(Publish-Subscribe)是一种消息传递架构,适用于解耦发送者和接收者。具体而言:
发布者(Publisher):
负责发送消息,但不需要知道谁将接收消息。
发布消息到某个主题(Topic)。
订阅者(Subscriber):
通过订阅主题来表达对某种消息的兴趣。
接收所有发布到所订阅主题的消息。
消息代理(Broker):
负责管理并路由消息。
接收来自发布者的消息,并转发给合适的订阅者。
优点:
松散耦合: 发布者和订阅者不直接通信,降低了依赖。
灵活性: 可以动态添加或移除订阅者,系统扩展性高。
简化通信: 通过主题组织消息,无需管理每个连接。
这种模式非常适合需要多对多通信的场景,如物联网应用、通知系统等。MQTT就是一个典型的支持发布-订阅模式的协议。发布-订阅模式与客户端-服务器模式的不同之处在于,它将发送消息的客户端(发布者)和接收消息的客户端(订阅者)进行了解耦。发布者和订阅者之间无需建立直接连接,而是通过 MQTT Broker 来负责消息的路由和分发。
下图展示了 MQTT 发布/订阅过程。温度传感器作为客户端连接到 MQTT Broker,并通过发布操作将温度数据发布到一个特定主题(例如 Temperature)。MQTT Broker 接收到该消息后会负责将其转发给订阅了相应主题(Temperature)的订阅者客户端。

七、主题
MQTT 协议根据主题来转发消息。MQTT 主题本质上是一个 UTF-8 编码的字符串,是 MQTT 协议进行消息路由的基础。MQTT 主题类似 URL 路径,使用斜杠 / 进行分层。
home/temperature/living_room
home/#
sensor/10/temperature
sensor/+/temperature
为了避免歧义且易于理解,通常不建议主题以 / 开头或结尾,例如 /sensor 或 sensor/。
主题有以下特点:
- 层级结构: 主题可以有多个层级,用斜杠(/)分隔,例如 home/temperature/living_room。
- 灵活订阅: 订阅者可以通过精确主题或主题通配符来接收消息。
单层通配符(+):匹配某一特定层级。例如 a/+ 匹配 a/x 或 a/y。
多层通配符(#):匹配一个或多个层级。例如 a/# 匹配 a/x、a/b/c/d。
注意:通配符主题只能用于订阅,不能用于发布。
主题决定了消息的流向,是发布者和订阅者之间的主要连接方式。
关于主题和通配符后面我们会有一篇文章来详细介绍。
八、QoS
在MQTT中,QoS(服务质量)定义了消息交付的保障等级,确保消息在不同的网络条件下被可靠地传递。MQTT支持三种QoS等级:
QoS 0:最多一次(At most once)
消息被发送一次,且不确认。
没有重传,即消息可能会丢失。
使用场景:网络可靠性要求不高,数据丢失可接受。
QoS 1:至少一次(At least once)
确保消息至少送达一次,但可能会重复。
发布者需要确认消息是否到达,并可以重传。
使用场景:需要保证消息到达,但允许重复处理。
QoS 2:仅一次(Exactly once)
确保消息仅送达一次且不重复。
通过一系列确认握手实现,开销较大。
使用场景:对消息的唯一性和准确性有严格要求。
选择合适的QoS等级可以在通信可靠性和网络开销之间进行权衡。
关于QoS后面我们会有一篇文章来详细介绍。
九、示例
下面我们通过示例来展示如何使用 MQTT,让读者对MQTT的工作原理和工作流程有个直观的了解和感受。在开始之前,需要准备 MQTT Broker 和 MQTT 客户端。
1、MQTT Broker
可以选择私有部署或完全托管的云服务来建立自己的 MQTT Broker。或者您也可以使用免费的公共 Broker。
在本文中,我们将使用 EMQ 提供的免费公共 MQTT Broker,它基于完全托管的 MQTT 云服务 - EMQX Cloud 创建。服务器信息如下:
Server: broker.emqx.io
TCP Port: 1883
WebSocket Port: 8083
SSL/TLS Port: 8883
Secure WebSocket Port: 8084
2、MQTT 客户端
在本文中,我们将使用 MQTTX 提供的桌面客户端工具。MQTTX桌面客户端下载地址桌面客户端
MQTTX 还提供了支持浏览器访问的 MQTT 客户端工具,浏览器访问地址为 https://mqttx.app/web-client/
MQTTX 是一款跨平台的 MQTT 5.0 桌面客户端,可在 macOS、Linux、Windows 操作系统上运行。其用户友好的聊天式界面使用户能够轻松创建多个 MQTT/MQTTS 连接,并进行 MQTT 消息的订阅和发布。
3、创建 MQTT 连接
客户端创建一个 MQTT 连接来连接到 Broker(服务器)。
打开 MQTT 客户端

点击页面中间的 New Connection 按钮,将看到如下页面

在 Name 中输入 Client Demo0,然后点击右上角的 Connect 按钮,建立一个 MQTT 连接。如下图所示,表示连接成功。

4、订阅主题
我们在上面创建的 Client Demo0 连接中通过通配符订阅主题 test/+/information,这样就可以接收所有发布到这个主题上的消息。
如下图所示,点击 New Subscription 按钮,在弹出框中的 Topic 字段中输入主题 test/+/information,QoS 保持默认值 0。

订阅成功后,会在订阅列表的中间看到新增了一条记录。

5、发布 MQTT 消息
接下来,我们点击左侧菜单上的 + 按钮创建两个连接,分别命名为 Client Demo1 和 Client Demo2,用来发布 MQTT 消息。

连接创建成功后,会看到三个连接,每个连接左侧的在线状态指示灯都是绿色的。

选择 Client Demo1 连接,在页面下方的发布主题中输入 test/1/information,在消息框中输入以下 JSON 格式的消息,然后点击右下方的发布按钮发送消息。
{
“msg”: “demo1”
}

如下图所示,消息发送成功。

使用相同的步骤,在 Client Demo2 连接中发布以下 JSON 消息到 test/2/information 主题。
{
“msg”: “demo2”
}
我们看到 Client Demo0 连接收到两条新消息。

点击 Client Demo0 连接,会看到 Client Demo1 和 Client Demo2 发布的消息。

本篇文章,总结到此,有建议或疑问,欢迎评论区沟通交流。