MQTT知識點整理

向萧發表於2024-08-07
  • 優勢

1、輕量高效,節省頻寬
2、可靠的訊息傳遞
3、海量連線支援
4、安全的雙向通訊
5、線上狀態感知
  • MQTT伺服器部署

docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p18083:18083 emqx/emqx:lates
  • MQTT桌面客戶端推薦

MQTTX
  • 釋出訂閱模式

組成部分:
釋出者(Publisher):負責將訊息釋出到主題上,釋出者一次只能向一個主題傳送資料,釋出者釋出訊息時也無需關心訂閱者是否線上。
訂閱者(Subscriber):訂閱者透過訂閱主題接收訊息,且可一次訂閱多個主題。
代理(Broker):負責接收發布者的訊息,並將訊息轉發至符合條件的訂閱者。另外,代理也需要負責處理客戶端發起的連線、斷開連線、訂閱、取消訂閱等請求。
主題(Topic):主題是 MQTT 進行訊息路由的基礎,它類似 URL 路徑,使用斜槓 / 進行分層,比如sensor/1/temperature。一個主題可以有多個訂閱者,代理會將該主題下的訊息轉發給所有訂閱者;一個主題也可以有多個釋出者,代理將按照訊息到達的順序轉發。
  • MQTT與訊息佇列

儘管 MQTT 與訊息佇列的很多行為和特性非常接近,比如都採用釋出/訂閱模式,但是他們面向的場景卻有著顯著的不同。訊息佇列主要用於服務端應用之間的訊息儲存與轉發,這類場景往往資料量大但客戶端數量少。MQTT 是一種訊息傳輸協議,主要用於物聯網裝置之間的訊息傳遞,這類場景的特點是海量的設
備接入、管理與訊息傳輸。在一些實際的應用場景中,MQTT 與訊息佇列往往會被結合起來使用,以使 MQTT 伺服器能專注於處理裝置的連線與裝置間的訊息路由。比如先由 MQTT 伺服器接收物聯網裝置上報的資料,然後再透過訊息佇列將這些資料轉發到不同的業務系統進行處理。不同於訊息佇列,MQTT 主題不需要提前建立。MQTT 客戶端在訂閱或釋出時即自動的建立了主題,開發者無需再關心主題的建立,並且也不需要手動刪除主題。
  • 建立MQTT連線

連線地址 :MQTT 的連線地址通常包含 :伺服器 IP 或者域名、伺服器埠、連線協議。
基於 TCP 的 MQTT 連線
mqtt 是普通的 TCP 連線,埠一般為 1883。
mqtts 是基於 TLS/SSL 的安全連線,埠一般為 8883。
比如 mqtt://broker.emqx.io:1883 是一個基於普通 TCP 的 MQTT 連線地址。
基於 WebSocket 的連線
ws 是普通的 WebSocket 連線,埠一般為 8083。
wss 是基於 WebSocket 的安全連線,埠一般為 8084。
客戶端 ID(Client ID): MQTT 伺服器使用 Client ID 識別客戶端,連線到伺服器的每個客戶端都必須要有唯一的 Client ID。Client ID 的長度通常為 1 至 23 個位元組的 UTF-8 字串。 如果客戶端使用一個重複的 Client ID 連線至伺服器,將會把已使用該 Client ID 連線成功的客戶端踢下 線。
連線超時(Connect Timeout):收到伺服器連線確認前的等待時間,等待時間內未收到連線確認則為連線失敗
保活週期(Keep Alive):是一個以秒為單位的時間間隔。客戶端在無報文傳送時,將按 Keep Alive 設定的值定時向服務端傳送心跳報文,確保連線不被服務端斷開。在連線建立成功後,如果伺服器沒有在 Keep Alive 的 1.5 倍時間內收到來自客戶端的任何包,則會認為和客戶端之間的連線出現了問題,此時伺服器便會斷開和客戶端的連線。
  • 主題與萬用字元

MQTT 主題本質上是一個 UTF-8 編碼的字串,是 MQTT 協議進行訊息路由的基礎。MQTT 主題類似URL 路徑,使用斜槓 / 進行分層。
MQTT 主題萬用字元包含單層萬用字元 + 及多層萬用字元 #,主要
MQTT 主題使用建議:
不建議使用 # 訂閱所有主題;
不建議主題以 / 開頭或結尾,例如 /chat 或 chat/;
不建議在主題裡新增空格及非 ASCII 特殊字元;
同一主題層級內建議使用下劃線 _ 或橫杆 - 連線單詞(或者使用駝峰命名);
儘量使用較少的主題層級;
當使用萬用字元時,將唯一值的主題層(例如裝置號)越靠近第一層越好。例如,device/00000001/command/# 比 device/command/00000001/# 更好。
  • QoS機制

MQTT 定義了三個 QoS 等級,分別為:
QoS 0,最多交付一次。
QoS 1,至少交付一次。
QoS 2,只交付一次。
  • 保留訊息

釋出者釋出訊息時,如果 Retained 標記被設定為 true,則該訊息即是 MQTT 中的保留訊息(RetainedMessage)。MQTT 伺服器會為每個主題儲存最新一條保留訊息,以方便訊息釋出後才上線的客戶端在訂閱主題時仍可以接收到該訊息。
如何判斷一條訊息是否是保留訊息?當客戶端訂閱了有保留訊息的主題後,即會收到該主題的保留訊息,可透過訊息中的保留標誌位判斷是否是保留訊息。需要注意的是,在保留訊息釋出前訂閱主題,將不會收到保留訊息。需要待保留訊息釋出後,重新訂閱該主題,才會收到保留訊息。

相關文章