MQTT 协议快速入门:基础知识和实用教程
在当今互联互通的世界中,各种设备通过网络无缝通信,实现自动化和数据交换。了解物联网和 MQTT 的相关知识变得愈加重要。本文是 MQTT 协议的入门指南,您可以通过本文了解 MQTT 的基本原理、核心概念及实际应用,快速开启 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 客户端编程系列文章,学习如何在 PHP、Node.js、Python、Golang、Node.js 等编程语言中使用 MQTT。
MQTT 的工作原理
要了解 MQTT 的工作原理,首先需要掌握以下几个概念:MQTT 客户端、MQTT Broker、发布-订阅模式、主题、QoS。
MQTT 客户端
任何运行 MQTT 客户端库的应用或设备都是 MQTT 客户端。例如,使用 MQTT 的即时通讯应用是客户端,使用 MQTT 上报数据的各种传感器是客户端,各种 MQTT 测试工具也是客户端。
MQTT Broker
MQTT Broker 是负责处理客户端请求的关键组件,包括建立连接、断开连接、订阅和取消订阅等操作,同时还负责消息的转发。一个高效强大的 MQTT Broker 能够轻松应对海量连接和百万级消息吞吐量,从而帮助物联网服务提供商专注于业务发展,快速构建可靠的 MQTT 应用。
关于 MQTT Broker 的更多详情,请参阅文章 2024 年最全面的 MQTT Broker 比较指南。
发布-订阅模式
发布-订阅模式与客户端-服务器模式的不同之处在于,它将发送消息的客户端(发布者)和接收消息的客户端(订阅者)进行了解耦。发布者和订阅者之间无需建立直接连接,而是通过 MQTT Broker 来负责消息的路由和分发。
TemperatureTemperature
主题
/
chat/room/1
sensor/10/temperature
sensor/+/temperature
+#
+a/+a/xa/y#a/#a/xa/b/c/d
注意:通配符主题只能用于订阅,不能用于发布。
关于 MQTT 主题的更多详情,请参阅文章通过案例理解 MQTT 主题与通配符。
QoS
MQTT 提供了三种服务质量(QoS),在不同网络环境下保证消息的可靠性。
- QoS 0:消息最多传送一次。如果当前客户端不可用,它将丢失这条消息。
- QoS 1:消息至少传送一次。
- QoS 2:消息只传送一次。
关于 MQTT QoS 的更多详情,请参阅文章 MQTT QoS 0, 1, 2 介绍。
MQTT 的工作流程
在了解了 MQTT 的基本组件之后,让我们来看看它的一般工作流程:
- 客户端使用 TCP/IP 协议与 Broker 建立连接,可以选择使用 TLS/SSL 加密来实现安全通信。客户端提供认证信息,并指定会话类型(Clean Session 或 Persistent Session)。
- 客户端既可以向特定主题发布消息,也可以订阅主题以接收消息。当客户端发布消息时,它会将消息发送给 MQTT Broker;而当客户端订阅消息时,它会接收与订阅主题相关的消息。
- MQTT Broker 接收发布的消息,并将这些消息转发给订阅了对应主题的客户端。它根据 QoS 等级确保消息可靠传递,并根据会话类型为断开连接的客户端存储消息。
开始使用 MQTT:快速教程
下面我们将通过一些简单的示例来展示如何使用 MQTT。在开始之前,需要准备 MQTT Broker 和 MQTT 客户端。
准备 MQTT Broker
您可以选择私有部署或完全托管的云服务来建立自己的 MQTT Broker。或者您也可以使用免费的公共 Broker。
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 协议进行通信之前,客户端需要创建一个 MQTT 连接来连接到 Broker。
New Connection
NameSimple DemoConnect
通过通配符订阅主题
Simple Demosensor/+/temperature
New SubscriptionTopicsensor/+/temperature
订阅成功后,会在订阅列表的中间看到新增了一条记录。
发布 MQTT 消息
+Sensor 1Sensor 2
连接创建成功后,会看到三个连接,每个连接左侧的在线状态指示灯都是绿色的。
Sensor 1sensor/1/temperature
{
"msg": "17.2"
}
如下图所示,消息发送成功。
Sensor 2sensor/2/temperature
{
"msg": "18.2"
}
Simple Demo
Simple Demo
MQTT 功能演示
保留消息
当 MQTT 客户端向服务器发布消息时,可以设置保留消息标志。保留消息存储在消息服务器上,后续订阅该主题的客户端仍然可以收到该消息。
Sensor 1Retainretained_message
Simple Demoretained_messageSensor 1
关于保留消息的更多细节,请阅读文章 MQTT 保留消息初学者指南。
Clean Session
MQTT 客户端通常只能在在线状态下接收其它客户端发布的消息。如果客户端离线后重新上线,它将无法收到离线期间的消息。
但是,如果客户端连接时设置 Clean Session 为 false,并且使用相同的客户端 ID 再次上线,那么消息服务器将为客户端缓存一定数量的离线消息,并在它重新上线时发送给它。
本次演示使用的公共 MQTT 服务器设置为缓存 5 分钟的离线消息,最大消息数为 1000 条,且不保存 QoS 0 消息。
下面,我们创建一个 MQTT 3.1.1 连接,并用 QoS 1 来演示 Clean Session 的使用。
MQTT 5.0 中将 Clean Session 拆分成了 Clean Start 与 Session Expiry Interval。详情请参考文章 Clean Start 与 Session Expiry Interval。
MQTT V3
clean_session_false
订阅成功后,点击右上角的断开按钮,断开连接。
MQTT_V3_Publishclean_session_false
MQTT_V3
关于 Clean Session 的更多细节,请阅读文章 MQTT Persistent Session 与 Clean Session 详解。
遗嘱消息
MQTT 客户端在向服务器发起 CONNECT 请求时,可以选择是否发送遗嘱消息标志,并指定遗嘱消息的主题和有效载荷。
如果 MQTT 客户端异常离线(在断开连接前没有向服务器发送 DISCONNECT 消息),MQTT 服务器会发布遗嘱消息。
Last Will
last_will1trueoffline
连接成功后,我们断开电脑网络超过 5 秒(模拟客户端异常断开连接),然后再恢复网络。
last_willLast Will
关于 MQTT 遗嘱消息的更多内容,请阅读文章 MQTT 遗嘱消息的使用。
2024 年值得关注的 7 大 MQTT 协议技术趋势
MQTT over QUIC
QUIC 是 Google 推出的一种基于 UDP 的新型传输协议,能够降低延迟、提高数据传输速率。将 QUIC 引入 MQTT 将为网络不稳定或低延迟要求的场景(如车联网和工业物联网)带来优势。EMQX 和未来的 MQTT 版本正逐步采用 MQTT over QUIC,将引领物联网连接标准的重要变革。
MQTT Serverless
Serverless MQTT 作为前沿的架构创新,使 MQTT 服务的快速部署变得轻而易举。此外,其资源自动扩展和按需付费模式提供了极大的灵活性,有望推动 MQTT 更广泛的应用,降低运营成本,激发不同行业的创新协作。我们甚至可能看到每个物联网和工业物联网开发者都能拥有一个免费的 Serverless MQTT 消息服务器。
MQTT 多租户架构
多租户架构是实现 Serverless MQTT 服务的一个重要基础。不同用户或租户的物联网设备可以连接至同一大规模 MQTT 集群,同时保持各自的数据和业务逻辑独立。支持多租户的 MQTT 服务器将降低管理负担,提升复杂场景或大规模物联网应用的灵活性。
MQTT Sparkplug 3.0
MQTT Sparkplug 定义了如何通过 MQTT 连接传感器、执行器、PLC 和网关等工业设备,旨在简化工业设备的连接与通信,实现高效的数据采集、处理和分析。最新的 3.0 版本引入了更多高级功能,有望在工业物联网中得到更广泛的应用。
MQTT 统一命名空间
统一命名空间(Unified Namespace)是一个建立在面向工业物联网和工业 4.0 的 MQTT Broker 上的解决方案架构。它采用星型拓扑,通过中央 MQTT Broker 连接工业设备、传感器和应用(如 SCADA、MES 和 ERP)。采用统一命名空间可以更高效地实现 OT 和 IT 系统的数据交换,最终实现统一。
MQTT 跨域集群
MQTT 跨域集群是一种创新架构,允许部署在不同区域或云端的 MQTT Broker 协同工作,形成一个统一的集群。它支持在多云环境中构建全球 MQTT 访问网络,使得本地接入的设备和应用无论物理位置如何都能相互通信。
MQTT Streams
MQTT Streams 是 MQTT 协议备受期待的一项扩展能力,能够在 MQTT Broker 内实时处理海量、高频的数据流。这一创新功能支持历史消息重播,确保数据一致性、审计和合规。内置的流处理功能将简化物联网数据处理架构,成为基于 MQTT 的物联网应用中实时数据管理的宝贵工具。
深入学习 MQTT
本文详细介绍了 MQTT 的基本概念和使用流程,您可以按照本文所学的内容尝试使用 MQTT 协议。
上一篇: 物联网通信协议MQTT