大家好,超子又和大家见面了,超子我能力有限,水平不高,有什么错误的地方,欢迎板砖。今天我们测试一下腾讯云物联网开发平台下发命令的功能,也就是分析一下服务器推送的PUBLISH报文命令。我们还是紧接上两篇文章继续操作。

新手入门腾讯物联网开发平台,如何建立项目产品?简单详细上手快

入门腾讯物联网开发平台,如何构建MQTT协议CONNECT报文

腾讯云物联网开发平台,如何使用在线调试功能,下发远程控制命令

首先我们进入产品详情页面,然后进入第4步设备调试。使用我们上一篇文章中建立的设备D001。我们在进行下发命令的测试之前,一定要先发送CONNECT报文,等设备在线后,才能继续后面的操作,不然设备不在线,发了也收不到,看上图D001的状态是在线,是因为超子已经成功发送了CONNECT报文。

腾讯云物联网开发平台,如何使用在线调试功能,下发远程控制命令

发送完CONNECT报文之后,我们还需要订阅相关的Topic,因为MQTT协议是基于Topic订阅关系的发布与推送,所以只有订阅之后,才能收到命令的下发推送。


腾讯云物联网开发平台,如何使用在线调试功能,下发远程控制命令

我们需要订阅$
thing/down/property/65NJZ04A1B/D001这个Topic,其中65NJZ04A1B/D001分别对应产品ID和设备名称,所以不同的设备需要订阅的Topic也不同,这点一定要注意。

接下来我们构建SUBSCRIBE订阅报文,固定报头是0x82 ??,??是剩余长度,只有确定好可变报头和负载之后才能进行计算,所以一会再看剩余长度。

可变报头是2个字节的报文标识符,我们用0x00 0x01即可。接下来构建负载,我们先数一数$
thing/down/property/49F0OWAHAY/D001这个Topic 的长度,总共36个字节,换成16进制,简化书写,去掉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,根据MQTT协议格式的要求,我们还得再Topic前加上两个字节,表示长度36,也就是00 24,最后还得有一个字节表示服务质量等级,我们使用等级0,所以最后一个字节就是00,我们把可变报头和负载连在一起,换成16进制,简化书写,去掉0x后的结果如下:

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

最后可变报头+负载的长度是41,也就是剩余长度是41,换成16进制是0x29,那么SUBSCRIBE订阅报文的最终结果如下:

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订阅报文发给服务器,然后看到服务器回复了90 03 00 01 00,说明SUBSCRIBE订阅报文正确,我们可以往下测试命令下发推送了。

腾讯云物联网开发平台,如何使用在线调试功能,下发远程控制命令

我们点击调试按键,进入调试界面。

腾讯云物联网开发平台,如何使用在线调试功能,下发远程控制命令

进入调试界面后,选择在线调试,我们这个设备的功能比较简单,就是控制一个开关。但是简单也罢复杂也罢,原理都是一样的,我们首先设置一下期望下发的开关值,图中超子设置的是打开开关,然后点击下放红圈中的发送即可。

腾讯云物联网开发平台,如何使用在线调试功能,下发远程控制命令

点击发送后,服务器会把数据推送给网络调试助手,红圈中就是接收到的等级0的PUBLISH报文命令。我们复制下来分析一下。

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进制的数据,简化书写,去掉了0x。开头是30表示是等级0的PUBLISH报文,发送方向是S->C,也就是服务器推送给我们的命令。再看第2个字节是0x97,换成二进制是10010111,位7是1,表示剩余长度1个字节后面,至少还得再往后加1个字节。然后我们看后面的一个字节是01,换成二进制是00000001,位7是0,表示剩余长度不用再多了,2个字节就可以了。1*128+23=151,说明可变报头和负载总长151个字节。等级0的PUBLISH报文命令没有报文标识符,那么可变报文就是topic字符串再加上2个字节的长度表示。负载就是我们在后台下发的命令数据,负载数据不需要2个字节的长度表示,所以命令是多少字节,负载数据就是多少字节。

剩余长度后面的两个字节0x00 0x24 ,换成16进制是36,表示topic长度是36个字节,然后再加上0x00 0x24这两个字节本身,长度就是38,也就是可变报头的长度是38。然后我们从0x00 0x24 往后数36个字节,就是topic名称数据 ,截取出来如下所示:

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个字节就是topic,都是16进制,我们换成字符串就是:$
thing/down/property/65NJZ04A1B/D001,这个就是我们刚才订阅的Topic。最后还剩下113个字节

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

就是负载数据了,我们换成字符串

{"method":"control","clientToken":"clientToken-f41bdc3b-27a6-4953-9f87-1f79f0abb58d","params":{"power_switch":1}}

腾讯云物联网开发平台,如何使用在线调试功能,下发远程控制命令

对比一下,接收的数据,和调试中的数据是一样的。说明我们今天测试命令下发的任务圆满完成。