腾讯的物联网平台(腾讯的物联网平台 mqtt)

Mark wiens

发布时间:2022-11-18

腾讯的物联网平台(腾讯的物联网平台 mqtt)

 

今天超子和大家一起构建一下MQTT协议中的CONNECT报文连接腾讯的物联网开发平台,只有CONNECT报文成功之后才能进行后面的通信。

我们直入主题,首先是CONNECT报文的固定报头0x10 ??,??是剩余长度,只有我们确定了可变报头和负载的长度后才能计算出来,所以一会再说。

CONNECT报文中的可变报头用来设置信息和各种功能,腾讯物联网平台和阿里云的一样,所以直接把阿里云的可变报头拿过来就行,简化的16进制书写,去掉0x,结果如下:

00 04 4D 51 54 54 04 C2 00 64

CONNECT报文中的负载包含客户端ID,用户名和密码这3个非常重要的信息,首先我们要总结下各个信息对应于腾讯云物联网平台的什么内容。

客户端ID:产品ID +设备名称

用户名:产品ID +设备名称+分号+ 21010406 +分号+78945 +分号+2147483647

密码:这个比较麻烦,需要先对设备秘钥进行base64解码,解码后的数据再作为密钥对用户名进行hmacsha1加密,加密后的密文就是MQTT协议CONNECT报文中负载的密码了

我们一起来找一下相关的信息在什么地方。

首先登录腾讯云物联网开发平台,超子在上一篇文章介绍了如何新建项目和产品。然后进入我们建立好的项目内,点击我们建立的产品。

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

进入产品详情页后,我们选择第4步的设备调试,点击红圈中的新建设备,因为设备是连接平台的终端。

我们给设备起一个名称就行,然后点击保存。

设备建立成功后,在设备列表可以看到刚才建立的D001,然后我们点击设备,进入设备详情页面。

上图中的3个信息,就是构建客户端ID,用户名和密码需要用到的内容。

先看客户端ID,结构是产品ID +设备名称,就是65NJZ04A1BD001,然后换成16进制是36 35 4E 4A 5A 30 34 41 31 42 44 30 30 31,长度是14,按照MQTT的格式要求,我们还要在最前面加入2个字节表示长度14,那么最终的16进制,简化书写,去掉0x结果如下:

互联网小常识:Internet/Interanet通用服务器主要包括:DNS服务器、WWW服务器、Ftp服务器、E-Mail服务器,以及远程通信服务器、代理服务器等。

00 0E 36 35 4E 4A 5A 30 34 41 31 42 44 30 30 31

接着构建用户名,产品ID +设备名称+分号+ 21010406 +分号+78945 +分号+2147483647,就是65NJZ04A1BD001;21010406;78945;2147483647,然后换成16进制是36 35 4E 4A 5A 30 34 41 31 42 44 30 30 31 3B 32 31 30 31 30 34 30 36 3B 37 38 39 34 35 3B 32 31 34 37 34 38 33 36 34 37,长度是40,然后按照MQTT的格式要求,我们还要在最前面加入2个字节表示长度40,那么最终的16进制,简化书写,去掉0x结果如下:

00 28 36 35 4E 4A 5A 30 34 41 31 42 44 30 30 31 3B 32 31 30 31 30 34 30 36 3B 37 38 39 34 35 3B 32 31 34 37 34 38 33 36 34 37

最后构建密码,先对ZmLVuCs4H/zX6E63+i2Ung==设备密钥进行base64解码,解码后换成16进制是66 62 D5 B8 2B 38 1F FC D7 E8 4E B7 FA 2D 94 9E,然后再作为密钥对用户名进行hmacsha1加密,加密后的结果,换成16进制是31 34 31 33 36 31 32 61 30 61 31 65 37 32 62 66 32 31 39 32 36 30 31 39 30 66 35 38 65 61 32 64 39 37 64 61 61 30 36 38 3B 68 6D 61 63 73 68 61 31,长度是49,我们还要在最前面加入2个字节表示长度49,那么最终的16进制,简化书写,去掉0x结果如下:

00 31 31 34 31 33 36 31 32 61 30 61 31 65 37 32 62 66 32 31 39 32 36 30 31 39 30 66 35 38 65 61 32 64 39 37 64 61 61 30 36 38 3B 68 6D 61 63 73 68 61 31

到此整个负载就搞定了,接下来我们把客户端ID+用户名+密码连接起来构成负载信息,简化16进制,去掉0x结果如下:

00 0E 36 35 4E 4A 5A 30 34 41 31 42 44 30 30 31 00 28 36 35 4E 4A 5A 30 34 41 31 42 44 30 30 31 3B 32 31 30 31 30 34 30 36 3B 37 38 39 34 35 3B 32 31 34 37 34 38 33 36 34 37 00 31 31 34 31 33 36 31 32 61 30 61 31 65 37 32 62 66 32 31 39 32 36 30 31 39 30 66 35 38 65 61 32 64 39 37 64 61 61 30 36 38 3B 68 6D 61 63 73 68 61 31

我们一起数一下,整个负载部分共计109个字节 。剩余长度=可变报头+负载=10+109=119,119/128=0,一个字节就能搞定,换成16进制就是0x77,最后我们把固定报头、可变报头和负载同连接起来,简化16进制,去掉0x的最终结果如下所示:

10 77 00 04 4D 51 54 54 04 C2 00 64 00 0E 36 35 4E 4A 5A 30 34 41 31 42 44 30 30 31 00 28 36 35 4E 4A 5A 30 34 41 31 42 44 30 30 31 3B 32 31 30 31 30 34 30 36 3B 37 38 39 34 35 3B 32 31 34 37 34 38 33 36 34 37 00 31 31 34 31 33 36 31 32 61 30 61 31 65 37 32 62 66 32 31 39 32 36 30 31 39 30 66 35 38 65 61 32 64 39 37 64 61 61 30 36 38 3B 68 6D 61 63 73 68 61 31

到此CONNECT报文构建完毕,我们用网络助手实测一下,腾讯云物联网开发平台提供的是域名,端口号是1883,那么网络助手中,远程主机地址就是

iotcloud-mqtt.gz.tencentdevices.com:1883

我们实际测试一下CONNECT报文,看看设备是不是在线了。

互联网小常识:DNS服务器和DHCP服务器都需要固定的IP地址。DHCP默认的租约期限设置为8天,最小单位为分钟,租约到期前客户端需要续订,续订工作由客户端自动完成,作用域激活后DHCP服务器才能为客户机分配IP地址。DHCP服务器中常用的选项有路由器选项和DNS服务器选项。

发送CONNECT报文后,服务器回复我们的CONNACK报文中,我们看最后1个字节是0x00,说明我们的CONNECT报文正确。

CONNECT报文成功发送后,我们再看设备列表,对应的D001设备的状态已经显示在线了。CONNECT报文中我们设置的keep alive的时间是100s,按协议标准要求,1.5倍时间也就是150s内,没有数据发送的话,服务器可以把我们踢下来。如果我们没有什么数据要发送的话,可以通过发送PING报文,来保持连接,不被踢下来。

今天我们就把CONNECT报文搞定了,任务圆满完成。

互联网小常识:无线局域网主要包括如下硬件设备:无线网卡、无线接入点AP、天线、无线网桥、无线路由器和无线网关。其中AP一般可连接30台左右的无线网络终端。

免责声明:本站所有信息均搜集自互联网,并不代表本站观点,本站不对其真实合法性负责。如有信息侵犯了您的权益,请告知,本站将立刻处理。联系QQ:1640731186