发新帖本帖赏金 20.00元(功能说明)我要提问
返回列表
打印
[ARM入门]

ESP8266 网络调试助手 十六进制连接到阿里云

[复制链接]
1930|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 鸡蛋鸭蛋荷包蛋 于 2023-2-2 16:31 编辑

#申请原创#  #技术资源#  @21小跑堂
MQTT协议说明
MQTT是应用层协议,是建立在TCP通讯层协议之上的协议,所以使用MQTT之前必须建立TCP连接.
  • MQTT服务质量等级 ( 0  1  2 )
服务质量等级说白了就是确认次数,这个字段表示应用消息分发的服务质量等级保证.

一般的云服务器只支持服务质量等级0和1,等级2需要反复确认,消耗资源较多,所以大多数云服务器都不支持.
  • TCP和UDP的关系
TCP是建立在可靠连接的基础之上的,而UDP则是不可靠的,但是TCP相比UDP而言,消耗资源较多,所以根据使用情况确定.

  • MQTT报文类型( C代表服务器 S代表客户端)


1.CONNECT报文(连接报文 1)
CONNECT报文分为两部分,固定报头和可变报头,
  • 固定报头
固定报头有两个字节,报文类型和剩余长度.

转换成十六进制
BYTE1  报文类型   10
BYTE2  剩余长度    ??
  • 可变报头
可变报头共有四部分组成:协议名
协议名  协议级别   连接标志   保活时间
1.协议名前两个字节代表长度,后面部分则代表连接类型.


转换成十六进制 协议名  00 04(长度)  4D 51 54 54(MQTT)
2.协议级别
根据使用的MQTT的版本,协议级别为LEVEL4

转换成十六进制 协议级别 04(长度)
3.连接标志
BYTE7 用户名  1
BYTE6 密码    1
BYTE5、4、3、2  遗嘱功能
BYTE1  清除恢复对话  1清除 0不清除、继续接收未接收的数据内容
BYTE0  保留标志位,没用  0  
转换成十六进制 连接标志 C2
4.保活时间
防止占用云服务器资源,BYTE1、2  任意写 基本都是100S

转换成十六进制 保活时间 00 64
报文后面跟客户端ID 用户名和密码
以阿里云为例,查看MQTT连接文档

客户端ID:D001|securemode=3,signmethod=hmacmd5|
转化成16进制如下:44 30 30 31 7C 73 65 63 75 72 65 6D 6F 64 65 3D 33 2C 73 69 67 6E 6D 65 74 68 6F 64 3D 68 6D 61 63 6D 64 35 7C
需添加两字节长度标识符  最终为  00 25 44 30 30 31 7C 73 65 63 75 72 65 6D 6F 64 65 3D 33 2C 73 69 67 6E 6D 65 74 68 6F 64 3D 68 6D 61 63 6D 64 35 7C

用户名:D001&i5drb0tO5li

转换为16进制如下: 44 30 30 31 26 69 35 64 72 62 30 74 4F 35 6C 69
需添加两字节长度标识符  最终为 00 10 44 30 30 31 26 69 35 64 72 62 30 74 4F 35 6C 69

密码:clientId  D001  deviceName  D001  productKey  i5drb0tO5li
密码需用signmethod的加密方式,本次使用为hmacmd5,在百度直接搜加密解密就行,加密密码在阿里云产品管理中.

hmacmd5加密结果:6eaf5eab8f45bdec03ee40cb439ed719
转换为16进制如下:36 65 61 66 35 65 61 62 38 66 34 35 62 64 65 63 30 33 65 65 34 30 63 62 34 33 39 65 64 37 31 39
需添加两字节长度标识符  最终为 00 20 36 65 61 66 35 65 61 62 38 66 34 35 62 64 65 63 30 33 65 65 34 30 63 62 34 33 39 65 64 37 31 39

