天天看點

1.5 MQTT主題進階

文章目錄

  • ​​1. 主題基本形式​​
  • ​​2. 主題分級​​
  • ​​3 主題通配符​​
  • ​​單級通配符: +​​
  • ​​多級通配符​​
  • ​​4. 主題應用注意事項​​

1. 主題基本形式

主題的最基本形式就是一個字元串。以下是幾個主題示例:

  • myTopic
  • motorSpeed
  • MotorSpeed
  • current time

雖然主題看起來很簡單,但是我們在使用主題時需要注意以下幾點:

  1. 主題是區分大小寫的。如上清單中的主題 motor_speed和Motor_speed是兩個完全不同的主題。
  2. 主題可以使用空格 如以上清單中的current time,雖然有空格分隔current和time這兩個詞,但這實際是一個MQTT主題。不過,雖然我們可以使用空格,但是筆者強烈建議您不要在主題中使用空格。我們在開發時一不小心,可能就會漏掉空格,這将造成不必要的麻煩。
  3. 大部分MQTT服務端是不支援中文主題的,是以我們應使用英文字元或ASCII字元來作為MQTT主題。

2. 主題分級

MQTT主題可以是一個簡單的字元串,比如motor_speed,myTopic。這些都是單一級别的主題。

為了更好的對主題進行管理和分類,我們可以對主題進行分級處理。MQTT主題各個級别之間可以使用”/”來分隔。如下例所示:

Tyler-1/motor/1/speed

在以上示例中一共有四級主題,分别是第1級 Tyler-1、第2級motor、第三級1、第4級speed。主題的每一級至少需要一個字元,比如以上示例中,數字1既是一級主題。

我們再來看幾個分級主題的示例:

home/sensor/kitchen/temperature

home/sensor/kitchen/brightness

home/sensor/bedroom/temperature

home/sensor/bedroom/brightness

3 主題通配符

當用戶端訂閱主題時,可以使用通配符同時訂閱多個主題。通配符隻能在訂閱主題時使用,下面我們将介紹兩種通配符:單級通配符和多級通配符。

單級通配符: +

顧名思義,單級通配符可以代替一個主題級别。 以下為含有單極通配符的主題示例。

home/sensor/+/temperature

當用戶端訂閱了以上主題後,它将會收到以下主題的資訊内容:

home/sensor/kitchen/temperature

home/sensor/bedroom/temperature

我們可以看到,在home後面的級别中,由于用戶端訂閱的主題使用了+ 單級通配符,是以無論home級别後面的内容是什麼,用戶端都能收到這些主題的資訊。

相反,用戶端将無法收到以下主題的資訊。

home/sensor/bedroom/brightness

office/sensor/bedroom//temperature

home/screen/livingroom/temperature

以上主題的紅色部分都是用戶端無法收到資訊的原因。這些紅色的部分都是與用戶端訂閱的主題“home/sensor/+/temperature”不相符的部分。

多級通配符

單級通配符僅可代替一個主題級别,而多級通配符”#”可以涵蓋任意數量的主題級别。如下示例所示, 多級通配符必須是主題中的最後一個字元。

home/sensor/#

當用戶端訂閱了以上含有”#”的主題後,可以收到以下主題的資訊。

home/sensor/kitchen/temperature

home/sensor/bedroom/brightness

home/sensor/data

多級通配符可以代替多級主題資訊,是以無論”home/sensor”後面有一級還是多級主題,都可以被訂閱了”home/sensor/#”的用戶端接收到。

4. 主題應用注意事項

以$開始的主題

以$開始的主題是MQTT服務端系統保留的特殊主題,我們不能随意訂閱或者向其釋出資訊。以下是此類主題的示例:

$SYS/broker/clients/connected

$SYS/broker/clients/disconnected

$SYS/broker/clients/total

$SYS/broker/messages/sent

$SYS/broker/uptime

類似的主題還有很多。不過請記住一點,以$符号開頭的主題是系統保留的特殊主題,我們不能随意訂閱或者向其釋出資訊。

– 不要用 “/” 作為主題開頭

MQTT允許使用“/”作為主題的開頭,例如/home/sensor/data。但是這将這麼做毫無意義,而且會額外産生一個沒有用處的主題級别。是以我們應避免使用/作為主題的開頭。

– 主題中不要使用空格

MQTT協定允許我們在主題中使用空格,但是閱讀和調試含有空格的主題會顯得異常困難。是以我們盡量不要在主題中使用空格或者特殊字元。

– 保持主題簡潔明了

MQTT是一種輕量級的通訊協定,它常用于網絡帶寬受限的環境,是以我們應盡量讓主題簡潔明了,進而讓裝置間互動的内容更加簡潔,以更好的适應網絡帶寬受限的環境。

繼續閱讀