目錄
1. 概述
協議詳細描述:https://blog.csdn.net/XieWinter/article/details/101198750
MQTT通過“主題”實現將消息從發佈者客戶端送達至接收者客戶端。“主題”是附加在應用消息上的一個標籤,發佈者客戶端將“主題”和“消息”發送至代理服務器,代理服務器將該消息轉發至每一個訂閱了該“主題”的訂閱者客戶端。
一個主題名可以由多個主題層級組成,每一層通過“/”斜槓分隔開,例如:“topicRoot/F1”,“topicRoot/F2”。如果用戶需要一次訂閱多個具有類似結構的主題,可以在主題過濾器中包含通配符。通配符只可用在主題過濾器中,在發佈應用消息時的主題名不允許包含通配符,主題通配符有兩種:
- #:表示匹配>=0個層次,比如a/#就匹配a,a/,a/b,a/b/c。單獨的一個#表示匹配所有,不允許a#或a/#/c等形式。
- +:表示匹配一個層次,例如a/+匹配a/b,a/c,不匹配a/b/c。單獨的一個+是允許的,但a+爲非法形式。
通配符可以應用在物接入策略中和實體設備的訂閱主題中,通過以下示例我們可以進一步瞭解通配符的作用。
2. 示例說明
我們使用下表的配置在雲端創建四個物接入用戶。
測試環境爲:百度天工物接入及PC端軟件MQTT FX
項目名稱 (Endpoint) |
用戶名稱 |
身份名稱 |
策略名稱 |
主題 |
權限 |
endpoint01 |
thing01 |
principal01 |
policy01 |
topicRoot/# |
發佈/訂閱 |
endpoint01 |
thing02 |
principal02 |
policy02 |
topicRoot/+/area1 |
發佈/訂閱 |
endpoint01 |
thing03 |
principal03 |
policy03 |
topicRoot/floor1 |
發佈/訂閱 |
endpoint01 |
thing04 |
principal04 |
policy04 |
topicRoot/floor1/area1 |
發佈/訂閱 |
通過MQTT.fx客戶端模擬4臺實體設備(Device01~Device04),分別使用thing01、thing02、thing03和thing04的用戶名和密碼連接物接入服務。
2.1 Device01發佈
- Device01 發佈:topicRoot/device02/area1
收到訂閱爲Device 01 /02:
- Device01 發佈:topicRoot/floor1
收到訂閱爲Device 01 /03:
- Device01 發佈:topicRoot/floor1/area1
收到訂閱爲Device 01 /02/04:
2.2 Device02發佈
- Device02 發佈:topicRoot/device01/area1
收到訂閱爲Device 01 /02:
- Device02 發佈:topicRoot/floor1/area1
收到訂閱爲Device 01 /02/04:
- Device02 發佈:topicRoot/floor1
服務器斷開連接:
2.3 Device03發佈
- Device03 發佈:topicRoot/floor1
收到訂閱爲Device 01 /03:
2.4 Device04發佈
Device04 發佈:topicRoot/floor1/area1
收到訂閱爲Device 01 /02/04:
2.5 測試結果
3. 應用場景說明
- 場景一:
避免用廣播方式向特定用戶發送消息!
在百度智能雲創建一個物接入用戶,具體配置如下:
項目Endpoint名稱 | 用戶名稱 | 身份名稱 | 策略名稱 | 主題 | 權限 |
---|---|---|---|---|---|
endpoint01 | thing01 | principal01 | policy01 | topic01 | 發佈/訂閱 |
如下圖所示,在該場景中所有實體設備都通過相同的物接入用戶接入,擁有相同的用戶名、密碼和權限。由於所有用戶都訂閱了相同的主題,當Device-A向Device-D發佈消息時Device-B和Device-C也會收到。這種部署方式會對實體設備造成額外的處理負擔,同時也會對當月的物接入消息配額造成不必要的損失。
在不增加額外配置的情況下,可以採取以下部署方式解決上述問題。在百度智能雲創建一個物接入用戶,具體配置如下:
項目Endpoint名稱 | 用戶名稱 | 身份名稱 | 策略名稱 | 主題 | 權限 |
---|---|---|---|---|---|
endpoint01 | thing01 | principal01 | policy01 | topic01/# | 發佈/訂閱 |
由於在主題中使用了“#”通配符,因此每個用戶可以訂閱兩個主題:
- topic01/broadcast:用來訂閱廣播消息。
- topic01/DeviceName:DeviceName需要替換爲用戶的實際名稱並全局唯一,用來訂閱單播消息。
在單播場景下,Device-A向Device-D發送消息,Device-B和Device-C都不會接收到。
在廣播場景下,Device-A發佈的消息可以同時被Device-B、Device-C和Device-D接收到。
- 場景二:
常見智能家居交互模式框圖: