【零基礎(chǔ)學(xué)物聯(lián)網(wǎng)】MQTT篇 1-7 MQTT主題進(jìn)階

為了幫助您學(xué)習(xí),我們專門(mén)為本教程制作了視頻。
↓

通過(guò)以前的學(xué)習(xí),我們了解到主題是MQTT的核心概念之一。在本節(jié)課里,我們來(lái)一起進(jìn)一步了解MQTT主題這一概念。我們將從以下幾個(gè)方面來(lái)學(xué)習(xí)MQTT主題的高級(jí)知識(shí):
1. 主題基本形式
2. 主題分級(jí)
3. 主題通配符
4. 主題應(yīng)用注意事項(xiàng)

1. 主題基本形式
主題的最基本形式就是一個(gè)字符串。以下是幾個(gè)主題示例:
myTopic
motorSpeed
MotorSpeed
current time
雖然主題看起來(lái)很簡(jiǎn)單,但是我們?cè)谑褂弥黝}時(shí)需要注意以下幾點(diǎn):
主題是區(qū)分大小寫(xiě)的。如上列表中的主題 motor_speed和Motor_speed是兩個(gè)完全不同的主題。
主題可以使用空格 如以上列表中的current time,雖然有空格分隔current和time這兩個(gè)詞,但這實(shí)際是一個(gè)MQTT主題。不過(guò),雖然我們可以使用空格,但是筆者強(qiáng)烈建議您不要在主題中使用空格。我們?cè)陂_(kāi)發(fā)時(shí)一不小心,可能就會(huì)漏掉空格,這將造成不必要的麻煩。
大部分MQTT服務(wù)端是不支持中文主題的,所以我們應(yīng)使用英文字符或ASCII字符來(lái)作為MQTT主題。
2. 主題分級(jí)
MQTT主題可以是一個(gè)簡(jiǎn)單的字符串,比如motor_speed,myTopic。這些都是單一級(jí)別的主題。
為了更好的對(duì)主題進(jìn)行管理和分類(lèi),我們可以對(duì)主題進(jìn)行分級(jí)處理。MQTT主題各個(gè)級(jí)別之間可以使用”/”來(lái)分隔。如下例所示:
Tyler-1/motor/1/speed
在以上示例中一共有四級(jí)主題,分別是第1級(jí) Tyler-1、第2級(jí)motor、第三級(jí)1、第4級(jí)speed。主題的每一級(jí)至少需要一個(gè)字符,比如以上示例中,數(shù)字1既是一級(jí)主題。
我們?cè)賮?lái)看幾個(gè)分級(jí)主題的示例:
home/sensor/kitchen/temperature
home/sensor/kitchen/brightness
home/sensor/bedroom/temperature
home/sensor/bedroom/brightness
3 主題通配符
當(dāng)客戶端訂閱主題時(shí),可以使用通配符同時(shí)訂閱多個(gè)主題。通配符只能在訂閱主題時(shí)使用,下面我們將介紹兩種通配符:?jiǎn)渭?jí)通配符和多級(jí)通配符。
單級(jí)通配符: +
顧名思義,單級(jí)通配符可以代替一個(gè)主題級(jí)別。 以下為含有單極通配符的主題示例。
home/sensor/+/temperature
當(dāng)客戶端訂閱了以上主題后,它將會(huì)收到以下主題的信息內(nèi)容:
home/sensor/kitchen/temperature
home/sensor/bedroom/temperature
我們可以看到,在home后面的級(jí)別中,由于客戶端訂閱的主題使用了+ 單級(jí)通配符,因此無(wú)論home級(jí)別后面的內(nèi)容是什么,客戶端都能收到這些主題的信息。
相反,客戶端將無(wú)法收到以下主題的信息。
home/sensor/bedroom/brightness
office/sensor/bedroom//temperature
home/screen/livingroom/temperature
以上主題的紅色部分都是客戶端無(wú)法收到信息的原因。這些紅色的部分都是與客戶端訂閱的主題“home/sensor/+/temperature”不相符的部分。
多級(jí)通配符 #
單級(jí)通配符僅可代替一個(gè)主題級(jí)別,而多級(jí)通配符”#”可以涵蓋任意數(shù)量的主題級(jí)別。如下示例所示, 多級(jí)通配符必須是主題中的最后一個(gè)字符。
home/sensor/#
當(dāng)客戶端訂閱了以上含有”#”的主題后,可以收到以下主題的信息。
home/sensor/kitchen/temperature
home/sensor/bedroom/brightness
home/sensor/data
多級(jí)通配符可以代替多級(jí)主題信息,因此無(wú)論”home/sensor”后面有一級(jí)還是多級(jí)主題,都可以被訂閱了”home/sensor/#”的客戶端接收到。
4. 主題應(yīng)用注意事項(xiàng)
– 以$開(kāi)始的主題
以$開(kāi)始的主題是MQTT服務(wù)端系統(tǒng)保留的特殊主題,我們不能隨意訂閱或者向其發(fā)布信息。以下是此類(lèi)主題的示例:
$SYS/broker/clients/connected
$SYS/broker/clients/disconnected
$SYS/broker/clients/total
$SYS/broker/messages/sent
$SYS/broker/uptime
類(lèi)似的主題還有很多。不過(guò)請(qǐng)記住一點(diǎn),以$符號(hào)開(kāi)頭的主題是系統(tǒng)保留的特殊主題,我們不能隨意訂閱或者向其發(fā)布信息。
– 不要用 “/” 作為主題開(kāi)頭
MQTT允許使用“/”作為主題的開(kāi)頭,例如/home/sensor/data。但是這將這么做毫無(wú)意義,而且會(huì)額外產(chǎn)生一個(gè)沒(méi)有用處的主題級(jí)別。所以我們應(yīng)避免使用/作為主題的開(kāi)頭。
– 主題中不要使用空格
MQTT協(xié)議允許我們?cè)谥黝}中使用空格,但是閱讀和調(diào)試含有空格的主題會(huì)顯得異常困難。所以我們盡量不要在主題中使用空格或者特殊字符。
– 保持主題簡(jiǎn)潔明了
MQTT是一種輕量級(jí)的通訊協(xié)議,它常用于網(wǎng)絡(luò)帶寬受限的環(huán)境,因此我們應(yīng)盡量讓主題簡(jiǎn)潔明了,從而讓設(shè)備間交互的內(nèi)容更加簡(jiǎn)潔,以更好的適應(yīng)網(wǎng)絡(luò)帶寬受限的環(huán)境。
– 主題中盡量使用ASCII字符
雖然很多MQTT設(shè)備支持UTF-8字符作為MQTT主題,但是筆者建議您在主題中盡量使用ASCII字符。
- 在主題中嵌入客戶端ID
在主題中嵌入發(fā)布消息的客戶端ID,這一操作可以為開(kāi)發(fā)和管理MQTT信息提供便利。通過(guò)主題中的客戶端ID內(nèi)容,我們可以很容易的了解該主題信息是由哪一臺(tái)設(shè)備所發(fā)布的。

本教程為 太極創(chuàng)客團(tuán)隊(duì) 制作的《零基礎(chǔ)入門(mén)學(xué)用物聯(lián)網(wǎng)》系列教程第二篇- MQTT篇。假如您學(xué)習(xí)本教程感到有些吃力,那么您可能還沒(méi)有觀看本系列教程 第一篇 - 基礎(chǔ)知識(shí)篇。您可以通過(guò)以下鏈接前往本教程的第一篇 - 基礎(chǔ)知識(shí)篇 教程頁(yè)面。


假如您也喜歡太極創(chuàng)客,希望您將本文“分享”給更多的人,讓更多朋友認(rèn)識(shí)我們。您的每一份點(diǎn)贊與投幣,都是對(duì)我們最溫暖的鼓勵(lì)與支持。
本文編輯制作:CYNO朔 (https://space.bilibili.com/415252426/)