MQTT 簡單介紹與實現
阿新 • • 發佈:2019-02-11
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 訊息了,非常方便!