如何获取Espressif设备连接的MQTT服务器地址
如何获取Espressif设备连接的MQTT服务器地址
首先,你当前只能看到ARP广播是因为普通网卡只会接收发给自己的数据包或者广播包,而Espressif设备和路由器之间的单播流量默认不会传到你的Windows机器上。下面给你两种靠谱的方法来获取MQTT服务器地址,优先推荐第一种,因为更直观准确:
方法一:DD-WRT端口镜像 + Wireshark抓包
这是最直接的方式,通过路由器把Espressif设备的流量镜像到你的Windows机器,让Wireshark能抓到完整的设备通信包:
配置DD-WRT端口镜像
- 登录你的DD-WRT路由器后台(访问
192.168.0.1) - 找到「Services」或「Advanced」菜单下的「Port Mirroring」(不同DD-WRT版本位置可能略有差异,找不到的话可以搜下你路由器型号的端口镜像设置路径)
- 源端口选择Espressif设备对应的接口:如果是有线连接,选它插的那个LAN口;如果是无线连接,选无线接口(一般叫
wl0) - 目标端口选你的Windows机器连接路由器的LAN口
- 保存设置,必要时重启路由器(有些版本不需要重启,但重启能确保设置生效)
- 登录你的DD-WRT路由器后台(访问
用Wireshark分析流量
- 打开Wireshark,选择Windows机器连接路由器的那张网卡
- 设置过滤规则:输入
mqtt或者更精准的tcp port 1883 or tcp port 8883(MQTT默认端口是1883,加密MQTT用8883),这样就能只显示MQTT相关的流量 - 重启你的Espressif设备触发它发起MQTT连接(如果设备本来就会自动重连,等着就行)
- 找到MQTT的
CONNECT报文,里面的「Server Name」字段就是MQTT服务器的域名;如果是加密MQTT(TLS)看不到这个字段,就看TCP握手的SYN包,目标IP就是服务器的IP,你可以在Windows命令行里用nslookup [目标IP]查到对应的域名
方法二:直接用DD-WRT的日志或流量监控
如果不想折腾抓包,也可以通过路由器的日志或流量统计直接获取设备的出站连接信息:
启用防火墙日志记录MQTT连接
- 登录DD-WRT后台,进入「Administration」->「Commands」
- 输入以下两条命令(针对你的Espressif设备IP
192.168.0.145):iptables -I FORWARD -s 192.168.0.145 -p tcp --dport 1883 -j LOG iptables -I FORWARD -s 192.168.0.145 -p tcp --dport 8883 -j LOG - 点击「Save Firewall」保存规则
- 然后进入「Administration」->「Logs」,选择「Firewall」日志,就能看到设备发起的到1883/8883端口的连接记录,里面会明确显示目标IP地址
用流量统计查看连接
- 进入「Status」->「Bandwidth」,切换到「Connections」标签
- 找到源IP为
192.168.0.145的出站连接条目,看目标端口是1883或8883的那条,对应的目标IP就是MQTT服务器
补充说明
如果你的Espressif设备用了非标准的MQTT端口,那上面的过滤规则和防火墙日志命令里的端口号要改成对应的数值;另外如果是加密MQTT(TLS),Wireshark无法解密的话就只能通过TCP目标IP反查域名啦。
备注:内容来源于stack exchange,提问作者vico




