1. 程式人生 > >MQTT 簡單介紹與實現

MQTT 簡單介紹與實現

1. MQTT 介紹

  • 它是一種 機器之間通訊 machine-to-machine (M2M)、物聯網 Internet of Things (IoT)常用的一種輕量級訊息傳輸協議
  • 適用於網路頻寬較低的場合
  • 包含釋出、訂閱模式,通過一個代理伺服器(broker),任何一個客戶端(client)都可以訂閱或者釋出某個主題的訊息,然後訂閱了該主題的客戶端則會收到該訊息

1.1 訊息主題

  • 釋出訊息或者訂閱訊息都要選定一個訊息主題,訊息主題可以任意定製,類似檔案系統,用 “/” 進行分隔,例如主題為 /a/b/c/d 的訊息
  • 客戶端可以使用完全字元匹配訊息,也可以使用萬用字元進行訊息匹配
    • 萬用字元 + :替換任意單個層級。比如訂閱 /a/b/c/d、/a/+/c/d 、+/+/+/+ 主題的訊息即可收到主題為 /a/b/c/d 的訊息,而 b/+/c/d 、 +/+/+ 不會匹配
    • 萬用字元 # :匹配任意層級,只能用於末尾, #、a/# 可以匹配上面的主題訊息
  • 長度為 0 的主題層級也是允許的。比如釋出主題為 a//topic 的訊息,客戶端可以用 a/+/topic 進行匹配。/a/topic 的主題用 +/a/topic、#、/# 可以匹配。

1.2 服務質量(Quality of Service,QoS)

MQTT 定義了三種客戶端與代理伺服器之間訊息到達的難度

  • 0:broker/client 之間訊息傳一次,並不確認傳到沒有,訊息可能丟失
  • 1:broker/client 之間訊息至少一次,帶確認訊息的傳輸,可能重複收到
  • 2:broker/client 之間訊息僅有一次,利用四次握手
    進行確認,網路延遲可能會增加

當客戶端訂閱的訊息質量與代理伺服器釋出主題的質量不同時,客戶端會選擇難度最小的 QoS 接收訊息

  • 釋出等級為 2 ,客戶端訂閱等級為 0, 那麼客戶端接收到的 QoS = 0
  • 釋出等級為 0 ,訂閱等級為 2,那麼客戶端接收到的 QoS = 0

1.3 訊息保留

  • 即當 broker 正在傳送訊息給 client 時,訊息會儲存,如果此時有新的 client 訂閱了該主題的訊息,那麼它也會收到訊息。這種做法的好處就是當訊息主題經常變換的時候,如果有新的 client 訂閱該訊息,那麼它不用等待太長的時間就可以收到訊息

1.4 會話清除

  • client 可以設定 clean session 標誌位,當 clean session = false 時,client 失去連線時, broker 會一直保留訊息直到 client 重新連線。而 clean session = true 時,broker 會清除所有的訊息當這個 client 失去連線。

1.5 訊息意願

  • 當 client 連線上 broker 時,client 會提示 broker 它有一個意願訊息,這個意願訊息將會在 client 失去連線時,broker 傳送出去。訊息意願和普通訊息一樣都包含主題和內容。

2. 例項

用例項驗證上面的概念

2.1 代理伺服器

實現了 MQTT 的代理伺服器有很多種,我們使用 mosquitto
代理伺服器

2.2 mosquitto 實現過程

  • 下載安裝 mosquitto,進入 mosquitto 安裝目錄,新開當前目錄的命令列 A,執行命令 mosquitto -c mosquitto.conf,表示通過執行這個配置檔案實現代理服務,如果命令視窗沒有任何輸出表示啟動成功,配置檔案內容介紹可以自己網上了解
  • 然後在當前目錄下,新開命令列 B,執行 mosquitto_sub -t name,表示訂閱主題為 name 的訊息
  • 同樣在當前目錄,新開命令列 C,執行 mosquitto_pub -t name -m 123,表示釋出主題為 name ,內容為 123 的訊息
  • 命令列 B 收到 123 訊息表示整個過程實現 OK

2.3 一個 Chorme 應用

這裡介紹一個能夠監聽本地 MQTT 訊息的應用 MQTTLens,去 Chorme 網上應用店下載
- 安裝好後新建連線,配置如下
配置

  • 圓角圖示是綠色表示連線成功
  • 接下來你就可以在軟體裡面,訂閱、釋出任意 MQTT 訊息了,非常方便!

博文參考