151-5197-5087
扬州华为授权服务中心
当前位置:网站首页 > 网络设备调试 正文 网络设备调试

浅浅的 使用网络调试助手和Mosquitto 分析MQTT协议数据包内容

2024-12-05 22:00:56 网络设备调试 23 ℃ 0 评论

使用网络调试助手和Mosquitto 分析MQTT协议数据包内容

  • 参考:
  • 零、涉及到的主要的数据包:
  • 一、环境搭建
  • 二、connect数据包
    • 根据数据包的内容逐个字节进行分析:
  • 三、心跳包
  • 四、订阅Subscribe
  • 五、发布Publish

参考:

MQTT通讯协议分析(一): connect连接数据包_Aston_黄的博客-CSDN博客_mqtt查看连接数

MQTT Version 3.1.1 (runoob.com)

https://www.runoob.com/manual/mqtt/protocol/MQTT-3.1.1-CN.html#pf22

MQTT 入门介绍 | 菜鸟教程 (runoob.com)

零、涉及到的主要的数据包:

1、连接:
一开始设备需要连接到mqtt服务器,连接时的数据包内需要携带对应的设备ID,以及用户名和密码。这使用默认的用户名和密码。设备ID每一个设备都需要设置为不同的,两个相同的ID只能允许一台设备在线,另一个相同的ID的设备会被挤掉线。用户名密码使用的是Mosquitto 默认的用户名字和密码。“admin” “password”

第一个订阅的设备ID:123456789 用户信息:“admin” “password”
10 26 00 04 4D 51 54 54 04 C2 00 3C 00 09 31 32 33 34 35 36 37 38 39 00 05 61 64 6D 69 6E 00 08 70 61 73 73 77 6F 72 64

第二个发布的设备ID:223456789 用户信息:“admin” “password”
10 26 00 04 4D 51 54 54 04 C2 00 3C 00 09 32 32 33 34 35 36 37 38 39 00 05 61 64 6D 69 6E 00 08 70 61 73 73 77 6F 72 64

2、订阅:
设备连接到服务器上面就可以订阅消息了,订阅消息的时候只需要携带具体的订阅消息的名称即可,这里使用的名称为test。

82 09 00 01 00 04 74 65 73 74 00

3、发布:
设备连接到服务器后,需要发布具体的消息内容,同时还要携带具体的服务名称。

31 15 00 06 74 65 73 74 2F 61 68 65 6C 6C 6F 5F 65 73 70 38 32 36 36

31 13 00 04 74 65 73 74 68 65 6C 6C 6F 5F 65 73 70 38 32 36 36

4、心跳:
心跳包需要根据连接状态内由设备规定好的心跳时间之内进行消息的发送。如果不发送则认为不在线了。
20 02 00 00

一、环境搭建

1、MQTT server
使用Mosquitto,服务器使用了一个树莓派,安装方式参考:
MQTT通信协议(mosquitto)在Linux上的环境构建与测试

2、windows下面安装了一个网络调试助手:

下载地址:http://free.cmsoft.cn/download/cmsoft/assistant/netassist5.0.3.zip

二、connect数据包

打开网络调试助手,输入mqtt所在的服务器ip地址,端口号1883,连接后就可以看到Mosquitto的打印信息:

1663578361: New connection from 192.168.0.114 on port 1883.
1663578363: New client connected from 192.168.0.114 as 123456789 (c1, k60, u’admin’).
1663578363: No will message specified.

这里表示已经有一台设备连接到了socket,然后通过下面的数据包和mqtt服务器建立链接。

10 26 00 04 4D 51 54 54 04 C2 00 3C 00 09 31 32 33 34 35 36 37 38 39 00 05 61 64 6D 69 6E 00 08 70 61 73 73 77 6F 72 64

根据数据包的内容逐个字节进行分析:

————10

表示是 connect连接数据包, 如后续断开连接disconnect为 0x20

————26

剩余长度,计算方式 len = 2*16 + 6 = 38 38对应16禁止的26

————00 04 4d 51 54 54 04

connect数据对应为:
00 04 : 协议名称长度(“MQTT”, 如是v3.1,则协议"MQIsdp",则为00 06)
4d 51 54 54 : M Q T T
04 : 协议版本(03表示v3.1, 04表示v3.1.1)

————c2

连接状态,C2对应的二进制为:1100 0010

