发新帖本帖赏金 100.00元(功能说明)我要提问
返回列表
打印

OneNet平台新版MQTTS协议-网络调试助手-TCP方式连接实践

[复制链接]
30985|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 小叶三千 于 2021-7-5 16:51 编辑

#申请原创# @21小跑堂
    由于项目上用到了中移云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。

  

    双击点击报文还可以具体分析报文的结构和内容。

   

    附件附上计算Token的小工具,大家也可以根据官方的文档的自己计算。
    大家根据TCP报文格式的MQTT报文,可以自己开发上位机去通信了。








token.part1.rar

9 MB

token.part2.rar

1.84 MB

使用特权

评论回复

打赏榜单

21小跑堂 打赏了 100.00 元 2021-07-06
理由:恭喜获得原创奖!请多多加油哦!

相关帖子

沙发
lsm12502| | 2021-7-9 08:56 | 只看该作者
受教了,感谢分享哈!

使用特权

评论回复
板凳
role_2099| | 2021-7-23 15:30 | 只看该作者
谢谢分享,很详细

使用特权

评论回复
地板
yangjiaxu| | 2021-7-24 13:00 | 只看该作者
onenet好用 非常不错的云平台

使用特权

评论回复
5
Emily999| | 2021-7-24 13:01 | 只看该作者
挺不错的经验,支持你

使用特权

评论回复
发新帖 本帖赏金 100.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:清智科技嵌入式工程师
简介:单片机嵌入式底层开发,汽车电子

48

主题

513

帖子

18

粉丝