计算数据剩余长度(可变+负载) ??以后的数据  128进位1
最终为101 转换成十六进制  0x65
最终CONNECT报文为:
10 65 00 04 4D 51 54 54 04 C2 00 64  00 25 44 30 30 31 7C 73 65 63 75 72 65 6D 6F 64 65 3D 33 2C 73 69 67 6E 6D 65 74 68 6F 64 3D 68 6D 61 63 6D 64 35 7C  00 10 44 30 30 31 26 69 35 64 72 62 30 74 4F 35 6C 69  00 20 36 65 61 66 35 65 61 62 38 66 34 35 62 64 65 63 30 33 65 65 34 30 63 62 34 33 39 65 64 37 31 39
总结: CONNECT报文由 10(报文类型)+65(有效长度)+00 04 4D 51 54(协议名)+04(协议级别)+C2(连接标志)+00 64(保活时间)+客户端+用户名+密码构成

2.CONNACK报文(2) 服务器应答客户端报文
CONNACK报文返回值如下所示,根据返回值判断连接是否成功或查找错误类型

成功连接应返回20(报文类型 ) 02(剩余字节) 00 00(看文档)

3.PINGREQ(心跳保活 12)、PINGRSP(PING命令回复 13)、DISONNECT(断开连接 14)
  • PINGREQ(心跳保活 12)


根据文档可知,PINGREQ报文为 C0 00,字节1为报文类型(12) C0,字节2为剩余长度,不需要剩余长度,所以为00,主要作用就是保活连接.
  • PINGRSP(PING命令回复 13)
PINGRSP报文是PINGREQ保活报文的回复报文,由服务器向客户端发送的.配对使用

根据文档可知,PINGREQ报文为D0 00,字节1为报文类型(13) D0,字节2为剩余长度,没有剩余长度,所以为00,主要作用就是回复连接状态.
  • DISONNECT(断开连接 14)
DISONNECT报文是用来与服务器断开连接的命令.
根据文档可知,DISONNECT报文为E0 00,字节1为报文类型(14) E0,字节2为剩余长度,没有剩余长度,所以为00,主要作用就是与服务器断开连接状态.

8548563db1814306ea.png (157.03 KB )

8548563db1814306ea.png

使用特权

评论回复

打赏榜单

21小跑堂 打赏了 20.00 元 2023-02-03
理由:恭喜通过原创审核!期待您更多的原创作品~

评论
21小跑堂 2023-2-3 16:24 回复TA
MQTT为物联网较为常用的协议,作者总结的较多,但是文章太乱,一眼迷失,可读性较差,以后多加注意。 

相关帖子

来自 2楼
鸡蛋鸭蛋荷包蛋|  楼主 | 2023-2-2 14:31 | 只看该作者
本帖最后由 鸡蛋鸭蛋荷包蛋 于 2023-2-2 15:43 编辑

4.SUBSCRIBE(订阅请求 8)、SUBACK(订阅确认 9)
  • SUBSCRIBE(订阅请求 8)
根据文档可知,SUBSCRIBE控制报固定报头的第3,2,1,0位是保留位,必须设置位0,0,1,0.其他任何值都是不合法的并关闭网络连接.
SUBSCRIBE是类型8,所以转换为十六进制为82
固定报头后跟剩余长度 ??
如果需要添加标识符 则加在剩余长度之后,长度为两字节  00 01

有效载荷格式,阿里云有相关说明

以阿里云为例,有效载荷为/sys/i5drb0tO5li/${deviceName}/thing/service/property/set,deviceName我的是D001

转换为十六进制 00 30 2F 73 79 73 2F 69 35 64 72 62 30 74 4F 35 6C 69 2F 44 30 30 31 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
后跟服务等级 一般都是等级0  00
报文最终结果为 82 35 00 01 00 30 2F 73 79 73 2F 69 35 64 72 62 30 74 4F 35 6C 69 2F 44 30 30 31 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 00
总结:SUBSCRIBE构成为 82(固定报头)+00 01(可变标识符)+有效载荷(属性设置)+00(服务等级)
  • SUBACK(订阅确认 9)
固定报头 转换为十六进制 90
剩余长度  包含可变报头长度+有效载荷长度  可变有两个字节(有标识符为2 无标识符为0)+有效载荷 一个字节

标识符为00 01的情况下 订阅成功后返回 90 03 00 01 01
有效载荷含义如下

