最全面的 MQTT 学习资源。从基础概念到高级模式,从首次连接到生产部署,助您全面掌握 MQTT。
从这里开始您的 MQTT 之旅。深入理解核心概念、协议机制和基础模式。
超越基础。探索 QoS、安全机制、集群部署和性能调优等进阶主题。
MQTT 术语和概念的权威参考手册。
有时我们也会直接将服务端称为 Broker,这两个术语可以互换使用。
客户端可以在连接时使用这个字段来指示是期望从已存在的会话中恢复通信,还是创建一个全新的会话。仅限 MQTT v5.0。
使用 MQTT 协议连接到服务端的设备或应用程序,并通过服务端完成发布订阅。
Client ID 用于唯一标识客户端连接与会话,MQTT 允许客户端自行指定 Client ID,也支持由服务端统一为客户端分配 Client ID。
MQTT 客户端与 MQTT 服务端之间的网络连接。MQTT 客户端之间并不会直接建立连接。
用来描述消息的内容类型,方便接收方处理。可以使用 MIME 类型,例如 text/plain,也可以使用自定义的字符串来描述消息内容。仅限 MQTT v5.0。
MQTT v5.0 通过新增的 AUTH 报文实现了对增强认证的支持,在原先通过 Username 和 Password 提供的密码认证和 Token 认证的基础上进行了扩展。
它更像是一种认证框架,允许使用各种更安全的认证机制,例如 SCRAM 认证就支持服务端和客户端互相确认对方的身份,以抵御中间人攻击。
MQTT v5.0 引入了流控机制,允许客户端和服务端根据自己的接收能力约定对方的最大消息发送速率,避免了一方发送过快,导致网络拥塞和接收方过载的问题。
Keep Alive 表示客户端在传输完成一个 MQTT 控制报文到发送下一个报文,两者之间允许空闲的最大的时间间隔。
如果没有其他控制报文可以发送,客户端必须发送一个 PINGREQ 报文。
如果服务端在 1.5 倍的 Keep Alive 时间内没有收到任何客户端的控制报文,它就会断开连接。
通常指 PUBLISH 报文。
MQTT v5.0 允许客户端为消息设置过期时间,避免在服务端中停留了较长时间的消息仍然被转发给订阅端。
MQTT over ... 指的是 MQTT 运行在什么协议之上。常见的有 MQTT over TCP、MQTT over TLS 等。
MQTT 协议只要求基础传输层能够提供有序、可靠的双向传输字节流,并未强制指定使用某种传输协议。
MQTT over QUIC 是 EMQX 对 MQTT 的一个扩展。相比于 TCP,QUIC 能够有效减少连接开销和弱网环境下的消息延迟,同时还具备多路复用、连接迁移、端到端加密等特性,为现代移动互联网提供了一个更加灵活可靠的传输层。
OASIS 技术委员会于 2014 年 10 月发布的 MQTT 规范。
OASIS 技术委员会于 2019 年 3 月发布的 MQTT 规范,也是目前最新的 MQTT 规范。MQTT v5.0 在引入大量新特性的同时,仍然向后兼容 v3.1.1。
通常指 MQTT 的控制报文。MQTT 协议通过交换预定义的 MQTT 控制报文来通信。
例如用于连接的 CONNECT、AUTH(仅限 MQTT v5.0) 报文,用于发布的 PUBLISH 报文,以及用于订阅的 SUBSCRIBE 报文等等。
报文标识符用于在客户端和服务端之间唯一地标识一条 QoS 大于 0 的消息或一个订阅/取消订阅请求。
报文标识符的设置通常都在客户端和服务端的内部完成。
MQTT 报文中的有效载荷部分,根据报文类型,有效载荷的内容会有所不同。
对于 PUBLISH 报文来说,有效载荷即消息的实际内容。而对于 SUBSCRIBE 报文来说,有效载荷指的是订阅列表。
不过大部分情况下,如无特别说明,Payload 都是指 PUBLISH 报文中消息的实际内容。
用于指示消息内容(包括遗嘱消息)是否是 UTF-8 编码的字符串。仅限 MQTT v5.0。
客户端需要及时发送 PINGREQ 报文告知服务端自己还活着。
服务端也需要及时响应 PINGRESP 报文以便客户端判断网络和服务端的活动状态。
MQTT 为绝大部分的控制报文中都定义了一组可选属性。不同类型的控制报文有不同的可选属性。
例如 Session Expiry Interval 是 CONNECT 报文的一个可选属性,Topic Alias 则是 PUBLISH 报文的一个可选属性。
发布订阅机制是 MQTT 协议的核心。它解耦了消息的发送方(发布者)和接收方(订阅者),引入了一个中间代理的角色来完成消息的路由和分发。
发布者和订阅者不需要知道彼此的存在,他们之间唯一的联系就是对消息的一致约定,例如消息将使用什么主题、消息将包含哪些字段等等。
通过发布订阅机制,我们可以实现消息的广播、组播和单播。
MQTT 定义了三种 QoS 等级,来分别提供不同的消息可靠性保证。每条消息都可以在发布时独立设置自己的 QoS。
QoS 0:最多交付一次,消息可能丢失。
QoS 1:至少交付一次,消息可以保证到达,但是可能重复到达。
QoS 2:只交付一次,消息保证到达,并且不会重复。
MQTT 通过 CONNACK 等响应报文中的 Reason Code 字段来指示操作结果。
MQTT v5.0 扩展了 Reason Code 以便反映更准确的结果,并且令所有响应报文都支持了 Reason Code。
Reason Code 通常是机器易读的,所以 MQTT 还提供了 Reason String 来承载人类可读的内容,在 Reason Code 的基础上进一步指示结果。仅限 MQTT v5.0。
用于声明服务端和客户端愿意同时处理的 QoS 1 和 QoS 2 的消息的最大数量,对端在发送消息时需要遵守这个限制。仅限 MQTT v5.0。
MQTT 的发布订阅机制使得发布端最多只能确保消息到达了服务端,但不能确保消息到达了订阅端,我们必须借助额外的请求响应机制。
MQTT v5.0 改善了对请求响应的支持,请求方可以在请求中直接指定响应主题,这样请求方和响应方无需再提前约定主题。同时,他们还可以通过对比数据来确保请求和响应的正确匹配。
保留消息除了与正常消息一样被转发以外,还会保留在 MQTT 服务端中。
当一个新的订阅被创建,如果服务端中存在与该订阅匹配的保留消息,那么这些保留消息就会被发送给订阅者。
服务端只能为每个主题存储一条最新的保留消息。
MQTT 支持多种安全机制,包括但不限于:支持在传输层使用 TLS 来提供端到端的安全连接,保护消息免受窃听、篡改或伪造;在 MQTT 协议层面支持对客户端和服务端的身份验证,以及对客户端的授权检查,以确保只有授权用户才能访问特定的主题。
在发布消息的客户端和订阅的客户端之间充当中介的设备或应用程序,它的首要职责是将所有接收到的消息转发给匹配的订阅客户端。
MQTT v5.0 允许服务端发出 DISCONNECT 报文,以便向客户端指示连接被关闭的具体原因。
MQTT v5.0 允许服务端通过 CONNACK 或者 DISCONNECT 报文中的服务端参考属性指示客户端临时或永久切换至另一台服务端。
MQTT 的会话机制确保了 QoS 1、2 消息的协议流程得以实现。
会话是客户端与服务端之间的有状态交互,存储了 QoS 1、2 消息的传输状态以及订阅信息等状态信息。
它可以仅持续和网络连接一样长的时间,也可以跨越多个网络连接存在。我们通常将后者称为持久会话。
我们可以选择让连接从已存在的会话中恢复,也可以选择从一个全新的会话开始。
会话过期时间。表示客户端连接断开后会话能够在服务端中保留多久,仅限 MQTT v5.0。
服务端通过这个字段告知客户端本次连接是之前会话的延续还是一个全新的会话,以便客户端做出相应的调整。
MQTT v5.0 允许将客户端划分为多个订阅组,消息仍然会被转发给所有订阅组,但一个订阅组内的客户端将以随机、轮询等策略交替接收消息。
这使得订阅者能够以负载均衡的方式来消费消息。
一些 MQTT Server 例如 EMQX 在协议之外为非 MQTT v5.0 的设备提供了共享订阅的支持。
客户端可以在订阅时指定订阅标识符,服务端在转发与这些订阅匹配的消息时需要附上与之关联的订阅标识符。
在特定的使用场景下,订阅标识符可以帮助减少需要传输的数据量,或者帮助客户端确定为消息触发哪个回调。
MQTT 允许客户端为自己每个订阅使用不同的订阅选项,例如订阅建立时是否需要接收保留消息,服务端可以向自己发送的消息的最大 QoS 等等。
MQTT v3.1.1 仅支持设置最大 QoS。
主题被用来标识和区分不同的消息,它是 MQTT 消息路由的基础。发布者可以在发布时指定消息的主题,订阅者则可以选择订阅自己感兴趣的主题来接收相关的消息。
MQTT v5.0 允许发送端将主题名映射成由一个双字节整数表示的别名,然后在消息传输时用别名替换原本的主题名,以此降低带宽消耗。
主题过滤器在订阅时使用,可以包含主题通配符来同时订阅多个主题。
主题名在发布消息时使用,不允许使用主题通配符。
MQTT 提供了两种主题通配符,分别是 + 表示的单层通配符和 # 表示的多层通配符。通配符只能在主题过滤器中使用。
MQTT 在连接报文中提供了可选的 Username 和 Password 字段,以实现对密码认证和 Token 认证的支持。
MQTT v5.0 允许客户端和服务端将自定义的、不限数量的字符串键值对作为元数据添加到除 PING 报文以外的所有控制报文当中,以提供更好的可扩展性。
用户属性可以在客户端和服务端之间传递,也可以在客户端和客户端之间传递,这主要取决于具体的控制报文类型。
用于指示遗嘱消息可以在连接断开后延迟多久发出,仅限 MQTT v5.0。
如果客户端不正常地断开连接,那么该客户端在连接时设置的遗嘱消息就会被服务端转发给其他的客户端。
遗嘱消息和普通消息一样具有主题、QoS、Payload、保留消息标识位等字段。
以 $ 开头的主题必须由服务端来决定其使用方式和场景,客户端不能仅出于自己的目的来随意使用这类主题。
例如 $share 开头的主题用于共享订阅,$SYS 开头的主题通常被服务端用于发布系统消息。
EMQX 还定义了 $delay 前缀用于实现消息的延迟发布。
我们的专家为您解答关于 MQTT 协议和 EMQX 的常见问题。
MQTT 是用于物联网连接的 OASIS 标准。它是一种基于发布订阅模式的轻量级消息传输协议,专为资源受限的设备和低带宽、高延迟、不可靠的网络环境设计,并且能够提供一定程度的消息可靠性保证。得益于这些特性,MQTT 被广泛应用于车联网、工业制造和移动通信等场景。
目前 MQTT 的主要版本有 v3.1.1 和 v5.0。MQTT v5.0 于 2019 年 3 月发布,相比 v3.1.1 引入了众多改进和增强功能。目前市面上绑大多数客户端和 Broker 都已支持 MQTT v5.0。
MQTT 基于发布订阅模式运行,有效地分离了消息发送方和接收方,并且需要 Broker 这一关键的中间角色。Broker 是 MQTT 客户端之间消息传输的桥梁,负责接收来自客户端的消息,并根据消息主题将其路由到相应的订阅者。
EMQX 是全球最具扩展性的开源 MQTT 消息服务器,专为物理 AI 和现代物联网而设计。作为云原生的分布式消息服务器,EMQX 为关键任务应用提供核心支撑——支持超过 1 亿并发连接,每秒处理数百万条消息,同时保持超低延迟。
是的。EMQX 提供了全面的 SSL/TLS 能力支持,包括单向/双向认证、X.509 证书认证、SNI 等。
EMQX 不仅支持为包括 MQTT 在内的所有客户端连接启用 TLS 以确保接入和消息传输安全,还支持为所有外部资源连接启用 TLS,以保障访问外部资源时的数据安全。
主题用于标识和区分不同的消息,是 MQTT 消息路由的基础。发布者可以在发布消息时指定主题,订阅者则可以选择订阅感兴趣的主题以接收相关消息。
MQTT 是一种广泛应用于物联网等领域的消息传输协议。MQTT 需要一个服务器来为所有客户端路由和分发消息,而 EMQX 正是这个服务器的具体实现。EMQX 也是全球最受欢迎的开源 MQTT 消息服务器之一,完整支持 MQTT v3.1、v3.1.1 和 v5.0 协议标准。
MQTT 和 AMQP 都是运行在 TCP/IP 之上的二进制消息传输协议,也都是开放的标准协议。
然而,MQTT 主要为高延迟、低带宽和不可靠的网络设计,使用发布订阅模式,支持通过基于主题的订阅来路由消息。MQTT 拥有轻量的报文结构,对资源受限的设备更加友好。MQTT 还提供了遗嘱消息、保留消息和会话等功能,专门为运行在不可靠网络中的设备设计。
而 AMQP 则旨在提供通用的消息队列协议,确保业务消息在应用程序或服务器之间安全高效地传输。它提供了多种路由规则以满足更复杂的应用场景,广泛应用于商业领域。
MQTT 和 Kafka 是完全不同的技术,尽管它们有一些相似之处,比如都基于发布订阅模式,都通过主题来路由消息。
实际上,Kafka 更侧重于数据的存储和读取,专门针对高吞吐量、实时流数据处理场景。而 MQTT 则侧重于海量设备连接和主题路由,在不稳定的网络环境中实现实时、可靠的消息交换。因此,MQTT 和 Kafka 的最大区别在于它们适用于不同的场景,解决不同的问题。
在实际生产应用中,MQTT 和 Kafka 经常结合使用。MQTT Broker 解决大量终端设备的接入挑战,并将接入的数据转发给 Kafka,再由 Kafka 分发给不同的业务应用程序进行进一步的消息分析和处理。
是的,EMQX 是一款基于 Apache 2.0 许可证的完全开源 MQTT 消息服务器。自 2013 年在 Github 上发布以来,EMQX 已获得超过 11K 的 Star。您可以从 EMQX 官网或 Github 免费下载使用 EMQX。
除了 MQTT 协议,EMQX 还支持 MQTT-SN、CoAP、STOMP 和 LwM2M 等其他物联网协议。它允许使用不同协议的客户端相互通信。
EMQX 对所有协议版本提供完整的 MQTT 支持,包括 MQTT v3.1、v3.1.1 和 v5.0,并且允许使用不同协议版本的客户端同时连接。
MQTT 提供了多种安全机制。通过密码认证、Token 认证或支持多种认证算法的增强认证机制,可以实现客户端和服务端的身份验证。配合服务端的权限检查,只有经过认证的客户端才能访问授权的数据。
MQTT 还支持使用 SSL/TLS 加密通信,保护数据的隐私性和完整性。
需要注意的是,系统的最终安全性仍取决于您的具体实现。例如,是否安全地存储了密码,以及是否在 TLS 中使用了足够安全的加密套件。
MQTT 协议要求底层传输层提供有序、可靠的双向字节流传输,因此 TCP 协议通常是 MQTT 的首选。
不过 MQTT 并未强制要求使用特定的传输协议。虽然无法保证消息有序到达的 UDP 不适合直接作为 MQTT 的底层传输协议,但基于 UDP 实现的 QUIC 集成了 TCP 和 TLS 的所有优点,并解决了连接开销和连接不可迁移等缺点,因此也非常适合作为 MQTT 的传输协议。
EMQX 的核心是 MQTT,RabbitMQ 的核心是 AMQP,它们有着不同的设计目标和使用场景。EMQX 是一款高性能、可扩展、功能丰富的 MQTT 消息服务器,针对物联网和 M2M 通信进行了优化。EMQX 旨在处理海量并发连接和消息吞吐,适用于需要低延迟和实时通信的应用程序。
RabbitMQ 则更多用于不同系统之间的数据交换和传输。与 Kafka 类似,在很多情况下,RabbitMQ 与 EMQX 结合使用可以获得更好的效果。
单纯比较协议之间的性能差异是没有意义的,这更多取决于具体用例的实现。即使是同一协议的不同实现,也可能存在较大的性能差异。根据应用场景选择协议,再根据预期性能选择协议的具体实现,会是更合理的方案。
从学习到生产部署,我们为您提供所需的一切。
从原型扩展至数百万设备。
几秒钟内部署生产就绪的 MQTT Broker。免费起步,无限扩展。
无需信用卡