一、協議介紹
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.有效載荷
這個就是通常理解的報文體了,業務數據就是在這里頭。
不是所有的報文都需要有效載荷的。