MQTT协议-发布消息(服务器向客户端发送)

发布消息报文组成:

在了解了发布信息的PUBLISH报文后,就可以分析出阿里云服务器向本地客户端发送的报文数据了

实验前需要在阿里云创建产品和设备,并创建简单的温度和湿度物模型:

1、用CONNECT报文连接阿里云

Java mqtt怎么传文件 mqtt 发送文件_数据

查看设备是否显示在线

Java mqtt怎么传文件 mqtt 发送文件_数据_02

2、订阅物模型主题

选择带有订阅权限的Topic类

Java mqtt怎么传文件 mqtt 发送文件_数据_03

将${deviceName}用自己的设备名称代替后,转为十六进制,计算出字节长度,在字节最后需要加上服务质量等级Qos,这里设置为00,不能忘记

Java mqtt怎么传文件 mqtt 发送文件_MQTT协议_04

加上固定报头和可变报头,组合成订阅主题报文

Java mqtt怎么传文件 mqtt 发送文件_Java mqtt怎么传文件_05

发送报文,收到阿里云应答,表示订阅成功

Java mqtt怎么传文件 mqtt 发送文件_客户端_06

3、阿里云物模型发送数据

阿里云平台里选择在线调试,然后设置温度和湿度值,最后点击设置,服务器便下发数据到客户端

Java mqtt怎么传文件 mqtt 发送文件_Java mqtt怎么传文件_07

在网络调试助手可以看到阿里云发送的报文,将报文复制到文本文档进行分析

Java mqtt怎么传文件 mqtt 发送文件_MQTT协议_08

4、分析报文

报文的首字节是30,符合发布消息报文的固定报头字节,后面一个字节是AB,最高位为1,因此还有一个字节01来表示剩余长度,低位在前,高位在后,可以计算出长度为171,所以可以得到固定报头为30 AB 01

Java mqtt怎么传文件 mqtt 发送文件_数据_09

可变报头的首两个字节表示报头的长度,所以00 34是表示长度的,0x34转为十进制为52,因此就从34后开始数52个字节作为可变报头

将这52个字节转为ASCII可得到阿里云物模型订阅权限的Topic类:/sys/i6deo513xT1/Device01/thing/service/property/set

与上面发送的订阅主题报文的一致,说明分析正确

Java mqtt怎么传文件 mqtt 发送文件_数据_10

剩下的字节就全部是有效载荷,该部分首两个字节不是代表长度的,是真实数据,将其全部转为ASCII码便可得到JSON格式的数据,可看到温度值为20,湿度值为66,与一开始在阿里云平台上设置的一样,说明服务器向客户端发送的数据正确。

Java mqtt怎么传文件 mqtt 发送文件_数据_11