在機智云的整個架構(gòu)里面,如上圖,GAgent實現(xiàn)了從模塊到云端的數(shù)據(jù)交互,其實GAgent里面就是用MQTT協(xié)議實現(xiàn)的,可見MQTT協(xié)議的重要性。今天詳細介紹MQTT的發(fā)送和接收消息。
在這一章中,我們將集中講解MQTT的發(fā)布、訂閱和取消訂閱的相關(guān)問題。本節(jié)講的是關(guān)于發(fā)布/訂閱基礎(chǔ)的,這篇文章將重點講解在MQTT協(xié)議中發(fā)布和訂閱的具體細節(jié)。如果您沒有閱讀第二章,關(guān)于發(fā)布/訂閱模式基本知識的,我們強烈建議您先閱讀。
上一節(jié)我們研究了建立MQTT客戶端和代理之間的連接,所以本周我們將討論發(fā)送和接收消息。 發(fā)布
MQTT客戶端連接到代理后,可以發(fā)布消息。代理發(fā)送的消息主題進行過濾。所以每個消息都必須包含一個主題,由代理將使用該主題將消息轉(zhuǎn)發(fā)給感興趣的客戶端。每個消息通常具有包含以字節(jié)格式傳輸?shù)膶嶋H數(shù)據(jù)的有效載荷。MQTT與數(shù)據(jù)無關(guān),完全取決于有效負載的結(jié)構(gòu)使用情況。如果要發(fā)送二進制數(shù)據(jù),文本數(shù)據(jù),甚至是完整的XML或JSON,則完全由發(fā)送人來決定。MQTT發(fā)布消息還有一些很多的屬性,我們將在下面詳細討論:
9.jpg (16.76 KB, 下載次數(shù): 116)
下載附件
2017-8-25 08:54 上傳
Topic Name(主題名稱) 一個簡單的字符串,其分層結(jié)構(gòu)以正斜杠為分隔符。舉一個例子如:“myhome / livingroom / temperature”或“Germany / Munich / Octoberfest / people”。有關(guān)主題的更多詳細信息,請參考后面的文章。 一個消息的服務(wù)質(zhì)量水平,級別有0、1、2,是確定到達另一端(客戶端或代理)的消息的保證。關(guān)于更多關(guān)于QoS的內(nèi)容,我們將在后面做詳細的介紹。 該標志確定代理是否持久保存某個特定主題的消息。訂閱該主題的新客戶端將在訂閱后立即收到該主題的最后保留消息。在接下來的文章中將討論有關(guān)消息保持的更多內(nèi)容以及最佳實踐。 這是消息的實際內(nèi)容。MQTT完全與數(shù)據(jù)無關(guān)的,可以對數(shù)據(jù)進行任何編碼,加密數(shù)據(jù)和二進制的數(shù)據(jù)。 包標識符是客戶端和代理之間的唯一標識符,用于標識消息流中的消息。這僅適用于QoS1和QoS2。設(shè)置這個MQTT內(nèi)部標識符是客戶端庫或代理的事情。 重復標志表示該消息是重復的,并且被重新發(fā)送,因為另一端沒有確認原始消息。這僅與QoS1和QoS2相關(guān),更多細節(jié)在后面介紹,這與QoS級別有關(guān)。他的重新發(fā)送/重復機制通常由MQTT客戶端庫或代理程序作為實現(xiàn)細節(jié)處理。
7.jpg (17.03 KB, 下載次數(shù): 105)
下載附件
2017-8-25 08:54 上傳
最初發(fā)布消息的客戶端只關(guān)心將發(fā)布的消息傳遞給代理。從那里,代理有責任將消息傳遞給相應(yīng)的訂閱者。發(fā)布客戶端沒有得到任何反饋,如果有人對此發(fā)布的消息感興趣,也可以有多個客戶端接收到該代理的消息,接收到該消息的也可以是發(fā)布客戶端本身,因為發(fā)布和訂閱不是沖突的。 訂閱
如果沒有人收到消息,發(fā)布消息是沒有意義的,換句話說,如果沒有客戶端訂閱任何主題,客戶端需要向MQTT代理服務(wù)器發(fā)送訂閱消息,以便收到相關(guān)消息。訂閱消息很簡單,它只包含唯一的數(shù)據(jù)包標識符和訂閱列表。
8.jpg (11.99 KB, 下載次數(shù): 86)
下載附件
2017-8-25 08:54 上傳
Packet Identifier(包標識符) 包標識符是客戶端和代理之間的唯一標識符,用于標識消息流中的消息。這僅適用于QoS1和QoS2。設(shè)置這個MQTT內(nèi)部標識符是客戶端庫或代理的事情。 訂閱消息可以包含客戶端的任意數(shù)量的訂閱。每個訂閱由一對主題和QoS級別組成。訂閱消息中的主題還可以包含通配符,這使得可以訂閱某些主題模式。如果一個客戶端有重疊訂閱,該主題的最高QoS級別將獲勝,并由代理用于傳遞該消息。 每個訂閱將由代理通過以訂閱應(yīng)答消息的形式向客戶端發(fā)送確認來確認信息 。此消息包含與原始訂閱消息相同的數(shù)據(jù)包標識符(以便標識消息)和返回碼列表。
6.jpg (20.31 KB, 下載次數(shù): 115)
下載附件
2017-8-25 08:54 上傳
Packet Identifier(包標識符) 分組標識符是用于標識消息的唯一標識符。它與訂閱消息中相同。 代理為訂閱消息中接收到的每個主題/ QoS進行返回一個返回碼。因此,如果訂閱消息有5個訂閱,將有5個返回碼,以確認代理服務(wù)器授權(quán)的具有QoS級別的每個主題。如果訂閱被代理禁止(例如,如果客戶端不允許訂閱此主題,由于權(quán)限不足或該主題有問題),代理將向指定主題響應(yīng)失敗返回代碼。 在客戶端成功發(fā)送訂閱消息并收到訂閱應(yīng)答消息后,它將收到與訂閱主題相匹配的發(fā)布消息 取消訂閱
訂閱消息相對應(yīng)的是取消訂閱消息,它刪除代理上的客戶端的現(xiàn)有訂閱。取消訂閱消息類似于訂閱消息,并且還具有包標識符和主題列表。Packet Identifier(包標識符) 分組標識符是用于標識消息的唯一標識符。它與訂閱消息中相同。 主題列表包含任意數(shù)量的主題,客戶端執(zhí)行取消訂閱。只需要將主題作為字符串發(fā)送(不帶QoS),該主題將取消訂閱,而不管最初訂閱的QoS級別如何。 代理將確認取消訂閱消息的請求。該消息僅包含包標識符。Packet Identifier(包標識符) 分組標識符是用于標識消息的唯一標識符。它與訂閱消息中相同。從代理接收到取消訂閱消息后,就認為該取消訂閱消息中的訂閱消息已經(jīng)被刪除。
這就是我們的MQTT 要點系列的第三部分的結(jié)尾。我們希望你喜歡在下一篇文章中,我們將深入了解MQTT主題的使用。我們將解釋通配符的基本知識以及使用情況以及更多實際的例子。 學習總結(jié)
|