唉, 本来打算深入学mqtt协议的, 没想到搭个环境, 搭建了好久, 差点放弃了, 好多坑...., 我的环境的选择是:Emqtt搭建本地服务器+ wireshark网络抓包工具+通信猫+mqtt.fx客户端, 接下来一步步说这几个软件的安装吧.
一: Emqtt服务器
mqtt服务器有很多开源的, 这里我选择后台界面比较美观的Emqtt, 人来了世界生是为了看颜值高的, 我选择他, EMQTT服务器搭建没有什么坑要跳, 直接参考该博客就行:https://blog.csdn.net/myruo/article/details/79377583 下面附一张控制台艳照
二:通信猫网络调试助手
有这么多的tcp调试助手, 为什么选择他呢, 一是因为它发送数据的时候有hex进制发送, 因为mqtt协议的包都是要求16进制发送的, 通信猫还有其他的好多功能, 自己用了就知道, 我就不在这帮他打广告了, 通信猫下载地址:http://www.tongxinmao.com/Topic/Detail/id/6 关键还是绿色的, 就喜欢绿色的软件了, 不要时直接卸载文件夹, 这里没坑, 解压就行了, 附一张通信猫的图:
三: mqtt.fx安装
mqtt.fx安装也很简单, 下载地址: http://www.jensd.de/apps/mqttfx/1.5.0/ 使用教程:http://blog.sina.com.cn/s/blog_45eaa01a0102xam3.html 来一张我得配置图和连接图吧
如果连接成功了刚刚搭建的服务器, 上图的红色框中圆圈是绿色的, 没连接成功就是红色的, 在emqtt的服务器控制台, 也就是网址:http://localhost:18083/#/clients 能看到客户端信息
好了, 来到我们最麻烦最多坑的wireshark网络抓包工具了.
四:wireshark软件
wireshork呀, 真的想说爱你不容易哦, 折腾的我想死了都, 幸好这几天在练车, 被教练骂的狗血临头, 相比于wireshork好多了, 废话不说了, 来直接看教程吧.
wireshork下载连接: https://www.wireshark.org/ 官网, 最喜欢去官网下载了, 体现我们是高贵的人, 下载后看了一下简单教程, 需要的自己去网上找吧,下来一张界面图吧:
注: 这是正常不过的图了, 今天才正常的说说坑吧:
问题一: 当我设置了文件过滤后, 就是上图的tcp.port==1883后, 用通信猫连接服务器时, 没有出现tcp三次握手的信息, 通信猫的配置界面如下图所示:
只需关注红色框的信息, 左边的信息是我成功发送数据的信息. wireshark配置如图所示:
输出的信息我就不贴了, 全部空白, 没有任何消息, 我心想就奇怪了, tcp.port==1883 端口没错, 即使我没发信息, 应该有三次握手的信息吧, 找了好久wireshark的教程, 发现我也没配置错, 怎么就会没呢, 找了一天没找到, 就先放放没里了,
第二天. 在亲爱的度娘上看到你这篇文章:https://www.cnblogs.com/lvdongjie/p/6110183.html 瞬间明白了, 原来这是计算机的网络通信机理, 不是软件有问题, windows系统没有提供本地回环网络的接口,用wireshark监控网络的话只能看到经过网卡的流量,看不到访问localhost的流量,因为wireshark在windows系统上默认使用的是WinPcap来抓包的,现在可以用Npcap来替换掉WinPcap,Npcap是基于WinPcap 4.1.3开发的,api兼容WinPcap。仿佛看到了一丝希望, 找着教程, 终于能看到三次握手的信息了, 如下图所示:
红色为三次握手信息, 黄色为客户端向服务器发送请求包
问题二: 当我用mqtt.fx连接服务器时, wireshark中protocol中一直显示tcp, 该栏目中表示wireshark中自动帮我们根据包的结构解析出协议的类型, 为什么一直时tcp, 不应该时mqtt吗?(忽略上图的mqtt字母, 这是我成功后的图)
这个问题经过百度后, 发现wireshark是解析不出mqtt协议的, 需要增加第三方插件, 参考了: https://www.jianshu.com/p/a766dcfa747d https://www.cnblogs.com/ascii0x03/p/8781643.html 结果还是没解决, 心想是不是服务器的问题(我原来用的apollo搭建的mqtt服务器, 现在用的是本文提到的emqtt服务器), 后来在电脑上安装了emqtt服务器, 神奇了能解析出了mqtt协议了, 效果如上图所示, 既然能解析出了, 那来测试一下吧, 用通信猫向服务器发送一段16进制的报文: 10 0c 00 04 4d 51 54 54 04 02 ff ff 00 00 结果返回了20 02 00 00 该段返回码表示我连接成功了, 如下图所示:
再看看wireshark抓取的包吧:
也解析出来了, 成功!!!
注: 有人会问这个wireshark中的数据怎么看, 再来说明一下吧, 通信猫中有显示本地端口为54037, 这个端口是我们电脑客户端的端口号, 我们结合看wireshark中的信息来讲解:
no: 为包的顺序, time为抓包的时间, source为包的来源ip地址, destination为包目的ip地址, 这里因为都是本地发送接受的, 所以都为127.0.0.1 protocel为软件解析出包的协议属于的类型, length为包的长度, info为包的信息: 看到54037 - 1883了吗? 这表示是客户端向服务器发送的数据, 剩下的一些信息等我们讲解协议的时候再讲解吧, 今天先这样吧, 我再看看mqtt文档协议