使用网络调试助手通过MQTT协议接入到华为云物联网平台
一、寫在之前
????????首先分享一篇華為云的官方指南:在線開發MQTT協議的智慧路燈_設備接入 IoTDA_最佳實踐_設備接入_華為云
? ? ? ? 這篇文章很好地講述了如何通過MQTT.fx的設備模擬器替代真實的設備,然后快速體驗設備上報數據到物聯網平臺和遠程下發控制命令到設備的全過程。但是MQTT.fx在這里屏蔽了太多MQTT協議的細節,我們只需要簡簡單單copy幾條字符串,就可以完成CONNECT、PUBLIC等操作,這對于入門肯定是有好處的,但是如果想要從中學習MQTT協議,那就幫助不大了。所以在做完這個實驗后,老師推薦我們使用網絡調試助手通過MQTT協議接入到華為云物聯網平臺。所以在這里我也會用網絡調試助手重現官方指南中所有的操作,在這個過程中熟悉了解MQTT報文的格式。
二、前期準備
? ? ? ? 強烈建議先跟著華為云的官方指南先操作一遍!!!
? ? ? ? 軟件:網絡調試助手,附百度網盤鏈接:
????????鏈接:https://pan.baidu.com/s/19Nv_Q5jzwqVKQI_WczZCaQ?
????????提取碼:1i57
? ? ? ? 連接信息:
? ? ? ? (1)根據官方指南,得到的ClientId、Username、Password
? ? ? ? (2)成功注冊設備后,獲得的diviceId(不是這個截圖里的,而是截圖所代表的這一步完成之后,會自動收到一份txt,是那里面的)
? ? ? ? ?(3)平臺的對接地址
? ? ? ? ?筆者的連接信息如下,建議大家可以用一個word文檔把這些東西記下來,因為之后會用到:
????????ClientId:621e287fe68aa647c088f044_123456lzy_0_0_2022030114
????????Username:621e287fe68aa647c088f044_123456lzy
????????Password:0218f83bed7afa2be05c453fe79e585d3c2244fde7161f8b11b6ee8acf49c8fa
????????diviceId:621e287fe68aa647c088f044_123456lzy
? ? ? ? 平臺對接地址:a1621c9400.iot-mqtts.cn-north-4.myhuaweicloud.com
? ? ? ? (這些是筆者的連接信息哦,每個人連接信息都不相同)
三、連接到華為云平臺(CONNECT)
? ? ? ? 一份MQTT報文由三個部分組成,分別是固定報頭+可變報頭+負載。我們先不去了解報文的每一個字段,每一個數字詳細是什么含義,先來組裝一個CONNECT報文。(以下出現的都是十六進制)
? ? ? ? 1、固定報頭:10 +(可變報頭和負載的總長度)
? ? ? ? 2、可變報頭:00 04 4D 51 54 54 04 C2 00 64(00 64是Keep Alive的時長,可自行定義)
? ? ? ? 3、負載(這個部分一定要認真仔細)
? ? ? ? 先打開我們的網絡調試助手,我們利用它來將字符串轉化為十六進制,還能統計長度。要轉化的字符串如下:
????????ClientId:621e287fe68aa647c088f044_123456lzy_0_0_2022030114
????????Username:621e287fe68aa647c088f044_123456lzy
????????Password:0218f83bed7afa2be05c453fe79e585d3c2244fde7161f8b11b6ee8acf49c8fa
? ? ? ? 先來轉化ClientId,按照我的截圖中的設置界面的各種選項:
? ? ? ? 將十六進制碼復制過來:
????????36 32 31 65 32 38 37 66 65 36 38 61 61 36 34 37 63 30 38 38 66 30 34 34 5F 31 32 33 34 35 36 6C 7A 79 5F 30 5F 30 5F 32 30 32 32 30 33 30 31 31 34
? ? ? ? 然后在前面加上它的長度的十六進制碼,右下角有十進制的長度,我們手算裝換一下進制就行:
????????00 31 36 32 31 65 32 38 37 66 65 36 38 61 61 36 34 37 63 30 38 38 66 30 34 34 5F 31 32 33 34 35 36 6C 7A 79 5F 30 5F 30 5F 32 30 32 32 30 33 30 31 31 34
? ? ? ? (這里注意,長度的格式為00+長度,不要漏掉00)
? ? ? ? 依樣畫葫蘆,得到Username和Password的十六進制串:
? ? ? ? Username:
????????00 22 36 32 31 65 32 38 37 66 65 36 38 61 61 36 34 37 63 30 38 38 66 30 34 34 5F 31 32 33 34 35 36 6C 7A 79
? ? ? ? Password:
????????00 40 30 32 31 38 66 38 33 62 65 64 37 61 66 61 32 62 65 30 35 63 34 35 33 66 65 37 39 65 35 38 35 64 33 63 32 32 34 34 66 64 65 37 31 36 31 66 38 62 31 31 62 36 65 65 38 61 63 66 34 39 63 38 66 61
? ? ? ? 再把三者連接起來,恭喜,CONNECT報文的負載就有了!
????????00 31 36 32 31 65 32 38 37 66 65 36 38 61 61 36 34 37 63 30 38 38 66 30 34 34 5F 31 32 33 34 35 36 6C 7A 79 5F 30 5F 30 5F 32 30 32 32 30 33 30 31 31 34 00 22 36 32 31 65 32 38 37 66 65 36 38 61 61 36 34 37 63 30 38 38 66 30 34 34 5F 31 32 33 34 35 36 6C 7A 79 00 40 30 32 31 38 66 38 33 62 65 64 37 61 66 61 32 62 65 30 35 63 34 35 33 66 65 37 39 65 35 38 35 64 33 63 32 32 34 34 66 64 65 37 31 36 31 66 38 62 31 31 62 36 65 65 38 61 63 66 34 39 63 38 66 61
? ? ? ? 然后我們把可變報頭加到負載的前面:
????????00 04 4D 51 54 54 04 C2 00 64 00 31 36 32 31 65 32 38 37 66 65 36 38 61 61 36 34 37 63 30 38 38 66 30 34 34 5F 31 32 33 34 35 36 6C 7A 79 5F 30 5F 30 5F 32 30 32 32 30 33 30 31 31 34 00 22 36 32 31 65 32 38 37 66 65 36 38 61 61 36 34 37 63 30 38 38 66 30 34 34 5F 31 32 33 34 35 36 6C 7A 79 00 40 30 32 31 38 66 38 33 62 65 64 37 61 66 61 32 62 65 30 35 63 34 35 33 66 65 37 39 65 35 38 35 64 33 63 32 32 34 34 66 64 65 37 31 36 31 66 38 62 31 31 62 36 65 65 38 61 63 66 34 39 63 38 66 61
? ? ? ? 然后我們計算上面這一大串的長度,筆者這里為163,轉化為十六進制就是A3,這里要注意一下了,如果大于128,A3后面要加01放進固定報頭中,我這里是A3 01,so,最后的報文:
????????10 A3 01 00 04 4D 51 54 54 04 C2 00 64 00 31 36 32 31 65 32 38 37 66 65 36 38 61 61 36 34 37 63 30 38 38 66 30 34 34 5F 31 32 33 34 35 36 6C 7A 79 5F 30 5F 30 5F 32 30 32 32 30 33 30 31 31 34 00 22 36 32 31 65 32 38 37 66 65 36 38 61 61 36 34 37 63 30 38 38 66 30 34 34 5F 31 32 33 34 35 36 6C 7A 79 00 40 30 32 31 38 66 38 33 62 65 64 37 61 66 61 32 62 65 30 35 63 34 35 33 66 65 37 39 65 35 38 35 64 33 63 32 32 34 34 66 64 65 37 31 36 31 66 38 62 31 31 62 36 65 65 38 61 63 66 34 39 63 38 66 61
? ? ? ? 終于完成了,以上就是我們的CONNECT報文!現在我們來發送吧,上截圖:
? ? ? ? 按照我的界面來配置界面,回復20 02 00 00?即為連接成功,回復其它的就是連接失敗了,太久沒有回復就是你滴十六進制碼有問題,建議檢查一下長度,有沒有缺00,總長度后面是否要加01。連接成功后,在控制臺找到所有設備。看到已經有了一個綠色的點,在線。
? ? ? ? ?到此為止,我們已經完成了連接到平臺的過程,發送的那一大串十六進制碼,就是所謂的CONNECT報文。
四、上報數據(PUBLISH)
? ? ? ? 接下來是PUBLISH報文,相信看到這里,你應該對報文有些許認識了吧,沒有太多深奧的東西,就是一串十六進制的數字串,但是它的每個字節都有它的含義,少了一個字節,機器就辨認不出來。
? ? ? ? 如果你已經理解的話,那么只要知道結構,報文就可以自己整理出來了吧!
? ? ? ? PUBLISH報文的結構:
? ? ? ? (1)固定報頭:30 +(可變報頭+負載的總長度)
? ? ? ? (2)可變報頭:長度 + topic(華為云的指南有說明,topic實際上就是那個接口地址)
? ? ? ? 筆者的為:$oc/devices/{621e287fe68aa647c088f044_123456lzy}/sys/properties/report
? ? ? ? (3)負載:依舊看華為云的指南,其實就是這段代碼,復制過來,咱們把回車刪掉,弄成一行。有一點要提,這個負載我們弄成十六進制后就不用在前面加長度了。
? ? ? ? 筆者的為:{"services": [{"service_id": "BasicData","properties": {"luminance": 40}}]}
? ? ? ? (40是我改動的luminance的值,要驗證的同學可以隨意改一下)
????????最后的PUBLISH報文:
????????30 93 01 00 46 24 6F 63 2F 64 65 76 69 63 65 73 2F 7B 36 32 31 65 32 38 37 66 65 36 38 61 61 36 34 37 63 30 38 38 66 30 34 34 5F 31 32 33 34 35 36 6C 7A 79 7D 2F 73 79 73 2F 70 72 6F 70 65 72 74 69 65 73 2F 72 65 70 6F 72 74 7B 22 73 65 72 76 69 63 65 73 22 3A 20 5B 7B 22 73 65 72 76 69 63 65 5F 69 64 22 3A 20 22 42 61 73 69 63 44 61 74 61 22 2C 22 70 72 6F 70 65 72 74 69 65 73 22 3A 20 7B 22 6C 75 6D 69 6E 61 6E 63 65 22 3A 20 34 30 7D 7D 5D 7D
? ? ? ? CONNECT后發送,上截圖:
? ? ? ? 發送的PUBLISH報文雖然沒有得到回復,但是我們刷新一下華為云的設備詳情,變成了40,成功改變了luminance!
五、命令下發
? ? ? ? 命令下發就更簡單了,是平臺給我們發命令,發送完CONNECT報文后,我們打開華為云平臺的命令下發,點擊確定:
? ? ? ? ?在網絡調試助手可以收到:
? ? ? ? 搞定!
六、MQTT協議總結
? ? ? ? 寫到這里我本來是想把MQTT的報文的各種結構、細節、資料什么的全部都copy貼過來的,如果上面的步驟都有好好過完的話,看懂MQTT協議應該是沒有什么問題的了,但是隨便一搜就能搜到的東西我也不好意思水字數了,CSDN上有很多人總結得比我更厲害(其實是因為我懶,哈哈哈)。我一直都是這樣的觀點,有基礎才能看得懂,沒基礎,看別人寫的經驗、帖子,就是對著干巴巴的文字呲牙。實踐之后形成感性的認識,才能更好接收理論上的知識。
? ? ? ? 最后,這是我寫的第一篇文章,自己也是個新手,如果有寫的不對的地方,希望大家不吝賜教!
總結
以上是生活随笔為你收集整理的使用网络调试助手通过MQTT协议接入到华为云物联网平台的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 介绍一个让头像眼部和嘴巴动起来的在线娱乐
- 下一篇: oracle全局索引改成本地索引,解析一