我是靠谱客的博主 忧伤西装,最近开发中收集的这篇文章主要介绍MQTT通讯协议分析(一): connect连接数据包,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

前言:

      继上篇MQTT测试环境搭建后,接下来趁热打铁来分析MQTT通讯协议数据包,来加深对MQTT理解,因个人技术有限,若以下分析有误,望留言纠正,谢谢。

     环境:  MQTT服务器(Mosquitto,ubuntu)  +  MQTT客户端(paho, windows)   +   wireshark(抓包工具)

    参考文献: MQTT-3.1.1-CN

    特别说明: 测试用的MQTT服务器和客户端为3.1.1版本

 

一. connect数据包分析

     1.wireshark设置捕获

        tcp  and  port  1883   , 如下

     2. connect数据包抓取

       1) 首选确保在ubuntu中的MQTT服务器已经运行, 命令行中输入: sudo service mosquitto status

      2)打开paho MQTT客户端,设置好连接参数,点击"连接"

      3)成功抓到connect数据包

 OK, 注意上面用红色框选出来的数据, 就是我们的connect数据包。

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

26:剩余长度,计算方式 len = 2*16 + 6 = 38,  大家可以数下从 00 04 ....72  64  是不是有38个字节哦(完全对的上哦)

继续,根据MQTTv3.1.1规范中,可变消息头的协议名称的关键字是"MQTT",如下

因此 connect数据 包中:  00   04   4d   51   54   54     04  对应为:

   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

     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         :   保留。

     对比下我们的设置(0xc2), 如下图: (完全符合哦)

      继续,

      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

二. connect ack数据包分析

       1. 抓取connect ack

分析:

      20   :  表示connect ack消息类型

      02   :  剩余长度

      00   :  bit7~bit1 保留位0, bit0 表示当前会话 ,当前为0(因为我们的connect连接包设置clean seesion 为1)

      00   : 连接已被服务器接收, 代表连接成功 

      至此, 以上是MQTT 的connect连接及connect ack数据包分析, 至于各个字段的含义细节,可查阅MQTT-3.1.1-CN等相关资料了解

 

     

 

 

 

最后

以上就是忧伤西装为你收集整理的MQTT通讯协议分析(一): connect连接数据包的全部内容,希望文章能够帮你解决MQTT通讯协议分析(一): connect连接数据包所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部