User Name Flag :使用用户名登陆
Password Flag : 用户密码
Will Retain : 主要用户PUBLISH(发布,后续分析再讲)的消息,表示服务器要保留这次推送信息, 如果有新的订阅者出现,就把这消息推送给它,这里我们关闭该选型
Wil QoS :主要用于PUBLISH(发布态)消息的,保证消息传递的次数。

  • 00表示最多一次 即<=1
  • 01表示至少一次 即>=1
  • 10表示一次,即==1
  • 11保留后用

Will Flag : 遗嘱,表示如果连接请求被接收, 遗嘱消息(Will Message)必须被存储再服务端,之后网络连接关闭时,服务器必须发布这个遗嘱消息。 除非服务器端收到disconnect报文时删除了这个遗嘱消息,遗嘱消息发布条件, 包括但不限于:

  • 服务端检测到一个I/O错误或者网络故障

  • 客户端再保持连接(Keep Alive)的时间内未能通讯

  • 客户端没有先发送DISCONNECT报文直接关闭了网络连接

  • 由于协议错误服务端关闭了网络连接

CleanSession : 清除会话,客户端和服务端必须丢弃之前的任何会话并开始一个新的会话。 会话仅持续和网络连接同样长的时间。 与这个会话关联的状态数据不能被任何之后的会话重用。

Reserved : 保留。

————00 3c

: 表示KeepAlive 保持心跳间隔, time = 3*16 + 12 = 60(秒), 与上图 保持连接 60秒 吻合
————00 09
表示clientID客户端ID 长度, len = 9

————31 32 33 34 35 36 37 38 39
就是 clientID客户端ID, 长度刚好为9

————00 05
表示用户名长度, len = 5

————61 64 6d 69 6e
用户名,ascii表示 -> “admin”(默认设置), 长度刚好为5

————00 08
表示密码长度, len = 8

————70 61 73 73 73 77 6f 72 64
密码, ascii 表示-> “password”(默认设置), 长度刚好为8

三、心跳包

心跳包的数据内容为:

20 02 00 00

四、订阅Subscribe

订阅test的消息的具体报文如下,

82 09 00 01 00 04 74 65 73 74 00

根据上面的数据包内容解析:
前两个包头代表了报文的类型,后面一个字节代表了报文的数据长度:
————82 09
82为固定包头,转正二进制为 1000 0001

09代表剩余的数据长度

————00 01

00 : 报文标识符MSB

01 : 报文标识符LSB, (报文标识符由16位组成, 因此这里我们报文标识符位1)

00 04 74 65 73 74 00

00 : 之后主题过滤器(Topic Filter)长度MSB

04 : 主题过滤器(Topic Filter)长度 LSB ,与我们设置的"test"长度 符号

74 65 73 74 : 对应的就是主题过滤器"test"

00 : QoS = 0, 若设置的是“至少一次”, 则为01, 若设置"刚好一次",则为02


五、发布Publish

订阅一个test通知的具体数据内容:

31 15 00 06 74 65 73 74 2F 61 68 65 6C 6C 6F 5F 65 73 70 38 32 36 36

这里原因不明,由于订阅的服务名称是test,但是协议要求在后面添加字符’\a’,添加后变成test\a和原来的test名称不符,订阅端就会接收不到消息,所以将\a去掉改为:

31 13 00 04 74 65 73 74 68 65 6C 6C 6F 5F 65 73 70 38 32 36 36

根据上面的数据包内容进行解析:
————31 15
数据包的头代表了这条协议的作用和数据长度信息:
31 :bit0: Retain = 1, 与我们设置的"已保留"一致
15 : 剩余长度, len = 1*16 + 5 = 21

————00 06

00 :Topic name 长度MSB

06 :Topic name 长度LSB ,因此 len = 6,与我们设置的"test/a" 长度吻合

————订阅名 74 65 73 74 2f 61

74 65 73 74 2f 61 : 对应的就是Topic name -> “test/a”

————消息内容 68 65 6c 6c 6f 5f 65 73 70 38 32 36 36

68 65 6c 6c 6f 5f 65 73 70 38 32 36 36 : 对应的就是消息内容 -> “hello_esp8266”


这是可以在网络调试助手上面接收到刚刚发布订阅的消息内容,接收到的具体消息内容如下:

30 13 00 04 74 65 73 74 68 65 6C 6C 6F 5F 65 73 70 38 32 36 36 

版权说明:如非注明,本站文章均为 扬州驻场服务-网络设备调试-监控维修-南京泽同信息科技有限公司 原创,转载请注明出处和附带本文链接

请在这里放置你的在线分享代码
«    2024年12月    »
1
2345678
9101112131415
16171819202122
23242526272829
3031
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
    文章归档
    网站收藏
    友情链接