mybatis-plus对datetime返回去掉.0_阿里云物联网平台使用心得(27)MQTT协议服务等级0的PUBLISH报文...

d64f7a5643e1224bad5da9d8c9479e95.png

题目

大家好,超子又和大家见面了,超子我能力有限,水平不高,有什么错误的地方,欢迎板砖。超子今天给大家介绍一下PUBLISH 服务等级0报文。

f439104c0b6db5be7adb40942ec1e15a.png

PUBLISH 报文

上图可知,PUBLISH报文是双向的SC,为了方便后文区分这两个方向,我们先简单的定义一下 。

发布:我们给阿里云发送数据的方向,也就是C->S 。

推送:阿里云给我们发送数据的方向,也就是S->C 。

PUBLISH报文用于双向的数据发送,使用哪种服务质量等级,需要在PUBLISH报文中的固定报头中设置,可以设置成等级0,等级1和等级2。至于服务质量等级的概念和区别,前面的文章已经讲过了,这里就不赘述了,如果记不清了,可以返回前面的文章看一下。

具体解析PUBLISH报文之前,先提一点需要注意的地方,当设置成不同的服务质量等级时,PUBLISH报文可变报头结构是不一样的,这个后面要多注意一下,我们以发布方向为例,推送方向同理。

等级0可变报头:需要发布数据的Topic字符串+2字节长度表示

等级1可变报头:需要发布数据的Topic字符串+2字节长度表示 + 2字节的报文标识符

等级2可变报头:需要发布数据的Topic字符串+2字节长度表示 + 2字节的报文标识符

区别就是等级1和2,比等级0的可变报头,多2字节报文标识符,这个地方要多注意一下。

b0f43b17897968406ca7815d0f2b6dee.png

PUBLISH报文固定报头

上图是PUBLISH报文固定报头结构,其中byte1中Bit4~7是固定的0011,所以需要关注的地方是Bit0~3。剩余长度待定,因为需要先确定可变报头和负载,所以以后再说 。

我们先看Bit0 的RETAIN保留标志,这个前面讲遗嘱消息保留功能时介绍过,这里再总结一下。

使用保留功能:服务器把数据推送给目前已经订阅的用户,然后还必须保留该数据,如果有新用户订阅Topic时,要把数据推送给新用户。

不用保留功能:服务器只会把数据推送给目前已经订阅的用户,然后就丢弃,如果后面有新用户订阅的话,就不管了。

阿里云不支持保留功能,所以Bit0是0 。

再看Bit1和2,QsS等级表示使用的服务质量等级

等级0:是00

等级1:是01

等级2:是10

我们目前讲解的是等级0的PUBLISH报文,所以Bit1和2是00

然后再看Bit3,DUP是重发标志,只有等级1和2才使用,因为等级1和等级2没有签收数据的话,需要重发,所以当重发的时候,需要把DUP设置成1,表示这条数据原来发过,但是没签收,这次是重发的。等级0不用,必须设置成0,到此我们等级0的byte1确定好了,是0x30。接下来看可变报头。

8186b31acf20d1bfc7cb98980681baba.png

可变报头需要用到的Topic

等级0的PUBLISH报文可变报头只有需要发布数据的Topic字符串以及2字节长度表示,没有报文标识符。上图是我的设备详情页面,红圈所示的Topic,是发布权限,用于上传数据,长度47字节,我们需要转成16进制,简化去掉0x后,结果如下:

2F 73 79 73 2F 61 31 32 64 54 49 72 6F 54 4A 43 2F 44 30 30 31 2F 74 68 69 6E 67 2F 65 76 65 6E 74 2F 70 72 6F 70 65 72 74 79 2F 70 6F 73 74

千万不要忘记前面加入2个字节,表示长度47,那么最终的16进制简化结果如下,长度共计49字节

00 2F 2F 73 79 73 2F 61 31 32 64 54 49 72 6F 54 4A 43 2F 44 30 30 31 2F 74 68 69 6E 67 2F 65 76 65 6E 74 2F 70 72 6F 70 65 72 74 79 2F 70 6F 73 74

