您好,登錄后才能下訂單哦!
這篇文章主要講解了“MQTT主題的高級特性怎么運用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“MQTT主題的高級特性怎么運用”吧!
MQTT 協議通過網絡傳輸應用消息。應用消息通過 MQTT 傳輸時,它們有關聯的服務質量(QoS)和主題(Topic)。主題本質上是一個字符串,MQTT 協議規定主題是 UTF-8 編碼的字符串,這意味著,主題過濾器和主題名的比較可以通過比較編碼后的 UTF-8 字節或解碼后的 Unicode 字符。
主題名 附加在應用消息上的一個標簽,服務端已知且與訂閱匹配。服務端發送應用消息的一個副本給每一個匹配的客戶端訂閱。
主題過濾器 訂閱中包含的一個表達式,用于表示相關的一個或多個主題。主題過濾器可以使用通配符。
如果訂閱的主題過濾器與消息的主題名匹配,應用消息會被發送給每一個匹配的客戶端訂閱。主題資源可以是管理員在服務端預先定義好的,也可以是服務端收到第一個訂閱或使用那個主題名的應用消息時動態添加的。服務端可以使用一個安全組件有選擇地授權客戶端使用某個主題資源。
所有的主題名和主題過濾器必須至少包含一個字符。
主題名和主題過濾器是大小寫敏感的。ACCOUNTS
和 Accounts
是不同的主題名。
主題名和主題過濾器可以包含空格字符。Accounts payable
是合法的主題名
主題名或主題過濾器以前置或后置斜杠 /
區分。/finance
和 finance
是不同的。
只包含斜杠 /
的主題名或主題過濾器是合法的。
主題名和主題過濾器不能包含 null
字符(Unicode U+0000)。
主題名和主題過濾器是 UTF-8 編碼字符串,除了不能超過 UTF-8 編碼字符串的長度限制之外,主題名或主題過濾器的層級數量沒有其它限制。
斜杠(“/” U+002F)用于分割主題的每個層級,為主題名提供一個分層結構。分隔符用于將結構化引入主題名。如果存在分隔符,它將主題名分割為多個主題層級,是消息主題層級設計中很重要的符號。 比方說:aaa/bbb
、aaa/bbb/ccc
和 aaa/bbb/ccc/ddd
這樣的消息主題格式,是一個層層遞進的關系,可通過多層通配符同時匹配兩者,或者單層通配符只匹配一個。 這在現實場景中,可以應用到:公司的部門層級推送、國家城市層級推送等包含層級關系的場景。
MQTT 訂閱報文包含一個主題過濾器(Topic Filter)和一個最大的服務質量(QoS)等級。訂閱的主題過濾器可以包含特殊的通配符,允許客戶端一次訂閱多個主題。當客戶端訂閱指定的主題過濾器包含兩種通配符時,主題層級分隔符就很有用了。主題層級分隔符可以出現在主題過濾器或主題名字的任何位置。相鄰的主題層次分隔符表示一個零長度的主題層級。
主題過濾器中可以使用通配符,但是主題名不能使用通配符。單層通配符和多層通配符只能用于訂閱 (subscribe) 消息而不能用于發布 (publish) 消息,層級分隔符兩種情況下均可使用。
井字符號(“#” U+0023)是用于匹配主題中任意層級的通配符。多層通配符表示它的父級和任意數量的子層級。
例如,如果客戶端訂閱主題 sport/tennis/player1/#
,它會收到使用下列主題名發布的消息:
sport/tennis/player1
sport/tennis/player1/ranking
sport/tennis/player1/score/wimbledon
因為多層通配符包括它自己的父級,所以 sport/#
也匹配單獨的 sport
主題名,sport/tennis/player1/#
也可以匹配 sport/tennis/player1
。
單獨的多層通配符 #
是有效的,它會收到所有的應用消息。
多層通配符必須單獨指定,或者跟在主題層級分隔符后面。多層通配符必須是主題過濾器的最后一個字符。因此,sport/tennis#
和 sport/tennis/#/ranking
都是無效的多層通配符。
加號 (“+” U+002B) 是只能用于單個主題層級匹配的通配符。例如,sport/tennis/+
匹配 sport/tennis/player1
和 sport/tennis/player2
,但是不匹配 sport/tennis/player1/ranking
。同時,由于單層通配符只能匹配一個層級,sport/+
不匹配 sport
但是卻匹配 sport/
。
在主題過濾器的任意層級都可以使用單層通配符,包括第一個和最后一個層級,可以在主題過濾器中的多個層級中使用它,也可以和多層通配符一起使用,+
、+/tennis/#
、sport/+/player1
都有有效的。在使用單層通配符時,單層通配符占據過濾器的整個層級,sport+
是無效的。
服務端不能將 $
字符開頭的主題名匹配通配符 (#
或+
) 開頭的主題過濾器, 訂閱 #
的客戶端不會收到任何發布到以 $
開頭主題的消息,訂閱 +/monitor/Clients
的客戶端也不會收到任何發布到 $SYS/monitor/Clients
的消息。服務端應該阻止客戶端使用這種主題名與其他客戶端交換消息,客戶端注意不能使用 $
字符開頭的主題。
服務端實現可以將 $
開頭的主題名用作其他目的。,例如 $SYS/
被廣泛用作包含服務器特定信息或控制接口的主題的前綴。訂閱 $SYS/#
的客戶端會收到發布到以 $SYS/
開頭主題的消息,訂閱 $SYS/monitor/+
的客戶端會收到發布到 $SYS/monitor/Clients
主題的消息,如果客戶端想同時接受以 $SYS/
開頭主題的消息和不以 $
開頭主題的消息,它需要同時訂閱 #
和 $SYS/#
。
比如我們用傳感器監視家里的臥室、客廳以及廚房的溫度、濕度和空氣質量,可以設計一下幾個主題:
myhome/bedroom/temperature
myhome/bedroom/humidity
myhome/bedroom/airquality
myhome/livingroom/temperature
myhome/livingroom/humidity
myhome/livingroom/airquality
myhome/kitchen/temperature
myhome/kitchen/humidity
myhome/kitchen/airquality
當我們想獲取臥室的所有數據時,可以訂閱 myhome/bedroom/+
主題,當我們想獲取三個房間的溫度數據的時候,可以訂閱 myhome/+/temperature
主題,當我們想獲取所有的數據的時候,可以訂閱 myhome/#
或者 #
。
感謝各位的閱讀,以上就是“MQTT主題的高級特性怎么運用”的內容了,經過本文的學習后,相信大家對MQTT主題的高級特性怎么運用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。