• 浅浅的 使用网络调试助手和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
    
    • 1

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

    ————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
    
    • 1

    在这里插入图片描述

    四、订阅Subscribe

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

    82 09 00 01 00 04 74 65 73 74 00
    
    • 1

    根据上面的数据包内容解析:
    前两个包头代表了报文的类型,后面一个字节代表了报文的数据长度:
    ————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
    
    • 1

    这里原因不明,由于订阅的服务名称是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
    
    • 1

    根据上面的数据包内容进行解析:
    ————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 
    
    • 1
  • 相关阅读:
    Appium自动化环境搭建保姆级教程
    如何为你的Python程序配置HTTP/HTTPS爬虫IP
    es6 语法,在个别浏览器中不兼容的处理办法
    js-WebApi笔记之BOM
    【JDK 8 -收集和统计】7.1 collector 收集器
    编程语言理解3-目前主流的编程语言有哪些,分别的应用场景是什么
    企业全面管理解决方案:基于Java技术的ERP管理系统源码
    WebAssembly入门笔记[4]:利用Global传递全局变量
    Linux常用文件权限命令详解
    比亚迪高端化火急提速
  • 原文地址:https://blog.csdn.net/qq_44179528/article/details/126937277