MQTT通配符使用


我們在做設備需求開發時會遇見一些問題,主要如下所述:

在一個業務場景中,有各種不同得設備或者是采集器需要介入至平台

那么,為了區分不同的設備,通常建議開發者對MQTT的發布和訂閱的主題做細分,以做到對設備的精確控制。

區分設備


嵌入式開發時,開發者應該將設備的主題規划如下:

  1. 訂閱:/sys/device/8685754894158765/ctrl
  2. 上報:/sys/device/8685754894158765/reply

其中8685754894158765就是設備的IMEI。如此一來,只要服務端向某個設備的ctrl主題發布數據,設備收到后即可做出相應響應;設備也可以根據自己的邏輯,及時上報數據到reply主題。

如此一來,每個設備的邏輯很清晰了,但是服務端端呢?難道要去訂閱每一個設備的不同主題嗎?實際上並不復雜哦,使用MQTT的通配符就能輕松解決。

通配符

主題層級

譬如在上文的例子中:

  1. 訂閱:/sys/device/8685754894158765/ctrl
  2. 上報:/sys/device/8685754894158765/reply

每一個 / 都是分隔符,用來分割主題的每一層級。以訂閱的主題為例,它就被分割成了4個層級:

  1. /sys/device/8685754894158765/ctrl
  2. 層級1. sys
  3. 層級2. device
  4. 層級3. 8685754894158765
  5. 層級4. ctrl

不要小看層級哦,區分設備,使用通配符,全靠他們了。

多層通配符#


# 是可以匹配主題中任意層級次數的通配符。
比如,如果你訂閱了 /sys/device/#,那么,你可以接收到以下這些主題的消息:

  1. /sys/device
  2. /sys/device/8685754894158765/reply
  3. /sys/device/8685754894158766/reply
  4. /sys/device/8685754894158767/reply
  5. /sys/device/abce/efg/h/ijkl
  6. ...

通過示例我們可以看出,#可以匹配大於等於0的層級。
服務端使用通配符 # 訂閱主題。設備上報數據,服務端收到數據后,再根據設備的上報的 真實主題 和 payload 進行處理。

單層通配符+


+ 只可匹配主題的某一層級。

比如,如果你訂閱了 /sys/device/+,那么,你可以接收到以下這些主題的消息:

  1. /sys/device/8685754894158765
  2. /sys/device/8685754894158766
  3. /sys/device/8685754894158767
  4. /sys/device/abce
  5. ...

但是不能收到如下主題的消息:

  1. /sys/device/8685754894158767/reply
  2. /sys/device/abce/efg/h/ijkl
  3. /sys/device

因為他們都超過了 + 1層級的要求。需要注意的是,/sys/device因為是0層級,所以也不符合要求,無法收到數據。

擴展用法

    1. 如果開發者想要訂閱所有主題,那么連接到服務器后,訂閱 # 就可以啦;
    2. /sys 和 sys 是兩個不同的主題。所以,如果開發者想要使用 + 訂閱 /sys,那么要寫成這樣:+/+ ;
    3. 小心使用 #,以免造成不可預估的后果;
    4. 主題中的其他字符,如 * 、 $ 等,均當作普通字符串處理,無其他特殊含義。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM