MQTT協議以及庫函數說明


內容簡介:之前我們寫了一篇ESP8266AT指令的說明文檔,在客戶端連接上服務器之后,接下來便是網絡通信。為此我們又寫了這一片MQTT協議的說明文檔,更加深層次的講述了通信的原理。此文檔只是我們在調試過程中的一些小結和經驗,所以並不是規范的設計手冊。如果想要使用了解MQTT協議,一定是要仔細看到他的手冊的。如果發現文中有寫錯的地方也希望指出,我們會改正,並且在我們的公眾號“眼湖雲”中更新。

圖片沒法貼上來,所以需要結合手冊來看。

 

我們的網絡通信通過三部分,網關(ESP8266),MQTT協議,服務器。

在通過ESP8266連接上服務器之后,下面就要通過MQTT進行通信。MQTT協議最新的版本是MQTT-3.1.1-CN,這個可以上網去下載,不過我們建議將MQTT-3.1protocol-Specific中文版也下載下來,兩份一起看,比較詳細。還有MQTT的源碼,網上也有的下載。

簡單點來說,MQTT協議就是將你要發送的內容按照它的規定組成一串字符串,然后發送出去,至於服務器接收到了怎么解析就不是我們玩嵌入式的人管的了。

MQTT協議一共有14個消息類型:

1.客戶端請求連接到服務器; 2.連接確認; 3.發布消息;4.發布確認;5.發布信息收到;6.發布信息分發;7.發布完成 8.客戶端訂閱請求;9.訂閱確認;10.客戶端取消訂閱請求;
11.取消訂閱確認;12.ping請求;13.ping響應;14.客戶端正在斷開連接;

而他們的發送格式都是一樣的,一共有三部分組成:

固定報頭,可變報頭,有效載體

具體的每一種的意思可以查看手冊,我們這里只用到其中的三種,分別是1,3,8。接下來我們講講這三種消息類型。

一、客戶端請求連接服務器。

客戶端連接到服務器之后,客戶端發送給服務器的第一個報文(第一個字符串,也就是消息類型)必須是第一個消息類型,也就是上面列出來的第一個消息類型,客戶端請求連接到服務器connect)。

那么我們該送什么樣的字符串呢,其實手冊上已經列了出來怎么發送,它的格式都是定死的。

我們給出一個字符串,也就是經過MQTT協議后將要發出去的字符串:

0x10  0x2d  0x00  0x04  ‘M’  ‘Q’  ‘T’  ‘T’  0x04  0xc2  0x0b  0xb8  0x00  0x10  

‘4’  ‘0’  ‘F’  ‘’0  ‘6’  ‘0’  ‘0’  ‘0’  ‘5’  ‘0’  ‘8’  ‘0’  ‘4’  ‘0’  ‘5’  ‘0’  0X00  0X05

‘a’  ‘d’  ‘m’  ‘i’  ‘n’   0x00   0x08  ‘p’   ‘a’   ‘s’   ‘s’   ‘w’   ‘o’   ‘r’   ‘d’ 

   一共是47個字符。

 

1.開頭的兩個字符。0x10  0x2d   這兩個字節就是固定報頭。固定報頭只有兩個字節,每個字節八位。每一位都有它代表的意思。

0x10 (0001 0000):  低四位是保留位,默認都是0

                             高四位則是代表這個字符串是第一種消息類型,括號里的1就是它的號碼代,手冊里有詳細的表格。

0x2d (0010 1011):  這個字節是剩余長度,也就是這個字節之后,多有字節的個數(可變報 頭+有效載體),我們這里一共47個字符,減去這兩個,就是45個,十 六進制就是0x2d

 

2.接下來是可變報頭,可變報頭由四個部分組成:協議名,協議級別,連接標志和保持連接

 

協議名有六個字節,也就是接下來的0x00  0x04  ‘M’  ‘Q’  ‘T’  ‘T’  

    0x00  0x04 這是一組,代表后面的協議名的長度,我們這里協議名便是MQTT,長度4

協議級別一個字節 0x04 。這個在手冊中給出了這個固定的數據,也就是這個協議的版本的代表。

連接標志一個字節:0xc2   (1100 0010)

每一位的意思手冊上有。

Clean Session:服務器在斷開連接后,是不是要保存客戶端的信息,我們保存,設為0

也就是如果我們的ESP8266在發消息時突然斷開了,接着又連了上來,那么服   務器接着斷開時的狀態接續發送。

Willflag:這里我們不用這一位,這一位不設置,后面的will QOS will retain都不用設置。

Username password 就是進入你的服務器的賬號和密碼了。我們這里用到了,所以這兩位都是1.

 

最后是保持連接,兩個字節,0x0b  0xb8。 這個講起來比較多,我們這里簡單解釋一下,詳細的需要自己看手冊,專門有講解。保持連接也就是心跳,即多長時間檢查一下是否還發消息和是否保持着連接,我們這兩個字節就是設置的這個時間。

 

3.接下來就是有效載體,包括戶端標識符,遺囑主題,遺囑消息,用戶名,密碼

客戶端標識符:0x00 0x10 40F0600050804050    前面兩個字節就是代表標識符的長度,后面的40F......就是客戶端標識符,代表着哪一個客戶端,這個自己根據自己的設計來決定。

遺囑主題,遺囑消息我們都沒有。

接下來的就是用戶名和密碼。

0X00  0X05  admin   0x00   0x08   password  

這個的意思不講也應該知道了,不再說了。

 

二、第一步的connect完成后,就是請求連接成功了。

接下來就是發布消息和接收消息,這兩個不再詳細展開,他們的格式都是和上面的第一步一樣的,設置值根據手冊中的數據設置就可以。

簡單解釋一下,客戶端向服務器傳消息,就是publish,發布消息,那么按照發布消息的消息格式發送就可以。

客戶端想要接收服務器的消息,就是接收消息了,這個需要在連接成功后就發送給服務器。意思就是:我們使用的微信,上面有很多的公眾號。但是你怎么樣才能受到這些公眾號的消息呢,你得先關注這些公眾號。同理,這里的服務器有很多的消息,你想要接收那部分的,就需要向服務器發送那部分消息的公眾號才可以接收。


免責聲明!

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



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