我是靠谱客的博主 难过蜜蜂,最近开发中收集的这篇文章主要介绍MQTT协议学习笔记(十)MQTT协议学习笔记(十),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

  • MQTT协议学习笔记(十)
    • PUBLISH报文解析
      • PUBLISH 接受服务器数据
        • 固定报头解析
        • 可变报头解析
        • 有效载荷解析
      • PUBLISH发送消息给服务器
        • 发送-固定报头
        • 发送-可变报头
        • 发送-有效载荷

MQTT协议学习笔记(十)

PUBLISH报文解析

PUBLISH 接受服务器数据

首先阿里云进入在线调试,看它会给我们下发什么玩意儿,
在这里插入图片描述

在这里插入图片描述
发送 工作状态,下面是接受的数据
30 98 01 00 31 2F 73 79 73 2F 61 31 37 75 76 78 62 33 45 79 62 2F 6C 6F 74 5F 54 2F 74 68
69 6E 67 2F 73 65 72 76 69 63 65 2F 70 72 6F 70 65 72 74 79 2F 73 65 74 7B 22 6D 65 74 68
6F 64 22 3A 22 74 68 69 6E 67 2E 73 65 72 76 69 63 65 2E 70 72 6F 70 65 72 74 79 2E 73 65
74 22 2C 22 69 64 22 3A 22 39 30 32 32 30 38 37 30 34 22 2C 22 70 61 72 61 6D 73 22 3A 7B
22 4C 69 67 68 74 53 74 61 74 75 73 22 3A 30 7D 2C 22 76 65 72 73 69 6F 6E 22 3A 22 31 2E
30 2E 30 22 7D

固定报头解析

解析接收的数据
30 = 0011 0000
高四位等于3 ,所以此属于PUBLISH类型报文,看一下它的固定报头
在这里插入图片描述
DUP 重发标志位,(只有在消息等级大于0,才会有,等级为0,没有重发)
Q0S_H - QOS_L 消息等级
retain 保留,因为有clean ssesion 所以也等于0
剩余长度
98 = 1001 1000 表数据长度最高位为1,那么剩余长度大于一个字节看下一个字节为0000 0001,最高位为0 ,可知剩余长度 由98 01两个字节表示,转化为10进制数, (0X98 - 0X80)+(0X80 * 0X01) = 152(十进制)

由上可知,此报文是PUBLISH报文,固定报头 = 30 98 01
无重发,消息等级为0,无保留
剩余长度为152

可变报头解析

可变报头按顺序包含主题名和报文标识符
主题名 Topic Name
主题名(Topic Name)用于识别有效载荷数据应该被发布到哪一个信息通道。
主题名必须是PUBLISH报文可变报头的第一个字段。
PUBLISH报文中的主题名不能包含通配符 。
服务端发送给订阅客户端的PUBLISH报文的主题名必须匹配该订阅的主题过滤器。
报文标识符 Packet Identifier
只有当QoS等级是1或2时,报文标识符(Packet Identifier)字段才能出现在PUBLISH报文中
此处消息等级为0,无报文标识符
在这里插入图片描述

接着看数据中的第4,5个字节 = 0X0031 = 49(D) 表示主题名的数据长度,把这49个字节拿出来
主题名 = 2F 73 79 73 2F 61 31 37 75 76 78 62 33 45 79 62 2F 6C 6F 74 5F 54 2F 74 68
69 6E 67 2F 73 65 72 76 69 63 65 2F 70 72 6F 70 65 72 74 79 2F 73 65 74
在将这串数据由16进制转换为ASCII码数据 = /sys/a17uvxb3Eyb/lot_T/thing/service/property/set
在阿里云的设备查看topic列表中可以看到

有效载荷解析

7B 22 6D 65 74 68 6F 64 22 3A 22 74 68 69 6E 67 2E 73 65 72 76 69 63 65 2E 70 72 6F 70 65 72 74 79 2E 73 65 74 22 2C 22 69 64 22 3A 22 39 30 32 32 30 38 37 30 34 22 2C 22 70 61 72 61 6D 73 22 3A 7B 22 4C 69 67 68 74 53 74 61 74 75 73 22 3A 30 7D 2C 22 76 65 72 73 69 6F 6E 22 3A 22 31 2E 30 2E 30 22 7D
= {“method”:“thing.service.property.set”,“id”:“902208704”,“params”:{“LightStatus”:0},“version”:“1.0.0”}

method : 方法,在产品下的物理模型下可查看
ID是云消息ID,长度可与Publish一致,值可随意规定
params “LightStatus”:0,是灯光状态,值为 0
version":"1.0.0 版本号

PUBLISH发送消息给服务器

发送-固定报头

发送固定报头byte1与接受保持一致(可不一致,可以更改消息质量等)
剩余长度待定
发布 等级0 剩余字节长度计算为 150 = 0X96

发送-可变报头

可变报头 = 主题名和报文标识符 (只有当QoS等级是1或2时,报文标识符(Packet Identifier)字段才能出现在PUBLISH报文中)此处消息等级为0,无报文标识符
发送topic = /sys/a17uvxb3Eyb/lot_T/thing/event/property/post (可在设备中查看)
(16进制格式 Topic)
2F 73 79 73 2F 61 31 37 75 76 78 62 33 45 79 62 2F 6C 6F 74 5F 54 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
Topic总共48个字节,两个字节表示 = 0X0030

发送-有效载荷

method:方法
id: 可更改
params:参数,“LightStatus”:1,(工作状态,值为1),想发其他的只需要将参数更改就好,并且可叠加
version:版本号

{“method”:“thing.event.property.post”,“id”:“902208704”,“params”:{“LightStatus”:1},“version”:“1.0.0”}
(16进制格式)
7B 22 6D 65 74 68 6F 64 22 3A 22 74 68 69 6E 67 2E 65 76 65 6E 74 2E 70 72 6F 70 65 72 74 79 2E 70 6F 73 74 22 2C 22 69 64 22 3A 22 39 30 32 32 30 38 37 30 34 22 2C 22 70 61 72 61 6D 73 22 3A 7B 22 4C 69 67 68 74 53 74 61 74 75 73 22 3A 31 7D 2C 22 76 65 72 73 69 6F 6E 22 3A 22 31 2E 30 2E 30 22 7D
综上得到发送的数据为下:
30 96 01 00 30 2F 73 79 73 2F 61 31 37 75 76 78 62 33 45 79 62 2F 6C 6F 74 5F 54 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 7B 22 6D 65 74 68 6F 64 22 3A 22 74 68 69 6E 67 2E 65 76 65 6E 74 2E 70 72 6F 70 65 72 74 79 2E 70 6F 73 74 22 2C 22 69 64 22 3A 22 39 30 32 32 30 38 37 30 34 22 2C 22 70 61 72 61 6D 73 22 3A 7B 22 4C 69 67 68 74 53 74 61 74 75 73 22 3A 31 7D 2C 22 76 65 72 73 69 6F 6E 22 3A 22 31 2E 30 2E 30 22 7D

最后

以上就是难过蜜蜂为你收集整理的MQTT协议学习笔记(十)MQTT协议学习笔记(十)的全部内容,希望文章能够帮你解决MQTT协议学习笔记(十)MQTT协议学习笔记(十)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部