前言
mqtt現在基本是物聯網標配的數據傳輸協議了,我們今天就詳細說一下mqtt里的那些入門概念
結構
mqtt分兩部分:
- 一個是服務端(broker)也可以叫server端,服務端一般使用現成的程序,國內現在比較流行的就是
EMQX
,也有一個用C語言寫的mosquitto
,生產環境下,服務端一般安裝到雲服務器里。 - 另一個是客戶端(client),基本上每個具體的設備都屬於客戶端,比如:攝像頭、冰箱、洗衣機等這些設備,一般程序中還有一個后台管理系統,后台管理系統主要用來存儲、統計設備的數據,它也屬於客戶端。
基本結構
基礎概念
這里整理一下理解mqtt容易出錯的一些概念
topic (主題設計)
mqtt是使用發布、訂閱 模式進行消息傳遞的,這個和 websocket 有一點類似,基本就是:一個客戶端給 服務端(broker)發送一個消息,broker 按一定規則廣播給其他客戶端。這個規則就是利用 topic 來實現的
注意點:
- 每個客戶端都可以在服務端創建一個 topic,topic被創建后, 這個 topic 就可以被所有設備訂閱,包括自己也行,也可以線訂閱topic,再創建,順序上沒有要求
- 發布 topic 和訂閱 topic 是兩個接口,所以自己可以訂閱自己發布的 topic
- topic 需要一定的設計,不然設備多了的時候設備不好管理
- 一個服務端可以發布成千上萬個topic,不用擔心topic過多問題
- topic在設計時可以使用這些符號
- 主題層級分隔符—“/”
- 多層通配符—“#”
- 單層通配符—“+”
- 通配符 —“$”
客戶端
客戶端在使用時有一些必要的注意點
-
客戶端在鏈接服務端時,會有一個用戶名、密碼,這個用戶名和密碼時在服務端配置的,如果有多個平台鏈接服務端,我們就可以創建多個賬號,每個平台使用自己的賬號
-
客戶端在鏈接服務端時必須有一個客戶端ID,這個ID在整個服務端都必須時唯一的,服務端就時靠這個id來區分每一個鏈接的。多數情況下這個id是由客戶端帶上去的
-
如果想要設備能接收自己離線時別人發給自己的消息,有四點:
- 設備的 客戶端ID 唯一且不變,就是說每次連接服務端時都使用同一個ID
- 鏈接服務端時設定 【清除會話】為false,就是說不清除 session 會話
- 別人發的消息必須時 qos2 權限
- 訂閱 topic 也必須時 qos2 權限
-
如果想給設備發送一些配置命令,可以使用【保留消息】,保留消息的意思是:這個topic里會一直保留一條最新消息,每次有設備訂閱了這個topic,都會把這條給當前客戶端推送一遍,當前客戶端重新訂閱也會重復收到這個消息
- 【保留消息】:qos0、qos1、qos2都會保留
- 當前客戶端如果訂閱了兩次同一個topic,則第一次訂閱的topic會在第二個訂閱的時候再收到一次保留的消息
-
【保留消息】可以被任意一個設備清除掉,只需要給這個topic發送一個空數據即可
-
qos的等級在發布和訂閱時都需要指定,pub和sub可以指定不一樣的qos, 服務器只會按pub和sub兩者qos等級最小的那個qos規則來發送消息。
- 發送時指定的qos是對服務端的,服務端肯定會按指定qos來接收消息,但是轉發消息時就有可能降級發送
- 接收時指定的qos表示訂閱者可以接收的最高消息等級,也就是可能收到更低等級的消息
-
監測設備異常時可以使用【遺囑消息】功能
本地測試工具推薦
調試mqtt時需要用到一些客戶端工具,下面是我常用的工具
mqttbox
有瀏覽器插件和客戶端,操作簡單,查看直觀,
缺點:英文客戶端,界面不是很美觀
mqttx
是emqx推出的客戶端,界面比較美觀。有中英文模式,操作還算簡單
缺點:用electorn 開發的,占用空間較大,多開情況下,操作非常不順暢。
建議
建議兩個軟件搭配使用,充當兩個客戶端,其中一個發消息,另一個收消息