接下来看等级0的PUBLISH报文的负载,负载包含的就是要发送的数据,我们以阿里云物联网平台为例进行介绍,但是不同的服务器,对数据格式的要求不同,设置不同,大家要举一反三。我们这次建立的产品和设备用于采集温湿度数据并上传,所以我们必须在产品中设置相关的温度和湿度属性功能,不然上传的数据,就找不到自己的家了。

d306d17b425d918c7f4f71d247ca48fe.png

产品详情页面准备添加标准功能

进入产品详情页面,选择功能定义->标准功能->编辑草稿

55c1dfbdf3fa82cac7ff3410480c14af.png

添加标准功能

然后选择标准功能->添加标准功能

54c323c1f33ce58edbad80fd5799ea74.png

添加湿度和温度功能

我们把左边的湿度和温度,挪到右边,表示选用该功能

632d30103a358434b11be4c3fae6cd1c.png

发布更新添加的标准功能

在上图中,我们看到了选择的温度和湿度功能属性,其中标识符和数据类型这两个非常关键,关系到PUBLISH报文负载中的数据格式,然后一定要注意点击下方的发布更新,一定要点,不然不会生效。

接下来我们看负载部分。假设湿度是33.3,温度是11.1,那么阿里云要求的数据格式如下:

{"params":{"CurrentHumidity":33.3,"CurrentTemperature":11.1}}

首先CurrentHumidity和CurrentTemperature就是标识符,和上图中的标识符一定要一致,这个要是写错了,温湿度数据传不上去,所以必须保证正确。33.3和11.1对应数据类型double,这个不像标识符那么严格,但是我们最好还是匹配上,比如湿度是33的话,我们最好也写成33.0 。然后我们把数据转换成16进制,简化去掉0x,结果如下:

7B 22 70 61 72 61 6D 73 22 3A 7B 22 43 75 72 72 65 6E 74 48 75 6D 69 64 69 74 79 22 3A 33 33 2E 33 2C 22 43 75 72 72 65 6E 74 54 65 6D 70 65 72 61 74 75 72 65 22 3A 31 31 2E 31 7D 7D

这里一定要注意,负载数据前,注意一下,不用加2个字节表示长度,所以负载的长度,就是数据字符串自己的长度,等于61。

剩余长度=可变+负载=49+61=110。110/128=0,无需进位,剩余长度1个字节搞定,就是0x6E。最终PUBLISH报文固定+可变+负载,简化16进制,去掉0x,结果如下 :

30 6E 00 2F 2F 73 79 73 2F 61 31 32 64 54 49 72 6F 54 4A 43 2F 44 30 30 31 2F 74 68 69 6E 67 2F 65 76 65 6E 74 2F 70 72 6F 70 65 72 74 79 2F 70 6F 73 747B 22 70 61 72 61 6D 73 22 3A 7B 22 43 75 72 72 65 6E 74 48 75 6D 69 64 69 74 79 22 3A 33 33 2E 33 2C 22 43 75 72 72 65 6E 74 54 65 6D 70 65 72 61 74 75 72 65 22 3A 31 31 2E 31 7D 7D

接下来,超子用网络调试助手,实测一下上面的报文,看看能不能正确的上传温湿度数据。当然我们要先建立TCP,然后发送CONNECT报文,之后再发上面等级0的PUBLISH报文。

05b2fa512bc0f7648381caae87069ec1.png

实际测试等级0的PUBLISH报文

服务质量等级0发送数据,服务器是不需要确认签收的,所以阿里云不会回复我们任何数据,所以不要以为是我们发送错误或是其他的问题,这里提醒一下大家。

1bedc977cb1f5a4235413df70e033b1e.png

查看数据上传情况

看上图,我们进入到设备详情页面,找到运行状态,可以看到湿度是33.3,温度是11.1,说明我们的数据上传正确了。等级0的PUBLISH报文超子就给大家介绍到这里了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值