总结::SUBACK报文为 90(固定报头)+00 01(可变标识符)+有效载荷(成功失败)


5.UNSUBSCRIBE(取消报文订阅 10) UNSUBACK(取消报文订阅确认 11)
  • UNSUBSCRIBE  (取消报文订阅 10)
UNSUBSCRIBE  固定报头格式如下 转换成十六进制 A2
剩余长度 ??
可变报头 标识符+有效载荷
标识符设置为 00 02(随意)
有效载荷为阿里云的属性设置(订阅报文有效载荷,该报文是取消)

/sys/i5drb0tO5li/${deviceName}/thing/service/property/set,deviceName
转换为十六进制 00 30 2F 73 79 73 2F 69 35 64 72 62 30 74 4F 35 6C 69 2F 44 30 30 31 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
报文最终结果为:A2 34 00 02 00 30 2F 73 79 73 2F 69 35 64 72 62 30 74 4F 35 6C 69 2F 44 30 30 31 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
总结:UNSUBSCRIBE报文为 A2(固定报头)+34(剩余长度)+00 02(标识符)+(有效载荷)
SUBSCRIBE报文和UNSUBSCRIBE报文的主要区别在于固定报头和结尾是否有响应等级.

  • UNSUBACK(取消报文订阅确认 11)
UNSUBACK报文固定报头 转换为十六进制为E0

剩余长度为固定 02
可变报头为UNSUBSCRIBE  (取消报文订阅 10)的报文标识符,本次为 00 02.

报文最终返回结果为: B0 02 00 02
总结:UNSUBACK报文为 B0(固定报头)+02(剩余长度)+00 02(标识符)

6.PUBLISH(发布消息)
  • PUBLISH(等级0)
固定报头 等级0的二进制表示应为 0011 0000 转换为十六进制为 30
DUP是保留标志位,一般服务器都不支持,对服务器资源消耗较大.
剩余长度 ?? 七字节代表字符长度 第一字节代表是否进位

可变报头
可变报头分为主题名 报文标识符和有效载荷
主题名是用SUBSCRIBE(订阅请求 8)订阅的报文主题,为/sys/i5drb0tO5li/${deviceName}/thing/service/property/set,deviceName
转换为十六进制,是00 30 2F 73 79 73 2F 69 35 64 72 62 30 74 4F 35 6C 69 2F 44 30 30 31 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
因为是等级0的PUBLISH报文,所以没有报文标识符.

有效载荷
根据阿里云下发的数据,反推上传数据格式应为{"method":"thing.event.property.post","id":"0001","params":{"PowerSwitch":1},"version":"1.0.0"}
"method":"thing.event.property.post"  代表含义 主题
"id":"0001"  代表含义 编号,类似于标识符,可以回查云端数据
"params":{"PowerSwitch":1}  代表含义 发送参数
"version":"1.0.0" 代表含义 协议版本号
转换为十六进制,结果应为  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 30 30 30 31 22 2C 22 70 61 72 61 6D 73 22 3A 7B 22 50 6F 77 65 72 53 77 69 74 63 68 22 3A 31 7D 2C 22 76 65 72 73 69 6F 6E 22 3A 22 31 2E 30 2E 30 22 7D
PUBLISH(等级0)报文最终结果为: 30 90 01 00 2F 2F 73 79 73 2F 69 35 64 72 62 30 74 4F 35 6C 69 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 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 30 30 30 31 22 2C 22 70 61 72 61 6D 73 22 3A 7B 22 50 6F 77 65 72 53 77 69 74 63 68 22 3A 31 7D 2C 22 76 65 72 73 69 6F 6E 22 3A 22 31 2E 30 2E 30 22 7D
总结:PUBLISH(等级0)为 30(固定报头)+90 01(剩余长度)+(主题名)+(报文标识符 0等级没有)+(有效载荷)

  • PUBLISH(等级1)
固定报头 等级1的二进制表示应为 0011 0010 转换为十六进制为 32

剩余长度 ??
可变报头
可变报头和等级0一样,为/sys/i5drb0tO5li/${deviceName}/thing/service/property/set,deviceName
转换为十六进制,是00 30 2F 73 79 73 2F 69 35 64 72 62 30 74 4F 35 6C 69 2F 44 30 30 31 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

