MQTT 协议学习:001-搭建MQTT通信环境,并抓包测试

--- title: protocol-app-mqtt-1-setup-mqtt-debug-env date: 2020-02-03 11:22:51 categories: tags: - mqtt - protocol - env ---

背景

目的:了解MQTT 通信的有关概念与流程;方便推算某些数据与文档描述是否一致。

为了能够在保证学习质量的前提下,降低配置环境的门槛,我们将服务器搭建在windwos中,实行内网间的MQTT协议访问。

搭建Linux平台下的 MQTT 环境可以参考:《arm linux 移植 MQTT》 、或者根据mosquitto的readme文档,这一讲主要是为了快速入门。

HOST: Windows10-x64
MQTT: mosquitto v1.6.8-x64(mosquitto 官网下载比较慢,点击这里进行下载)

mosquitto 自带了MQTT服务器与MQTT客户端的命令行工具,对于习惯了在Linux命令行下工作学习的我来说,使用起来非常方便😀。

网络分析工具 :WireShark v3.2.1-x64

搭建MQTT 服务

下载mosquitto_v1.6.8-x64

注意,以管理员权限安装、路径不要带有空格

修改配置文件
编辑 Mosquitto安装路径下的 mosquitto.conf文件,在任何位置插入下面文本

#设置不允许匿名登录(调试可以不加,否则下文需要新建用户)
allow_anonymous false
#设置账户密码文件位置
password_file c:/mosquitto/pwfile

创建用户
1)打开cmd
2)进入mosquito安装目录:cd c:\mosquitto (如果将mosquito添加进环境变量,此步可以省略)
3)输入以下命令(保证 pwfile的路径和上面的配置一致。)

创建多个用户是为了测试 信息互不干扰的情况。

# 创建第1个用户,输入密码时界面是不会显示的,直接输入后回车就可以,需要连续输入两次。(下同)
mosquitto_passwd -c c:/mosquitto/pwfile admin (使用-c 参数会导致清空密码文件)

# 创建第2个用户
mosquitto_passwd    c:/mosquitto/pwfile user     (不使用-c 表示追加用户,不影响旧用户)

# 示例
#C:\Users\schips>cd c:\mosquitto
#c:\mosquitto>mosquitto_passwd -c c:/mosquitto/pwfile admin
#Password:
#Reenter password:
#c:\mosquitto>mosquitto_passwd c:/mosquitto/pwfile user
#Password:
#Reenter password:

启动服务
1)打开cmd
2)进入mosquito安装目录:cd c:\mosquitto (如果将mosquito添加进环境变量,此步可以省略)
3)输入以下命令(保证 pwfile的路径和上面的配置一致。)

mosquitto.exe -c mosquitto.conf

#或者使其在windows下后台运行。
start /b mosquitto.exe -c mosquitto.conf

# 示例
#c:\Users\schips>cd c:\mosquitto
#c:\mosquitto>start /b mosquitto.exe -c mosquitto.conf

测试 mqtt

先订阅一个主题
开启一个cmd命令行窗口

mosquitto_sub -u admin -P root -t 'topic' -v
# -u 后面跟着 账号, -p 指定密码(当allow_anonymous 为true时,可以不指定)
# -t 指定一个主题 (这个参数可以指定多次,至少指定一次)
# -v 代表 实时显示收到的消息

后发布一个主题消息
另外开启一个cmd命令行窗口

mosquitto_pub -u admin -P root -t 'topic' -m 'test'

效果
订阅者能够收到发布者发来的信息,那么证明测试是成功的。

简单抓包测试

1)打开Wireshark,选择你的网卡,添加以下过滤条件,并点击开始捕获。

tcp.port==1883

2)打开终端,输入以下命令,发布一条消息。MQTT快速入门

mosquitto_pub -d -u admin -P root -t 'topic' -m 'test' 

# -d 代表调试模式,以显示详细的连接以及数据收发过程。

Client mosq-CEBchWY2M3FxBeiHS8 sending CONNECT
Client mosq-CEBchWY2M3FxBeiHS8 received CONNACK (0)
Client mosq-CEBchWY2M3FxBeiHS8 sending PUBLISH (d0, q0, r0, m1, ''topic'', ... (6 bytes))
Client mosq-CEBchWY2M3FxBeiHS8 sending DISCONNECT

3)进入Wireshark捕获窗口,发现捕获到了一些TCP和MQTT协议,如下:

4)查看其中一条MQTT消息,比如Connect Command,点击这一行。查看MQTT消息内容。其字节码为

MQ Telemetry Transport Protocol, Connect Command
    Header Flags: 0x10, Message Type: Connect Command
        0001 .... = Message Type: Connect Command (1)
        .... 0000 = Reserved: 0
    Msg Len: 55
    Protocol Name Length: 4
    Protocol Name: MQTT
    Version: MQTT v3.1.1 (4)
    Connect Flags: 0xc6, User Name Flag, Password Flag, QoS Level: At most once delivery (Fire and Forget), Will Flag, Clean Session Flag
        1... .... = User Name Flag: Set
        .1.. .... = Password Flag: Set
        ..0. .... = Will Retain: Not set
        ...0 0... = QoS Level: At most once delivery (Fire and Forget) (0)
        .... .1.. = Will Flag: Set
        .... ..1. = Clean Session Flag: Set
        .... ...0 = (Reserved): Not set
    Keep Alive: 60
    Client ID Length: 23
    Client ID: mosq-UmzxCNey7s4rXXl05L
    Will Topic Length: 3
    Will Topic: 123
    Will Message Length: 0
    Will Message: 
    User Name Length: 5
    User Name: admin
    Password Length: 4
    Password: root

...
0040   10 37 00 04 4d 51 54 54 04 c6 00 3c 00 17 6d 6f   .7..MQTT...<..mo
0050   73 71 2d 55 6d 7a 78 43 4e 65 79 37 73 34 72 58   sq-UmzxCNey7s4rX
0060   58 6c 30 35 4c 00 03 31 32 33 00 00 00 05 61 64   Xl05L..123....ad
0070   6d 69 6e 00 04 72 6f 6f 74                        min..root

现在不了解这些东西是什么含义,没关系,不要慌。明白了抓包以后,接下来的章节可以经常参考本文的内容,不懂就抓包。

在抓包协议中看到的 Message Identifier在本系列文章中 指的是 Packet Identifier,两者没有区别。

posted @ 2020-02-03 11:22  schips  阅读(2696)  评论(0编辑  收藏  举报