MQTT協議(一)——協議介紹與控制報文格式


一、協議介紹

MQTT協議可以理解為一個類似於kakfa或者rocketmq這種中間件的形式。它主要功能就是可以實現發布和訂閱。

不同的客戶端去跟客戶端連接,然后就可以訂閱一些主題(topic),有些客戶端如果發布了這些主題,這些訂閱的都能收到。

 

實用場景舉例: 

比如一個樓中的人都想在手機上每天收到自己樓內的溫度,

樓內住戶的手機作為客戶端(client),連接到服務端(mqttbroker),然后訂閱(subscribe)溫度這個主題,

測量溫度設備作為一個客戶端(client),在連接到服務端后推送(publish)溫度主題(topic)到服務器,

服務端收到消息后,再發送推送報文給這些訂閱的客戶端,也就是樓內人的手機,就實現溫度推送這個功能了。

 

這些連接、發布、訂閱、斷開等等操作,都需要特定的報文來實現(這也是協議存在的意義,定規矩)

MQTT規范定義了十四種不同類型的控制報文,來實現上訴各個功能。

 

二、控制報文格式

 主要分三個部分:固定頭(Fixed header)+可變頭(Variable header)+有效載荷(Payload)

1.固定頭

固定頭第一個字節byte(一個字節由8位二進制數組成)的前4位值對應不同報文類型,具體值對應如下:

后4個字節用於指定控制報文類型的標志位,目前就publish用到了,這四個字節分別對應:

  • DUP1 =控制報文的重復分發標志
  • QoS2 = PUBLISH報文的服務質量等級
  • QoS2 = PUBLISH報文的服務質量等級
  • RETAIN3 = PUBLISH報文的保留標志

2.可變報文頭

某些MQTT控制報文包含一個可變報頭部分。它在固定報頭和負載之間。可變報頭的內容根據報文類型的不同而不同。可變報頭的報文標識符(Packet Identifier)字段存在於在多個類型的報文里。

這個報文標識符用來唯一標識一條報文,可以理解為報文的id。

這東西在重發和答復的時候都會用到,如果你是重發報文,那這個標識符要跟之前的報文一樣,如果你要答復某個報文,那答復報文里的標識符要跟你答復的那個報文一樣。在答復完成后,這個id就可以被釋放重新用了。

很多控制報文的可變報頭部分包含一個兩字節的報文標識符字段。這些報文是PUBLISH(QoS > 0時), PUBACK,PUBREC,PUBREL,PUBCOMP,SUBSCRIBE, SUBACK,UNSUBSCRIBE,UNSUBACK。

QoS 1的PUBLISH對應的是PUBACK,QoS 2的PUBLISH對應的是PUBCOMP,與SUBSCRIBE或UNSUBSCRIBE對應的分別是SUBACK或UNSUBACK。

記憶的訣竅就是,凡是需要答復的和答復報文,都必須有報文標識符。

3.有效載荷

這個就是通常理解的報文體了,業務數據就是在這里頭。

不是所有的報文都需要有效載荷的。

 


免責聲明!

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



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