STM32 MQTT協定 連接配接中國移動OneNet伺服器 上傳接收資料(二)MQTT協定常用封包詳解
上一次我們講了OneNet平台的注冊,這次我們來講一下MQTT的常用封包用法
上一篇位址https://blog.csdn.net/weixin_42138122/article/details/108062089
慣例先貼上協定手冊:https://mcxiaoke.gitbooks.io/mqtt-cn/content/
我們對着手冊慢慢看
CONNECT – 連接配接服務端
要想發送資料咱們至少要先連接配接上伺服器吧,是以先來看一下連接配接封包
連接配接封包由固定報頭 可變報頭 有效載荷3個部分組成
固定報頭
顧名思義,這個部分是不會變的,我們可以在協定手冊裡看到它是什麼
第1位(byte1)是00010000轉為16進制就是10(一位8個位元組,正好對應兩位16進制,轉為16進制是為友善表述和發送,之後的表達都會采用16進制)
byte2是剩餘長度,我們先不管這個
固定報頭暫且定位:10 ??
可變報頭
byte1、byte2:前兩位表示協定名的長度,因為我們的協定是“MQTT”是以是4位,是以前兩位是 00 04
byte3、4、5、6:後四位自然就是我們的MQTT四個字母了,分别将這幾個字母的ASCII碼轉為16進制,是以後4位就是4D 51 54 54
byte7:這一位對應協定版本,由于我們用的3.1.1版本,是以這一位固定 04
byte8:這一位相當于配置一些MQTT協定的模式,每一位的配置文檔都有詳細說明,如圖配置,啟用使用者名和密碼(相當于你的裝置ID和鑒權資訊),不保留遺囑,Qos等級0,是以這一位為C2
byte9、byte10:這兩位用來設定連接配接保活時間,也就是你啥都不幹多久被伺服器踢下去,機關是秒,這裡我們設定120秒,轉為16進制也就是 00 78
總體來看我們的可變封包為:00 04 4D 51 54 54 04 C2 00 78
有效載荷
因為前面我們使了能使用者名和密碼,是以這個地方根據文檔我們應該依次填入(遺囑沒有使能):
用戶端辨別符 Client Identifier:對應Onenet的裝置ID
使用者名 User Name:對應Onenet的産品ID
密碼 Password:對應Onenet鑒權資訊
格式如下 長度+東西
上面為我畫的示意圖,注意這個地方按照你建立的裝置來填寫使用者名密碼,之前我們在固定報頭一直沒講的第二位的取值為固定報頭之後所有的長度,也就是可變報頭+有效載荷
至此我們的連接配接封包已經完成了,打開網絡助手,連接配接伺服器建立TCP連接配接,官網可以看到IP和端口号
可以看到伺服器,發了一串資料給我們應答,這個地方我們看最後一位,它表連接配接傳回碼,碼字對應意義如下:
如果為00,則代表連接配接成功,如果為其他,請根據錯誤資訊對照修改,如果你沒有收到資訊并且被直接斷開,就說明你封包格式都不對,請根據上面的教程仔細檢查修改!
DISCONNECT –斷開連接配接
上次講了連接配接,這次來講斷開連接配接
斷開連接配接可以說是相當簡單,就是很簡單的一條固定指令E0 00,先連接配接,之後再發送你就會發現連接配接斷開了
SUBSCRIBE - 訂閱主題
固定報頭
一樣很簡單,固定的暫且定位82 ??
可變報頭
這兩個位元組相當于給封包取名字,我們随便設定一個00 0A
有效載荷
如圖可以看到有效載荷的結構為長度+主題名+服務等級
假設我們訂閱一個“test”主題
由于我們需要一個發送端和一個接收端,是以我們還需要一個裝置,onent裡面點選添加裝置,另一個裝置的connect封包請自己舉一反三,這裡不再贅述
先發連接配接封包,然後再發訂閱封包
可以收到如下資訊,參看手冊可以發現我們的“00 0A”封包等級0訂閱成功
PUBLISH – 釋出消息
先介紹一點基礎概念,推送、訂閱、主題,這個東西有點像微網誌,如果你訂閱了一個使用者,那麼這個使用者發微網誌你就會收到推送,而這裡的主題就相當于微網誌的使用者,publish封包就相當于發微網誌,接下來我們看一看具體怎麼寫
固定報頭
byte1、byte2:和連接配接封包一樣,固定值和剩餘長度,并且需要一定的配置,具體配置參數手冊寫的很清楚,這裡不再贅述,我們這個地方配置Qos等級0,不保留,是以這兩位暫且為 30 ??
可變報頭
接下來是可變報頭,包含主題名和封包辨別符,由于我們是qos0是以不需要封包辨別符
假設我們向一個名為“test”的主題推送一條消息
總共包含長度和主題名兩個字段,以這裡的"test"為例,長度為4,主題名自然就是test,将test轉為16進制,封包則可以寫作00 04 74 65 73 74
有效載荷
接下來是有效載荷,說白了就i是我們要發的消息,如文檔所述,有效載荷的長度,會被伺服器自己算出來,是以這裡我們不需要給出,直接寫我們要發的消息就行了,假設我們發送字元串"AC is the Best",将ASCII碼轉為16進制,則為 41 43 20 69 73 20 74 68 65 20 42 65 73 74
由此,我們的推送封包就寫好了,總體來看為30 14 00 04 74 65 73 74 41 43 20 69 73 20 74 68 65 20 42 65 73 74
我們打開兩個網絡調試助手來進行測試,一個連接配接裝置1并推送,一個連接配接裝置2并訂閱,接收端選擇ASCII碼顯示,就可以我們已經收到了字元串"AC is the Best"
還有一些常用的封包,如PINGREQ – 心跳請求、UNSUBSCRIBE –取消訂閱等,但由于比較簡單,是以希望大家跟着手冊自己進行測試