IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 浅浅的 使用网络调试助手和Mosquitto 分析MQTT协议数据包内容 -> 正文阅读

[系统运维]浅浅的 使用网络调试助手和Mosquitto 分析MQTT协议数据包内容

参考:

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

img

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
img
09代表剩余的数据长度

————00 01

00 : 报文标识符MSB

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

img

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

img
在这里插入图片描述

五、发布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

img

————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 
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-09-24 21:30:38  更:2022-09-24 21:31:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/28 18:41:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计