【零基礎學物聯(lián)網(wǎng)】MQTT篇 1-5 發(fā)布、訂閱和取消訂閱

為了幫助您學習,我們專門為本教程制作了視頻。
↓

在之前的課程里,我們學習了如何使用MQTT客戶端連接MQTT服務端。在這節(jié)課里,我們學習客戶端如何實現(xiàn)發(fā)布消息、訂閱主題以及取消訂閱主題。在本節(jié)課里我們將重點講解以下MQTT報文:
* PUBLISH – 發(fā)布信息
* SUBSCRIBE – 訂閱主題
* SUBACK – 訂閱確認
* UNSUBSCRIBE – 取消訂閱

PUBLISH – 發(fā)布消息
MQTT客戶端一旦連接到服務端,便可以發(fā)布消息。 每條發(fā)布的MQTT消息必須包含一個主題。MQTT服務器可以通過主題確定將消息轉(zhuǎn)發(fā)給哪些客戶端。(注:這里的消息指的是MQTT報文。)

MQTT客戶端發(fā)布消息時,會向服務端發(fā)送PUBLISH報文。以下是PUBLISH報文的詳細信息。

上圖左側(cè)欄中的內(nèi)容是PUBLISH報文所包含的信息名稱。右側(cè)是信息的具體內(nèi)容。
topicName – 主題名
主題名用于識別此信息應發(fā)布到哪一個主題。關(guān)于MQTT主題的應用,我們在之前的課程中已經(jīng)做了詳細介紹,在后續(xù)課程中我們還會對主題的高級應用進行更加詳細的講解。
QoS – 服務質(zhì)量等級
QoS(Quality of Service)表示MQTT消息的服務質(zhì)量等級。QoS有三個級別:0、1和2。QoS決定MQTT通訊有什么樣的服務保證。有關(guān)QoS的詳細信息我們會在后續(xù)課程中詳細講解。
packetId – 報文標識符
報文標識符可用于對MQTT報文進行標識。不同的MQTT報文所擁有的標識符不同。MQTT設備可以通過該標識符對MQTT報文進行甄別和管理。請注意:報文標識符的內(nèi)容與QoS級別有密不可分的關(guān)系。只有QoS級別大于0時,報文標識符才是非零數(shù)值。如果QoS等于0,報文標識符為0。
retainFlag – 保留標志
在默認情況下,當客戶端訂閱了某一主題后,并不會馬上接收到該主題的信息。只有在客戶端訂閱該主題后,服務端接收到該主題的新信息時,服務端才會將最新接收到的該主題信息推送給客戶端。
但是在有些情況下,我們需要客戶端在訂閱了某一主題后馬上接收到一條該主題的信息。這時候就需要用到保留標志這一信息。關(guān)于保留標志的具體使用方法,我們將在本教程的后續(xù)部分進行詳細講解。
Payload – 有效載荷
有效載荷是我們希望通過MQTT所發(fā)送的實際內(nèi)容。我們可以使用MQTT協(xié)議發(fā)送文本,圖像等格式的內(nèi)容。這些內(nèi)容都是通過有效載荷所發(fā)送的。
dupFlag – 重發(fā)標志
當MQTT報文的接收方?jīng)]有及時確認收到報文時,發(fā)送方會重復發(fā)送MQTT報文。在重復發(fā)送MQTT報文時,發(fā)送方會將此“重發(fā)標志”設置為true。請注意,重發(fā)標志只在QoS級別大于0時使用。有關(guān)QoS的詳細信息,我們將會在后續(xù)教程中為您做詳細介紹。

SUBSCRIBE – 訂閱主題
當客戶端連接到服務端后,除了可以發(fā)布消息,也可以接收消息。我們在之前的課程講過,所有MQTT消息都有主題。客戶端要想接收消息,首先要訂閱該消息的主題。這樣,當有客戶端向該主題發(fā)布消息后,訂閱了該主題的客戶端就能接收到消息了。
客戶端要想訂閱主題,首先要向服務端發(fā)送主題訂閱請求??蛻舳耸峭ㄟ^向服務端發(fā)送SUBSCRIBE報文來實現(xiàn)這一請求的。該報文包含有一系列“訂閱主題名”。請留意,一個SUBSCRIBE報文可以包含有單個或者多個訂閱主題名。也就是說,一個SUBSCRIBE報文可以用于訂閱一個或者多個主題。
在以上PUBLISH報文講解中,我們曾經(jīng)提到過QoS(服務質(zhì)量等級)這一概念。同樣的,客戶端在訂閱主題時也可以明確QoS。服務端會根據(jù)SUBSCRIBE中的QoS來提供相應的服務保證。
另外每一個SUBSCRIBE報文還包含有“報文標識符”。報文標識符可用于對MQTT報文進行標識。不同的MQTT報文所擁有的標識符不同。MQTT設備可以通過該標識符對MQTT報文進行甄別和管理。

SUBACK – 訂閱確認
服務端接收到客戶端的訂閱報文后,會向客戶端發(fā)送SUBACK報文確認訂閱。
SUBACK報文包含有“訂閱返回碼”和“報文標識符”這兩個信息。
returnCode – 訂閱返回碼
客戶端向服務端發(fā)送訂閱請求后,服務端會給客戶端返回一個訂閱返回碼。
在之前的講解中我們說過,客戶端可通過一個SUBSCRIBE報文發(fā)送多個主題的訂閱請求。服務端會針對SUBSCRIBE報文中的所有訂閱主題來逐一回復給客戶端一個返回碼。
這個返回碼的作用是告知客戶端是否成功訂閱了主題。以下是返回碼的詳細說明。
0 - 訂閱成功 – QoS 0
1 - 訂閱成功- QoS 1
2 - 訂閱成功- QoS 2
128 - 訂閱失敗
請留意,如上表所示,針對不同的主題訂閱QoS,服務端的返回碼會有所不同。
另外每一個SUBACK報文也包含有“報文標識符”。MQTT設備可以通過該標識符對報文進行管理。

UNSUBSCRIBE – 取消訂閱
顧名思義,當客戶端要取消訂閱某主題時,可通過向服務端發(fā)送UNSUBSCRIBE – 取消訂閱報文來實現(xiàn)。
以上示意圖顯示,UNSUBSCRIBE報文包含兩個重要信息,第一個是取消訂閱的主題名稱。同一個UNSUBSCRIBE報文可以同時包含多個取消訂閱的主題名稱。另外,UNSUBSCRIBE報文也包含“報文標識符”,MQTT設備可以通過該標識符對報文進行管理。
當服務端接收到UNSUBSCRIBE報文后,會向客戶端發(fā)送取消訂閱確認報文 – UNSUBACK報文。該報文含有客戶端所發(fā)送的“取消訂閱報文標識符”。
客戶端接收到UNSUBACK報文后就可以確認取消主題訂閱已經(jīng)成功完成了。

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


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