大家好,超子又和大家見面了,超子我能力有限,水平不高,有什么錯(cuò)誤的地方,歡迎板磚。今天我們測試一下騰訊云物聯(lián)網(wǎng)開發(fā)平臺(tái)下發(fā)命令的功能,也就是分析一下服務(wù)器推送的PUBLISH報(bào)文命令。我們還是緊接上兩篇文章繼續(xù)操作。
《新手入門騰訊物聯(lián)網(wǎng)開發(fā)平臺(tái),如何建立項(xiàng)目產(chǎn)品?簡單詳細(xì)上手快》
《入門騰訊物聯(lián)網(wǎng)開發(fā)平臺(tái),如何構(gòu)建MQTT協(xié)議CONNECT報(bào)文》
首先我們進(jìn)入產(chǎn)品詳情頁面,然后進(jìn)入第4步設(shè)備調(diào)試。使用我們上一篇文章中建立的設(shè)備D001。我們在進(jìn)行下發(fā)命令的測試之前,一定要先發(fā)送CONNECT報(bào)文,等設(shè)備在線后,才能繼續(xù)后面的操作,不然設(shè)備不在線,發(fā)了也收不到,看上圖D001的狀態(tài)是在線,是因?yàn)槌右呀?jīng)成功發(fā)送了CONNECT報(bào)文。
發(fā)送完CONNECT報(bào)文之后,我們還需要訂閱相關(guān)的Topic,因?yàn)镸QTT協(xié)議是基于Topic訂閱關(guān)系的發(fā)布與推送,所以只有訂閱之后,才能收到命令的下發(fā)推送。
我們需要訂閱$
thing/down/property/65NJZ04A1B/D001這個(gè)Topic,其中65NJZ04A1B/D001分別對應(yīng)產(chǎn)品ID和設(shè)備名稱,所以不同的設(shè)備需要訂閱的Topic也不同,這點(diǎn)一定要注意。
接下來我們構(gòu)建SUBSCRIBE訂閱報(bào)文,固定報(bào)頭是0x82 ??,??是剩余長度,只有確定好可變報(bào)頭和負(fù)載之后才能進(jìn)行計(jì)算,所以一會(huì)再看剩余長度。
可變報(bào)頭是2個(gè)字節(jié)的報(bào)文標(biāo)識(shí)符,我們用0x00 0x01即可。接下來構(gòu)建負(fù)載,我們先數(shù)一數(shù)$
thing/down/property/49F0OWAHAY/D001這個(gè)Topic 的長度,總共36個(gè)字節(jié),換成16進(jìn)制,簡化書寫,去掉0x后是24 74 68 69 6E 67 2F 64 6F 77 6E 2F 70 72 6F 70 65 72 74 79 2F 36 35 4E 4A 5A 30 34 41 31 42 2F 44 30 30 31,根據(jù)MQTT協(xié)議格式的要求,我們還得再Topic前加上兩個(gè)字節(jié),表示長度36,也就是00 24,最后還得有一個(gè)字節(jié)表示服務(wù)質(zhì)量等級(jí),我們使用等級(jí)0,所以最后一個(gè)字節(jié)就是00,我們把可變報(bào)頭和負(fù)載連在一起,換成16進(jìn)制,簡化書寫,去掉0x后的結(jié)果如下:
00 01 00 24 24 74 68 69 6E 67 2F 64 6F 77 6E 2F 70 72 6F 70 65 72 74 79 2F 36 35 4E 4A 5A 30 34 41 31 42 2F 44 30 30 31 00
最后可變報(bào)頭+負(fù)載的長度是41,也就是剩余長度是41,換成16進(jìn)制是0x29,那么SUBSCRIBE訂閱報(bào)文的最終結(jié)果如下:
82 29 00 01 00 24 24 74 68 69 6E 67 2F 64 6F 77 6E 2F 70 72 6F 70 65 72 74 79 2F 36 35 4E 4A 5A 30 34 41 31 42 2F 44 30 30 31 00
我們把SUBSCRIBE訂閱報(bào)文發(fā)給服務(wù)器,然后看到服務(wù)器回復(fù)了90 03 00 01 00,說明SUBSCRIBE訂閱報(bào)文正確,我們可以往下測試命令下發(fā)推送了。
我們點(diǎn)擊調(diào)試按鍵,進(jìn)入調(diào)試界面。
進(jìn)入調(diào)試界面后,選擇在線調(diào)試,我們這個(gè)設(shè)備的功能比較簡單,就是控制一個(gè)開關(guān)。但是簡單也罷復(fù)雜也罷,原理都是一樣的,我們首先設(shè)置一下期望下發(fā)的開關(guān)值,圖中超子設(shè)置的是打開開關(guān),然后點(diǎn)擊下放紅圈中的發(fā)送即可。
點(diǎn)擊發(fā)送后,服務(wù)器會(huì)把數(shù)據(jù)推送給網(wǎng)絡(luò)調(diào)試助手,紅圈中就是接收到的等級(jí)0的PUBLISH報(bào)文命令。我們復(fù)制下來分析一下。
30 97 01 00 24 24 74 68 69 6E 67 2F 64 6F 77 6E 2F 70 72 6F 70 65 72 74 79 2F 36 35 4E 4A 5A 30 34 41 31 42 2F 44 30 30 31 7B 22 6D 65 74 68 6F 64 22 3A 22 63 6F 6E 74 72 6F 6C 22 2C 22 63 6C 69 65 6E 74 54 6F 6B 65 6E 22 3A 22 63 6C 69 65 6E 74 54 6F 6B 65 6E 2D 66 34 31 62 64 63 33 62 2D 32 37 61 36 2D 34 39 35 33 2D 39 66 38 37 2D 31 66 37 39 66 30 61 62 62 35 38 64 22 2C 22 70 61 72 61 6D 73 22 3A 7B 22 70 6F 77 65 72 5F 73 77 69 74 63 68 22 3A 31 7D 7D
以上都是16進(jìn)制的數(shù)據(jù),簡化書寫,去掉了0x。開頭是30表示是等級(jí)0的PUBLISH報(bào)文,發(fā)送方向是S->C,也就是服務(wù)器推送給我們的命令。再看第2個(gè)字節(jié)是0x97,換成二進(jìn)制是10010111,位7是1,表示剩余長度1個(gè)字節(jié)后面,至少還得再往后加1個(gè)字節(jié)。然后我們看后面的一個(gè)字節(jié)是01,換成二進(jìn)制是00000001,位7是0,表示剩余長度不用再多了,2個(gè)字節(jié)就可以了。1*128+23=151,說明可變報(bào)頭和負(fù)載總長151個(gè)字節(jié)。等級(jí)0的PUBLISH報(bào)文命令沒有報(bào)文標(biāo)識(shí)符,那么可變報(bào)文就是topic字符串再加上2個(gè)字節(jié)的長度表示。負(fù)載就是我們在后臺(tái)下發(fā)的命令數(shù)據(jù),負(fù)載數(shù)據(jù)不需要2個(gè)字節(jié)的長度表示,所以命令是多少字節(jié),負(fù)載數(shù)據(jù)就是多少字節(jié)。
剩余長度后面的兩個(gè)字節(jié)0x00 0x24 ,換成16進(jìn)制是36,表示topic長度是36個(gè)字節(jié),然后再加上0x00 0x24這兩個(gè)字節(jié)本身,長度就是38,也就是可變報(bào)頭的長度是38。然后我們從0x00 0x24 往后數(shù)36個(gè)字節(jié),就是topic名稱數(shù)據(jù) ,截取出來如下所示:
24 74 68 69 6E 67 2F 64 6F 77 6E 2F 70 72 6F 70 65 72 74 79 2F 36 35 4E 4A 5A 30 34 41 31 42 2F 44 30 30 31
以上36個(gè)字節(jié)就是topic,都是16進(jìn)制,我們換成字符串就是:$
thing/down/property/65NJZ04A1B/D001,這個(gè)就是我們剛才訂閱的Topic。最后還剩下113個(gè)字節(jié)
7B 22 6D 65 74 68 6F 64 22 3A 22 63 6F 6E 74 72 6F 6C 22 2C 22 63 6C 69 65 6E 74 54 6F 6B 65 6E 22 3A 22 63 6C 69 65 6E 74 54 6F 6B 65 6E 2D 66 34 31 62 64 63 33 62 2D 32 37 61 36 2D 34 39 35 33 2D 39 66 38 37 2D 31 66 37 39 66 30 61 62 62 35 38 64 22 2C 22 70 61 72 61 6D 73 22 3A 7B 22 70 6F 77 65 72 5F 73 77 69 74 63 68 22 3A 31 7D 7D
就是負(fù)載數(shù)據(jù)了,我們換成字符串
{"method":"control","clientToken":"clientToken-f41bdc3b-27a6-4953-9f87-1f79f0abb58d","params":{"power_switch":1}}
對比一下,接收的數(shù)據(jù),和調(diào)試中的數(shù)據(jù)是一樣的。說明我們今天測試命令下發(fā)的任務(wù)圓滿完成。