認識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收到這個消息。

主題
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 系統主題文檔。
工作流程
- 客戶端使用 TCP/IP 協議與 Broker 建立連接,可以選擇使用 TLS/SSL 加密來實現安全通信。客戶端提供認證信息,并指定會話類型(Clean Session 或 Persistent Session)。
- 客戶端既可以向特定主題發布消息,也可以訂閱主題以接收消息。當客戶端發布消息時,它會將消息發送給 MQTT Broker;而當客戶端訂閱消息時,它會接收與訂閱主題相關的消息。
- 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 的離線消息 |
| 重連體驗 | 需要重新訂閱 | 自動恢復訂閱 |
| 資源占用 | 少 | 多 |
| 適用場景 | 臨時客戶端、數據采集 | 重要設備、控制客戶端 |

使用場景與 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

浙公網安備 33010602011771號