认识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中只有两个角色一个是客户端(client)一个是代理端(broker)。Client通过对主题(Topic)发布消息和订阅消息进行通信,这就是发布订阅模式,所有的Client都可以对某一个主题进行发布和订阅。


例如,下图就是右边的Client订阅Temperature这个主题,左边的Client发布这个主题的消息给Broker,只要是订阅了这个主题的Client都可以通过Broker收到这个消息。


file-20251021145634688



主题

MQTT 协议根据主题来转发消息。主题通过 / 来区分层级,类似于 URL 路径,例如:

chat/room/1

sensor/10/temperature

sensor/+/temperature

MQTT 主题支持以下两种通配符:`+` 和 `#`。
- `+`:表示单层通配符,例如 `a/+` 匹配 `a/x` 或 `a/y`。 - `#`:表示多层通配符,例如 `a/#` 匹配 `a/x`、`a/b/c/d`。

单层通配符

加号 (“+” U+002B) 是用于单个主题层级匹配的通配符。在使用单层通配符时,单层通配符必须占据整个层级,例如:


sensor/+ 有效
sensor/+/temperature 有效
sensor+ 无效(没有占据整个层级)

如果客户端订阅了主题 sensor/+/temperature,将会收到以下主题的消息:


sensor/1/temperature
sensor/2/temperature
...
sensor/n/temperature

但是不会匹配以下主题:


sensor/temperature
sensor/bedroom/1/temperature

多层通配符

井字符号(“#” U+0023)是用于匹配主题中任意层级的通配符。多层通配符表示它的父级和任意数量的子层级,在使用多层通配符时,它必须占据整个层级并且必须是主题的最后一个字符,例如:


# 有效,匹配所有主题
sensor/# 有效
sensor/bedroom# 无效(没有占据整个层级)
sensor/#/temperature 无效(不是主题最后一个字符)

如果客户端订阅主题 senser/#,它将会收到以下主题的消息:


sensor
sensor/temperature
sensor/1/temperature

注意:通配符主题只能用于订阅,不能用于发布。


系统主题


以 $SYS/ 开头的主题为系统主题,系统主题主要用于获取 MQTT 服务器 自身运行状态、消息统计、客户端上下线事件等数据。目前,MQTT 协议暂未明确规定 $SYS/ 主题标准,但大多数 MQTT 服务器都遵循该标准建议


例如,EMQX 服务器支持通过以下主题获取集群状态。


主题 说明
$SYS/brokers EMQX 集群节点列表
$SYS/brokers/emqx@127.0.0.1/version EMQX 版本
$SYS/brokers/emqx@127.0.0.1/uptime EMQX 运行时间
$SYS/brokers/emqx@127.0.0.1/datetime EMQX 系统时间
$SYS/brokers/emqx@127.0.0.1/sysdescr EMQX 系统信息

EMQX 还支持客户端上下线事件、收发流量、消息收发、系统监控等丰富的系统主题,用户可通过订阅 $SYS/# 主题获取所有系统主题消息。详细请见:EMQX 系统主题文档


工作流程

  1. 客户端使用 TCP/IP 协议与 Broker 建立连接,可以选择使用 TLS/SSL 加密来实现安全通信。客户端提供认证信息,并指定会话类型(Clean Session 或 Persistent Session)。
  2. 客户端既可以向特定主题发布消息,也可以订阅主题以接收消息。当客户端发布消息时,它会将消息发送给 MQTT Broker;而当客户端订阅消息时,它会接收与订阅主题相关的消息。
  3. MQTT Broker 接收发布的消息,并将这些消息转发给订阅了对应主题的客户端。它根据 QoS 等级确保消息可靠传递,并根据会话类型为断开连接的客户端存储消息。

单片机如何使用MQTT


首先能让设备通过WIFI或者蜂窝网络上网,选用想使用的协议,TCP/IP或者Websocket等等,MQTT支持挺多种协议的。


Borker连接这块
TCP/IP选择:mqtt:// or mqtts://
Websocket选择:ws:// or wss://


如何进行简单通信:MQTT 协议快速入门 2025:基础知识和实用教程 | EMQ能让设备上网并且准备好MQTT相关的库之后从准备 MQTT 客户端这个部分看




相关概念


Clean Session和Persistent Session

概念

会话 含义 行为 相当于
Clean Session(干净会话) 每次客户端连接时,都从一个"干净"的状态开始 Broker 不会保存客户端的任何状态信息
客户端断开后,Broker会立即清理所有相关数据
重新连接时,就像第一次连接一样
每次都是"陌生人"的初次见面
Persistent Session(持久会话) Broker 会持久化保存客户端的会话状 Broker 会保存客户端的订阅列表、未确认的消息等
客户端断开后,这些信息继续保留
重新连接时,恢复之前的会话状态
老朋友重逢,继续上次的话题
特性 Clean Session (true) Persistent Session (false)
会话状态 不保存 保存
订阅信息 断开即丢失 断开后保持
离线消息 不存储 存储 QoS 1/2 的离线消息
重连体验 需要重新订阅 自动恢复订阅
资源占用
适用场景 临时客户端、数据采集 重要设备、控制客户端

file-20251021153155636


使用场景与 QoS 的配合使用

  • 不受只发布不订阅周期数据型设备,可以使用clean_session=True和QoS0。
  • 只订阅不发布的受控类设备,可以使用clean_session=Flase和QoS1,这样就可以达成上线就接收控制信号完成控制。
  • 安全类型的设备,就需要clean_session=Flase和QoS2,防止过量信息导致的严重问题和记录的丢失。

具体情况需要具体分析,合理配合,因为持久会话会占用Broker内存。


注意: 持久会话能被恢复的前提是客户端使用固定的 Client ID 再次连接,如果 Client ID 是动态的,那么连接成功后将会创建一个新的持久会话。

参考文档


MQTT 协议快速入门 2025:基础知识和实用教程 | EMQ
MQTT 持久会话与 Clean Session 详解 | EMQ

posted @ 2025-10-21 17:04  M1nd3zz7z  阅读(7)  评论(0)    收藏  举报