报文标识符
00 03(标识符)
有效载荷
{"method":"thing.event.property.post","id":"0001","params":{"PowerSwitch":0},"version":"1.0.0"}
转换为十六进制 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 30 30 30 31 22 2C 22 70 61 72 61 6D 73 22 3A 7B 22 50 6F 77 65 72 53 77 69 74 63 68 22 3A 30 7D 2C 22 76 65 72 73 69 6F 6E 22 3A 22 31 2E 30 2E 30 22 7D

PUBLISH(等级1)报文最终结果为:32 90 01 00 2F 2F 73 79 73 2F 69 35 64 72 62 30 74 4F 35 6C 69 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 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 30 30 30 31 22 2C 22 70 61 72 61 6D 73 22 3A 7B 22 50 6F 77 65 72 53 77 69 74 63 68 22 3A 31 7D 2C 22 76 65 72 73 69 6F 6E 22 3A 22 31 2E 30 2E 30 22 7D总结:PUBLISH(等级1)为 32(固定报头)+90 01(剩余长度)+(主题名)+(报文标识符)+(有效载荷)
等级0和等级1的区别主要在于固定报头和是否有报文标识符.

7.PUBACK(发布确认 4)
PUBACK(发布确认 4)报文为返回报文,使用报文后由服务器向客户端返回的报文.
固定报头 转换为十六进制为 40
剩余长度 固定为2 02
可变报头
可变报头为PUBLISH(等级1)报文中的报文标识符  
PUBACK(发布确认 4)报文最终返回结果为: 40 02 00 03

总结:PUBACK(发布确认 4)为40(固定报头)+02(剩余长度)+00 03(报文标识符)

因大多数云服务器不支持等级2的PUBLISH报文,所以就不描述了.
到此,MQTT的全部报文已经逐一分析,还不会的宝子们跳转到视频讲解链接https://www.bilibili.com/video/BV1P54y1v7gw?p=21&spm_id_from=pageDriver&vd_source=7feef52496503bdc2bf112b16384250d

使用特权

评论回复
来自 3楼
鸡蛋鸭蛋荷包蛋|  楼主 | 2023-2-2 15:54 | 只看该作者
使用网络连接助手 十六进制代码 连接到阿里云物联网平台
1.使用CONNECT连接报文,和阿里云建立连接.
2.发布SUBSCRIBE订阅报文,订阅相关主题.
3.使用PUBLISH发布报文,向阿里云发送消息.



注意事项:
1.协议类型为TCP-Client(客户端),而不是TCP-Server(服务器)


2.有两种连接方式,域名连接和IP地址连接,我都汇总了一下.
阿里云域名:
${YourProductKey}.iot-as-mqtt.${YourRegionId}.aliyuncs.com:1883
i5drb0tO5li.iot-as-mqtt.cn-shanghai.aliyuncs.com:1883
阿里云IP地址和端口号:
IP地址 139.196.135.135  端口号 1883 公用
祝各位宝子顺利连接


Desktop.zip

1.32 MB

使用特权

评论回复
地板
329547875| | 2023-2-3 10:48 | 只看该作者
对于学习MQTT有很大的帮助

使用特权

评论回复
评论
鸡蛋鸭蛋荷包蛋 2023-2-3 12:43 回复TA
能用到就好 写帖子写了好久 写代码的话也可以用到 
5
yijiawl| | 2023-2-11 18:55 | 只看该作者

使用特权

评论回复
6
大秦正声| | 2023-2-12 11:06 | 只看该作者
谢谢。楼主有没有使用4g模块,比如ec200。

使用特权

评论回复
评论
鸡蛋鸭蛋荷包蛋 2023-2-13 09:56 回复TA
我主要是单片机行业的,4G模块暂未涉及哦,不好意思 
7
大秦正声| | 2023-2-13 18:53 | 只看该作者
模块都是别人现成的,4g模块通过串口来转发数据,中间还有云服务器。
原理是这样,但具体实现就不清楚。

使用特权

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

本版积分规则

12

主题

85

帖子

1

粉丝