MQTT 協議 主題及通配符的使用方法

目錄

1. 概述

2. 示例說明

2.1 Device01發佈

2.2 Device02發佈

2.3 Device03發佈

2.4 Device04發佈

2.5 測試結果

3. 應用場景說明


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接收到。

  • 場景二:

常見智能家居交互模式框圖:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章