问题总结:
使用wrieshark抓取 mqtt的包时出现问题,只能抓取到tcp层面的包。无法解析mqtt的协议。解决办法使用在wrieshark的plugins下面放一个脚本文件名字随便取后缀为 .lua,特别注意:如果wrieshark是2.6以后的版本 就直接放在plugins下就行了 脚本会自动加载,如果是2.6以下的版本就必须要在 wrieshark根目录下的init.lua 的最后一行 添加dofile(".//plugins//脚本文件名")
脚本内容如下
do
-- calling tostring() on random FieldInfo's can cause an error, so this func handles it
local function getstring(finfo)
local ok, val = pcall(tostring, finfo)
if not ok then val = "(unknown)" end
return val
end
-- Create a new dissector
MQTToverWebsocket = Proto("MQTToverWebsocket", "MQTT over Websocket")
mqtt_dissector = Dissector.get("mqtt")
-- The dissector function
function MQTToverWebsocket.dissector(buffer, pinfo, tree)
local fields = { all_field_infos() }
local websocket_flag = false
for i, finfo in ipairs(fields) do
if (finfo.name == "websocket") then
websocket_flag = true
end
if (websocket_flag == true and finfo.name == "data") then
local str1 = getstring(finfo)
local str2 = string.gsub(str1, ":", "")
local bufFrame = ByteArray.tvb(ByteArray.new(str2))
mqtt_dissector = Dissector.get("mqtt")
--mqtt_dissector:call(finfo.source, pinfo, tree) #9 BUG
mqtt_dissector:call(bufFrame, pinfo, tree)
--mqtt_dissector:call(finfo.value, pinfo, tree)
websocket_flag = false
pinfo.cols.protocol = "MQTT over Websocket"
end
end
--ws_dissector_table = DissectorTable.get("ws.port")
--ws_dissector_table:add("443",mqtt_dissector)
end
-- Register the dissector
--ws_dissector_table = DissectorTable.get("ws.port")
--ws_dissector_table:remove(443, mqtt_dissector)
--ws_dissector_table:add(443, MQTTPROTO)
--ws_dissector_table:add_for_decode_as(mqtt_dissector)
register_postdissector(MQTToverWebsocket)
end
坑点:我最开始用的是netty写的mqtt服务端来进行测试,客户端使用的是mqtt.fx但是wrieshark抓不到mqtt的包,以为wrieshark有问题,后来我服务端换成了mosquitto 发现就能抓到相应的包了,目前为止也没有发现到底为什么netty写的mqtt服务端 wrieshark抓不到包
最后付上mosquitto安装的教程url:https://blog.csdn.net/qq_28537277/article/details/86659160