MQTT入门指南:2025年最全面的初学者教程
MQTT入门指南:2025年最全面的初学者教程
在快速发展的物联网世界中,设备间的高效通信至关重要,而MQTT协议正是实现这一目标的关键技术。本文将带你深入了解MQTT,这是一个专为低带宽、高延迟网络设计的轻量级发布/订阅协议。我们将从基础知识、核心概念到实际应用,全面解析MQTT的工作原理和使用方法。
什么是MQTT?
MQTT(Message Queuing Telemetry Transport)是一种轻量级的发布/订阅消息协议,特别设计用于资源受限的设备和低带宽、高延迟或不可靠的网络环境。它广泛应用于物联网(IoT)领域,为传感器、执行器和其他设备之间的通信提供高效解决方案。
为什么MQTT是物联网的最佳协议?
MQTT因其独特的特性和能力,成为物联网领域的首选协议。以下是其主要优势:
- 轻量级:物联网设备通常在处理能力、内存和能耗方面受到限制。MQTT的低开销和小数据包尺寸使其非常适合这些设备,即使在资源有限的情况下也能实现高效通信。
- 可靠性:物联网网络可能会遇到高延迟或不稳定连接的情况。MQTT支持不同服务质量(QoS)级别、会话感知和持久连接,确保在各种条件下可靠的消息传递。
- 安全通信:物联网网络传输敏感数据时需要保证安全性。MQTT支持传输层安全(TLS)和安全套接字层(SSL)加密,确保数据传输过程中的机密性。此外,它还通过用户名/密码凭据或客户端证书提供身份验证和授权机制,保护网络访问和资源安全。
- 双向通信:MQTT的发布/订阅模型允许设备之间无缝的双向通信。客户端既可以向特定主题发布消息,也可以订阅接收特定主题的消息,实现不同物联网生态系统中的有效数据交换,同时保持设备间的解耦,简化新设备的集成过程,确保易于扩展。
- 持续、有状态的会话:MQTT允许客户端与代理保持有状态的会话,即使在断开连接后也能记住订阅和未送达的消息。客户端还可以在连接时指定保持活动间隔,促使代理定期检查连接状态。如果连接丢失,代理会根据QoS级别存储未送达的消息,并在客户端重新连接时尝试发送,确保可靠通信并降低间歇性连接导致的数据丢失风险。
- 大规模物联网设备支持:物联网系统通常涉及大量设备,需要能够处理大规模部署的协议。MQTT的轻量级特性、低带宽消耗和高效资源利用使其非常适合大规模物联网应用。发布/订阅模式允许MQTT有效扩展,因为它解耦了发送者和接收者,减少了网络流量和资源使用。此外,协议对不同QoS级别的支持允许根据应用程序需求定制消息传递,确保在各种场景下实现最佳性能。
- 语言支持:物联网系统通常包含使用不同编程语言开发的设备和应用程序。MQTT广泛的语言支持使其能够轻松集成到多个平台和技术中,促进不同物联网生态系统中的无缝通信和互操作性。你可以访问我们的MQTT客户端编程博客系列,学习如何在PHP、Node.js、Python、Golang等编程语言中使用MQTT。
MQTT如何工作?
MQTT通过发布/订阅模式运行,其中MQTT客户端要么向特定主题发布消息,要么订阅主题以接收消息,所有这些都由MQTT代理管理,以确保根据指定的服务质量(QoS)级别进行消息传递。
MQTT客户端
任何运行MQTT客户端库的应用程序或设备都是MQTT客户端。例如,使用MQTT的即时通讯应用是一个客户端,使用MQTT报告数据的各种传感器是客户端,各种MQTT测试工具也是客户端。
MQTT代理
MQTT代理处理客户端连接、断开连接、订阅和取消订阅请求,并负责路由消息。一个强大的MQTT代理可以支持大规模连接和百万级的消息吞吐量,帮助物联网服务提供商专注于业务并快速创建可靠的MQTT应用。
发布/订阅模式
发布/订阅模式与客户端/服务器模式不同,它将发送消息的客户端(发布者)与接收消息的客户端(订阅者)分开。发布者和订阅者不需要建立直接连接,MQTT代理负责路由和分发所有消息。
下图展示了MQTT的发布/订阅过程。温度传感器作为客户端连接到MQTT服务器,并向主题(例如Temperature)发布温度数据,服务器接收消息并将其转发给订阅Temperature主题的客户端。
MQTT主题
MQTT协议基于主题路由消息。主题通过斜杠(/)区分层次结构,类似于URL路径,例如:
chat/room/1
sensor/10/temperature
sensor/+/temperature
MQTT主题支持以下通配符:
+
:表示单层通配符,例如a/+
匹配a/x
或a/y
。#
:表示多层通配符,例如a/#
匹配a/x
、a/b/c/d
。
MQTT服务质量(QoS)
MQTT提供三种服务质量级别,以确保在不同网络环境中可靠的消息传递:
- QoS 0:消息最多传递一次。如果客户端当前不可用,可能会丢失此消息。
- QoS 1:消息至少传递一次。
- QoS 2:消息仅传递一次。
MQTT工作流程
现在我们了解了MQTT的基本组件,让我们看看一般的工作流程:
- 客户端与代理建立连接:使用TCP/IP协议,可选TLS/SSL加密进行安全通信。客户端提供身份验证凭据,并指定干净或持久会话。
- 客户端发布或订阅消息:发布客户端将消息发送到代理,而订阅客户端表示对特定主题的消息感兴趣。
- 代理接收并转发消息:代理接收发布的消息,并将其转发给所有订阅相关主题的客户端。它根据指定的服务质量(QoS)级别确保可靠的消息传递,并根据会话类型管理离线客户端的消息存储。
开始使用MQTT:快速教程
现在我们将通过几个简单的示例演示如何开始使用MQTT。在开始之前,你需要准备一个MQTT代理和一个MQTT客户端。
MQTT代理设置
EMQX是一个可扩展的分布式MQTT消息平台,支持无限连接,提供无缝集成,并可在任何地方部署。它提供了各种版本以满足不同用户的需求。
准备MQTT客户端
在本教程中,我们将使用MQTTX提供的MQTT客户端工具,该工具支持浏览器访问:https://mqttx.app/web-client。MQTTX还提供了桌面客户端和命令行工具。
MQTTX是一个优雅的跨平台MQTT 5.0桌面客户端,可在macOS、Linux和Windows上运行。其用户友好的聊天风格界面使用户能够轻松创建多个MQTT/MQTTS连接并订阅/发布MQTT消息。
目前,所有编程语言都有成熟的开源MQTT客户端库。我们选择了各种编程语言的流行MQTT客户端库和SDK,并提供了代码示例,帮助你快速了解MQTT客户端的使用。
创建MQTT连接
在使用MQTT协议进行通信之前,客户端需要创建一个MQTT连接以连接到代理。
打开https://mqttx.app/web-client并在页面中间点击"New Connection"按钮,你将看到以下页面。
我们在"Name"中输入"Simple Demo",然后点击右上角的"Connect"按钮创建MQTT连接。如下所示,表示连接成功建立。
要了解更多关于MQTT连接参数的信息,请查看我们的博客文章:如何设置MQTT连接参数。
订阅通配符主题
接下来,我们在之前创建的"Simple Demo"连接中订阅通配符主题"sensor/+/temperature",这将接收所有传感器报告的温度数据。
如图所示,点击"New Subscription"按钮,在弹出框的"Topic"字段中输入"sensor/+/temperature",保持默认的QoS为0。
订阅成功后,你将在订阅列表中间看到一个新的记录。
发布MQTT消息
接下来,我们点击左侧菜单中的"+"按钮创建两个连接,分别命名为"Sensor 1"和"Sensor 2",以模拟两个温度传感器。
创建连接后,你会看到三个连接,连接左侧的状态点都将是绿色的。
选择"Sensor 1"连接,在页面左下角输入发布主题"sensor/1/temperature",在消息框中输入以下JSON格式的消息,然后点击右下角的发布按钮发送消息:
{
"msg": "17.2"
}
消息发送成功如下所示。
使用相同步骤,将以下JSON消息发布到"Sensor 2"连接的"sensor/2/temperature"主题:
{
"msg": "18.2"
}
你将在"Simple Demo"连接中看到两条新消息。
点击"Simple Demo"连接,你将看到两个传感器发送的两条消息。
MQTT功能演示
保留消息
当MQTT客户端向服务器发布消息时,可以设置保留消息标志。保留消息驻留在消息服务器上,后续订阅该主题的订阅者仍然可以接收到该消息。
如图所示,我们在"Sensor 1"连接中向"retained_message"主题发送两条消息,同时勾选"Retain"选项。
然后,我们在"Simple Demo"连接中订阅"retained_message"主题。订阅成功后,将收到"Sensor 1"发送的第二条保留消息,这表明服务器只为一个主题保留最后一条保留消息。
要了解更多关于保留消息的信息,请查看博客:MQTT保留消息入门指南。
清洁会话
通常,MQTT客户端只有在线时才能接收其他客户端发布的消息。如果客户端离线后再上线,将不会接收到离线期间的消息。
但是,如果客户端连接时将清洁会话设置为false,并使用相同的客户端ID重新上线,那么消息服务器将为客户端保留一定数量的离线消息,并在客户端重新上线时发送这些消息。
用于本演示的公共MQTT服务器设置为保留5分钟的离线消息,最大消息数为1000(不包括QoS 0消息)。
接下来,我们创建一个MQTT 3.1.1连接并使用QoS 1演示清洁会话。
MQTT 5使用Clean Start和Session Expiry Interval来改进Clean Session。有关详细信息,请参阅博客:Clean Start和Session Expiry Interval。
创建一个名为"MQTT V3"的连接,将Clean Session设置为false,选择MQTT版本3.1.1。
成功连接后,订阅"clean_session_false"主题,设置QoS为1。
成功订阅后,点击右上角的Disconnect按钮断开连接。
接下来,创建一个名为"MQTT_V3_Publish"的连接,MQTT版本也设置为3.1.1。连接成功后,向"clean_session_false"主题发布三条消息。
然后选择"MQTT_V3"连接,点击连接按钮重新连接到服务器,你将收到三条离线消息。
要了解更多关于清洁会话的信息,请查看博客:MQTT持久会话和清洁会话详解。
最后遗愿
当MQTT客户端向服务器发送CONNECT请求时,可以设置是否发送最后遗愿消息的标志,以及主题和负载。
当MQTT客户端异常断线(在客户端断开连接前未向服务器发送DISCONNECT消息),MQTT服务器将发布最后遗愿消息。
如图所示,我们创建一个名为"Last Will"的连接。
- 为了快速查看效果,我们将Keep Alive设置为5秒。
- 将Last-Will Topic设置为"last_will"。
- 将Last-Will QoS设置为1。
- 将Last-Will Retain设置为true。
- 将Last-Will Payload设置为"offline"。
连接成功后,断开计算机网络超过5秒(模拟客户端异常断线),然后重新打开网络。
然后启动"Simple Demo"连接,订阅"last_will"主题。你将收到"Last Will"连接设置的最后遗愿消息。
要了解更多关于MQTT最后遗愿消息的信息,请查看博客:MQTT最后遗愿消息的使用。
MQTT与其他协议的比较
除了MQTT,HTTP、WebSocket和CoAP等协议也在物联网领域广泛应用。与这些协议相比,MQTT在带宽消耗和轻量级发布/订阅模型方面具有显著优势,使其更适合资源受限的环境和大规模设备网络。
要详细了解MQTT与其他协议的比较,请查看以下博客文章:
MQTT高级主题
MQTT安全最佳实践
由于MQTT在物联网中的广泛应用,设备通常容易受到攻击,管理敏感数据。如果没有强大的安全性,攻击者可能会利用漏洞拦截消息、操纵数据或破坏关键系统,可能导致重大损害。为了确保MQTT的安全,采用了多种常见方法:
通过采用这些措施,组织可以保护MQTT通信,保护物联网系统的完整性和机密性。
MQTT数据存储
数以百万计的设备通过MQTT持续生成有价值的数据,当存储和分析时,这些数据变得更加有用。然而,根据MQTT协议规范,MQTT代理本身并不处理数据存储。因此,将其与适当的数据库解决方案集成对于有效管理和利用数据至关重要。选择合适的数据库可以增强物联网应用,确保高效的数据存储和可扩展性。
获取关于MQTT数据库选择的全面指南:MQTT数据存储数据库选择指南。
2025年MQTT八大趋势
MQTT over QUIC
QUIC是Google推出的新传输协议,运行在UDP之上,通过减少延迟和提高数据传输速率来革新互联网连接。将其引入MQTT将为具有不可靠网络或低延迟要求的场景(如联网汽车和工业物联网)带来益处。EMQX和未来的MQTT版本正在拥抱MQTT over QUIC,标志着物联网连接标准的重大转变。
要了解更多信息,请查看博客:MQTT over QUIC:下一代物联网标准协议。
MQTT Serverless
无服务器MQTT代理作为架构创新的前沿,通过点击几下即可快速部署MQTT服务。此外,无服务器MQTT提供无与伦比的灵活性,支持资源的无缝扩展和按需付费的定价模式。它正致力于为每位物联网开发者创建一个免费的无服务器MQTT代理的未来。
MQTT多租户
多租户架构是无服务器MQTT代理的重要组成部分。来自不同用户或租户的物联网设备可以连接到同一个大规模MQTT集群,同时保持其数据和业务逻辑与其他租户隔离。支持多租户的MQTT代理可以减少管理开销,并为复杂场景或大规模物联网应用提供更大的灵活性。
要了解更多信息,请查看博客:MQTT中的多租户架构:关键点、优势和挑战。
MQTT Sparkplug 3.0
MQTT Sparkplug定义了如何使用MQTT连接工业设备,包括传感器、执行器、PLC和网关。其目标是简化与不同工业设备的连接和通信,并实现工业数据的有效采集、处理和分析。最新3.0版本具有更多高级功能,有望在工业物联网中得到更广泛的应用。
要了解更多信息,请查看博客:MQTT Sparkplug:在工业4.0中连接IT和OT。
MQTT统一命名空间
统一命名空间是在MQTT代理上构建的解决方案架构,用于工业物联网和工业4.0。它使用中心MQTT代理以星形拓扑连接工业设备、传感器和应用程序,如SCADA、MES和ERP。通过采用统一命名空间,可以实现OT和IT系统更高效的数据交换,并最终在物联网时代统一它们。
要了解更多信息,请查看博客:统一命名空间(UNS):工业物联网的下一代数据架构。
MQTT地理分布
MQTT地理分布是一种创新架构,允许部署在不同地区或云中的MQTT代理作为一个集群协同工作。它使组织能够构建跨越多云的全球MQTT访问网络,设备和应用程序可以从最近的网络端点本地连接,无论其物理位置如何,都可以相互通信。
要了解更多信息,请查看博客:超越边界:探索EMQX中的地理分布。
MQTT流
MQTT流是MQTT协议的预期扩展,旨在在MQTT代理中管理高容量、高频数据流的实时处理。这一创新使历史消息重放成为可能,确保数据一致性、审计和合规性。内置的流处理能力将简化基于MQTT的物联网应用中的数据处理堆栈,成为实时数据管理的重要工具。
MQTT与AI
物联网的快速增长和人工智能的兴起为智能、互联系统开辟了新的可能性。MQTT在AI应用中扮演着关键角色,它为AI提供了神经系统的功能——可靠且快速地传输信号,使LLMs和其他模型能够在我们的互联环境中感知、推理和行动。这个旅程才刚刚开始,但MQTT的成熟能力和持续增强意味着它将继续成为AIoT创新的重要支柱。
要了解更多信息,请查看白皮书:MQTT平台与AI:为AI赋能实时数据。
更多关于MQTT的学习资源
我们已经完成了对MQTT基本概念和使用过程的全面介绍。现在你可以开始使用MQTT协议了。对于MQTT主题、通配符、保留消息、最后遗愿和其他功能的更多详细信息,你可以查看EMQ提供的"MQTT指南2025:从入门到高级"文章系列。这个系列将带你深入了解MQTT的高级应用,并帮助你开始MQTT应用和服务开发。