工程師項目經驗:網絡調試助手-TCP方式連接實踐
出品?21ic論壇 小葉三千
網站:bbs.21ic.com
由于項目上用到了中移云OneNet平臺,現(xiàn)在對OneNet也算是比較了解,給大家分享一下連接OneNet的MQTT的方法(TCP層)。
OneNet上有兩種MQTT協(xié)議,一種是多協(xié)議里面的MQTT(舊版),一種是MQTT物聯(lián)網套件(新版)?,F(xiàn)在平臺主推MQTT新版的,也就是MQTTS協(xié)議,協(xié)議層上面基本沒有變化,都是基于MQTT標準協(xié)議來的,但是一些參數(shù)有了很大的變化。

先說一下MQTT的連接的協(xié)議,一個MQTT數(shù)據(jù)包由:固定頭、可變頭、消息體三部分構成。固定報文頭就是固定的參數(shù),具體代表什么意思網上有很多,就不說了??勺儓笪念^是一些協(xié)議版本啊,標識等等,用不到的話一般也當作固定的就行。消息體就是一個參數(shù)的長度,后面再跟上參數(shù)的內容,例如:02(消息體長度) 31 31(2個長度的消息體”1””1”)等等,后續(xù)有具體的內容賦值。
? ?首先,先在OneNet上面創(chuàng)建MQTT物聯(lián)網套件產品,之后再產品里面添加一個設備。


? ??下載一個網絡調試助手,我用的是NetAssist.exe,附件有,大家可以去下載。選擇TCP客戶端,填寫好OneNet平臺MQTTS的IP地址:183.230.40.96,端口號:1883 ?(此IP和端口號為不加密的,加密的為183.230.40.16 ?::8883)OK,接下來需要發(fā)連接的報文了。

平臺MQTTS規(guī)定的參數(shù)是有3個,分別為設備名稱、產品ID、token密鑰,設備名稱和產品ID就是你創(chuàng)建產品的ID,和設備的名稱。Token的話就需要計算一下了,使用附件里的小程序。

小程序計算token,也需要3個參數(shù)。Res:設備名稱。Et:unix時間。Key:設備的access_key。
設備名稱就是填寫你對應的設備名稱即可。Et大概講一下,unix時間,就是從1970年1月1日(UTC/GMT的午夜)開始所經過的秒數(shù),不考慮閏秒。
國際ISO 8601規(guī)定的。可以上網找一些在線轉化的工具。填寫你想鑒權的有效時間,比如現(xiàn)在是2021-09-28 21:37:25,你Et寫個2021-09-28 22:37:25,那么到22:37:25的時候就過期了,授權時間過了。
你想授權連接多長時間就寫到多長時間。不過要注意的一點是:32位的變量只能到2038年,64位的系統(tǒng)就不存在這個問題了,需要注意一下。
計算unix時間網址:https://tool.chinaz.com/Tools/unixtime.aspx
???
Key:設備的access_key,在設備的詳情頁中找到。

將這3個參數(shù),對應填寫到小程序里面,method選擇sha1(別的也行吧,沒試過),version:填寫2018-10-31(這個是固定的,不用管它),這樣點擊Generate就可以生成出來計算好的token了。
? res:products/378414/devices/0A(378417是產品ID,0A是設備的名稱)? Et:1625445017(2021-07-05 08:30:17 Unix時間)? key:L2o5bW8ic2A7ITBEVTJlW3RITiteSl1ic3h9Um8mbSE=(設備的Key)

將計算完成的Token復制保存,等下需要用到。
這個算法很簡單,大家有興趣的可以按照官網的計算方法自己寫程序算一下。我這里使用C 已經可以算出來了。Token計算完成后,就需要填寫MQTT報文了,我們這里使用TCP發(fā)送。打開網絡助手軟件。
首先要先了解一下MQTT的報文結構:(詳細的解釋直接百度吧,這里只是我需要填寫的報文)
0x10??-固定
0x91??-整個報文的長度145
0x01??-貌似是上一個值的進位,0x91超過了7F,這里就是1,如果沒有就是0
0x00??-固定 “MQTT“的長度低位
0x04??-固定 “MQTT“的長度高位0x0004
0x4d??-’M’
0x51??-’Q’
0x54??-’T’
0x54??-’T’
0x04??-MQTT的版本04版本
0xC2??-QoS level 固定就行
0x00??-Keep Alive時間低位
0x3C??-Keep Alive時間高位0x003C??(60秒)
0x00??-Client ID Length低位
0x02 ?-Client ID Length高位 (設備的名稱長度:2)
0x30??-Client ID:0
0x41 ?-Client ID:A (設備的名稱:0A,名稱根據(jù)自己的來,對應上面的長度也要改)
0x00??-User Name Length低位
0x06 ?-User Name Length高位 (產品ID的長度:6)
....... ?-User Name ?(產品ID:378414,也是根據(jù)自己的寫)
0x00??-Password Length低位
0x79 ?-Password Length高位 (Token的長度:121,也是根據(jù)自己的長度寫)
.......??-Password??(Token的具體十六進制值填寫,根據(jù)自己的Token填寫)
到這里就報文就解析結束了,將上面的內容整理成十六進制的值,填寫到網絡助手中
之前遇到的一個問題,就是報文中的第3位的“0x01”,我填寫的是0x00,但是有的Token就可以正常連接,有的Token卻不可以正常連接。后來找到問題,Token有的很長,這一位就會變成0x01,應該是長度有進位吧,大家一定要注意。

TCP建立連接后,輸入內容,點擊發(fā)送,就可以看到有返回ACK的值是20 02 00 00,說明發(fā)送的內容正確,MQTT平臺返回接入成功,之后再看看我們OneNet平臺的設備,顯示“在線”,接入成功!

之后我們還可以使用Wireshark軟件,進行原始報文的驗證,或者監(jiān)控。打開軟件,選擇監(jiān)控的網絡通道。

在這里輸入mqtt,進行網絡報文過濾,這里只讓其顯示MQTT的報文。

之后我們在網絡助手里發(fā)送剛才的內容,重新發(fā)一次,就可以看到Wireshark出現(xiàn)了MQTT的報文,分別是發(fā)送的和接收到的ACK。
??
雙擊點擊報文還可以具體分析報文的結構和內容。? ?
附件附上計算Token的小工具(點擊閱讀原文,進入原貼下載),大家也可以根據(jù)官方的文檔的自己計算。
大家根據(jù)TCP報文格式的MQTT報文,可以自己開發(fā)上位機去通信了。






