OneNet平台新版MQTTS协议
由于项目上用到了中移云OneNet平台,现在对OneNet也算是比较了解,给大家分享一下连接OneNet的MQTT的方法(TCP层)。
OneNet上有两种MQTT协议,一种是多协议里面的MQTT(旧版),一种是MQTT物联网套件(新版)。现在平台主推MQTT新版的,也就是MQTTS协议,协议层上面基本没有变化,都是基于MQTT标准协议来的,但是一些参数有了很大的变化。
先说一下MQTT的连接的协议,一个MQTT数据包由:固定头、可变头、消息体三部分构成。固定报文头就是固定的参数,具体代表什么意思网上有很多,就不说了。可变报文头是一些协议版本啊,标识等等,用不到的话一般也当作固定的就行。消息体就是一个参数的长度,后面再跟上参数的内容,例如:02(消息体长度) 31 31(2个长度的消息体”1””1”)等等,后续有具体的内容赋值。
首先,先在OneNet上面创建MQTT物联网套件产品,之后再产品里面添加一个设备。
下载一个网络调试助手,我用的是NetAssist.exe,附件有,大家可以去下载。选择TCP客户端,填写好OneNet平台MQTTS的IP地址:183.230.40.96,端口号:1883 (此IP和端口号为不加密的,加密的为183.230.40.16 ::8883)OK,接下来需要发连接的报文了。
平台MQTTS规定的参数是有3个,分别为设备名称、产品ID、token密钥,设备名称和产品ID就是你创建产品的ID,和设备的名称。Token的话就需要计算一下了,使用附件里的小程序。
小程序计算token,也需要3个参数。Res:设备名称。Et:unix时间。Key:设备的access_key。
设备名称就是填写你对应的设备名称即可。Et大概讲一下,unix时间,就是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。国际ISO 8601规定的。可以上网找一些在线转化的工具。填写你想鉴权的有效时间,比如现在是2021-09-28 21:37:25,你Et写个2021-09-28 22:37:25,那么到22:37:25的时候就过期了,授权时间过了。你想授权连接多长时间就写到多长时间。不过要注意的一点是:32位的变量只能到2038年,64位的系统就不存在这个问题了,需要注意一下。计算unix时间网址:
https://tool.chinaz.com/Tools/unixtime.aspx
Key:设备的access_key,在设备的详情页中找到。
将这3个参数,对应填写到小程序里面,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发送。打开网络助手软件。
首先要先了解一下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,名称根据自己的来,对应上面的长度也要改)
0x00 -User Name Length低位
0x06 -User Name Length高位 (产品ID的长度:6)
....... -User Name (产品ID:378414,也是根据自己的写)
0x00 -Password Length低位
0x79 -Password Length高位 (Token的长度:121,也是根据自己的长度写)
....... -Password (Token的具体十六进制值填写,根据自己的Token填写)
到这里就报文就解析结束了,将上面的内容整理成十六进制的值,填写到网络助手中
之前遇到的一个问题,就是报文中的第3位的“0x01”,我填写的是0x00,但是有的Token就可以正常连接,有的Token却不可以正常连接。后来找到问题,Token有的很长,这一位就会变成0x01,应该是长度有进位吧,大家一定要注意。
TCP建立连接后,输入内容,点击发送,就可以看到有返回ACK的值是20 02 00 00,说明发送的内容正确,MQTT平台返回接入成功,之后再看看我们OneNet平台的设备,显示“在线”,接入成功!
之后我们还可以使用Wireshark软件,进行原始报文的验证,或者监控。打开软件,选择监控的网络通道。
在这里输入mqtt,进行网络报文过滤,这里只让其显示MQTT的报文。
之后我们在网络助手里发送刚才的内容,重新发一次,就可以看到Wireshark出现了MQTT的报文,分别是发送的和接收到的ACK。
大家根据TCP报文格式的MQTT报文,可以自己开发上位机去通信了。