Wireshark默认是只显示到TCP层,要分析MQTT的消息,需要先安装插件。参考:
懒得去看的同学可以直接按照以下步骤操作:
1)下载generic.dll:http://wsgd.free.fr/download.html,放到Wireshark的C:\Program Files\Wireshark\plugins\2.4.4目录下
2)下载MQTT规则文件:http://false.ekta.is/2011/06/mqtt-dissector-decoder-for-wireshark/#,放到Wireshark主目录C:\Program Files\Wireshark 下
3)运行Wireshark就可以了。可以在过滤器中直接输入mqttv31或者ip来过滤MQTT的协议消息
MQTT报文是包在TCP中,作为TCP的payload出现的,具体分析的时候要清楚MQTT各种报文中各个字节的含义。
connect
固定报头:
10 表示:connect报文
3b表示:剩余长度59
可变报头:
00 04 4d 51 54 54表示:MQTT
04
02表示:连接标志
【0000 0010:8个bit分别表示不需要用户名,不需要密码,不保留遗嘱消息,遗嘱的QoS没有遗嘱所以两位为0,遗嘱标志为0,清理会话,保留位】
00 14 表示:保持连接时间为20s,非0情况下,1.5倍时间内没有收到客户端控制保温,则必须断开连接。0表示连接不会断开
有效载荷:
Client id
CONNACK
固定头
20:CONNACK报文
02:剩余长度2
可变头
00:连接确认标志,其中高7位保留,第0位表示当前会话标志,CONNECT中Clean Session为1,所以第0位为0;如果Clean Session为0,服务端保存了会话状态,第0位为1,没保存,则为0
00:连接返回码,0表示连接成功
PUBLISH
固定头
30:PUBLISH报文,不重发,QOS=0
【0011 0000:高4位是PUBLISH报文,第三位是DUP重发标志,为1表示可能是一个早前报文的重发,第2和1位为QOS,第0位保留标志,表示服务器不必存储这个应用消息和它的QOS,如果为1,服务器需保存且分发给未来匹配主题的订阅者】
F2 01:长度为128+114=242
可变头
00 20:订阅主题长度,32个字节
65~73:订阅主题
有效荷载
5b~5d:载荷
SUBSCRIBE
固定头
82:SUBSCRIBE报文,8表示订阅报文,2表示0010,固定flag
25:剩余长度为37
可变头
00 01:报文标识符
00 20:长度MSB和LSB,32个字节
65~73:主题过滤器
00:QOS等级
SUBACK
固定头
90:SUBACK报文
03:剩余长度
00 01:报文标识符,对应上面SUBSCRIBE的,订阅请求和回复的报文标识符必须一致,不能在不同报文中存在相同的报文标识符。使用完可以释放复用。
00:授予QOS为0
【0000 0000:第7位为1表示订阅失败,第1和0位表示授予的QOS等级】
PINGREQ
C0:PINGREQ报文
00:剩余长度为0
PINGRESP
D0: 心跳响应报文
00: 剩余长度0