OneNet物联网平台,使用MQTT协议,向产品内设备数据流,上传数据


发布时间:2021-11-08 01:43


大家好,超子又和大家见面了,超子我能力有限,技术不高,有什么错误的地方,欢迎板砖。[OneNet物联网平台,使用MQTT协议,向产品内设备数据流,上传数据]。今天我们测试一下中国移动OneNet物联网平台上传数据的功能,也就是构建一下发布数据的PUBLISH报文。超子在前面介绍阿里云使用心得的文章中,详细介绍了报文的构成,这里就不赘述了,我们直接操作。

当我们想上传数据到服务器的时候,我们需要给数据找一个家。对于OneNet物联网平台而言,这个数据的家就是数据流, 如果没有建立数据流,数据就没法上传。

我们首先进入开发者中心,然后进入我们的产品管理界面,点击左侧导航栏中的数据流模板。

然后在新打开的数据流模板页面的右上角地方,找到添加数据流模板按键,点击按键。

我们需要设置数据流的名称,先给温度数据建立一个家,名称填写temp,这个名字大家可以起自己喜欢的。单位和符号填不填无所谓。然后注意看页面下方,有个添加按键,点一下就行。

然后我们再给湿度数据建立一个数据流,数据流名称是humi,页面下方,点击添加即可 。

成功添加以上两个数据流后,我们可以在数据流列表中看到刚刚建立的两个数据流,也就是温度temp和湿度humi。数据流的名称是构建数据的关键信息,假设我们需要上传的温度数据是22.2,湿度数据是33.3,那么数据格式如下所示:

{"temp":22.2,"humi":33.3}

注意里面的temp和humi对应数据流的名称,一定不能写错了,写错了数据就找不到家了。我们换成16进制,简化书写,去掉0x的结果如下:

7B 22 74 65 6D 70 22 3A 32 32 2E 32 2C 22 68 75 6D 69 22 3A 33 33 2E 33 7D

我们要构建的是等级0的PUBLISH报文,方向是C->S,也就是发布数据到服务器, 首先固定报头是0x30 ??,??是剩余长度,负载已经构建好了,等我们确定了可变报头之后,再计算剩余长度。可变报头是发布数据用的Topic,我们上传数据时,需要使用的Topic是$dp,很简单,就3个字节,换成16进制,简化书写去掉0x的结果如下:

24 64 70

然后不要忘了再加上2个字节表示长度3,所以可变报头最终结果如下,总共5个字节:

00 03 24 64 70

我们再看一下刚刚构建好的数据{"temp":22.2,"humi":33.3},长度总共是25个字节,OneNet对于上传的数据有自己的要求,就是数据前边必须多加3个字节,这个要求不是MQTT标准协议要求的,是OneNet自己的要求 。第一个字节固定是0x03,然后再加上两个字节,表示数据的长度,也就是表示25,16进制简化书写就是00 19,最终等级0的PUBLISH报文中的负载结果,16进制,简化书写如下,长度总计是28:

03 00 19 7B 22 74 65 6D 70 22 3A 32 32 2E 32 2C 22 68 75 6D 69 22 3A 33 33 2E 33 7D

可变报头和负载都确定好了,那么剩余长度=可变+负载=5+28=33,一个字节就行,16进制是0x21,那么固定报头就是0x30 0x21,然后我们把固定,可变和负载,3个部分连接起来,16进制,简化书写,去掉0x:

30 21 00 03 24 64 70 03 00 19 7B 22 74 65 6D 70 22 3A 32 32 2E 32 2C 22 68 75 6D 69 22 3A 33 33 2E 33 7D

到此整个往OneNet物联网平台服务器上传数据的,等级0的PUBLISH报文就构建好了。我们需要用网络调试助手软件,实际测试一下,一定要注意先发CONNECT报文之后,再发我们的PUBLISH报文,CONNECT报文在《中国移动OneNet物联网平台使用心得(2)MQTT协议CONNECT连接平台》这篇文章中构建好了,大家忘了的话,可以返回去看一下。

我们首先发送CONNECT报文,成功后,发送PUBLISH报文,因为是等级0,所以服务器不会有什么回复,我们需要到后台看一下,数据有没有上传到后台。

产品后台中,我们点击设备列表,可以看到设备在线了,然后点击红圈中的数据流,查看数据。

我们看到22.2和33.3已经上传到后台中相应的数据流上了,说明我们等级0的PUBLISH报文正确。