HAOS无法连接自建MQTT代理问题排查求助
HAOS虚拟机无法持续连接自建MQTT代理
问题概述
- 运行在Unraid虚拟机上的HAOS无法稳定连接自建MQTT代理,连接建立后立即发送断开请求
- MQTT Explorer、Docker版HA开发实例可正常使用相同凭据连接该代理
- HAOS与MQTT代理网络连通性正常(ping测试通过)
环境细节
- 网络: 所有设备处于同一子网,曾尝试通过Nginx反向代理使用主机名连接,无效后放弃该方案
- HAOS: 最新版本,Unraid管理的虚拟机,其他传感器/设备网络连接正常
- 网络源:
br0 - 网络模型:
virtio-net
- 网络源:
- MQTT代理: Unraid Docker容器运行的Mosquitto,通过
mosquitto_passwd命令创建用户,加密密码存储在passwds.txt文件中
MQTT代理配置
# mosquitto configuration per_listener_settings true listener 8883 protocol mqtt listener 1883 protocol mqtt # to run mosquitto securely (with authentication) - RECOMMENDED - uncomment the following code block: # run `touch '/config/passwd'` then `mosquitto_passwd /config/passwd <user>` within the container to generate the password file and add a user # https://github.com/cmccambridge/mosquitto-unraid/blob/master/README.md#Authentication password_file /config/config/passwds.txt # to run mosquitto unsecurely (without authentication) uncomment the following code block: # allow_anonymous true
相关日志
HAOS日志
DEBUG (Thread-83 (_thread_main)) [paho.mqtt.client] Sending CONNECT (u1, p1, wr0, wq0, wf0, c1, k60) client_id=b'3yaReFCIs2ANhx7YJHmRU5' DEBUG (SyncWorker_13) [paho.mqtt.client] Sending DISCONNECT
MQTT代理日志
Sending CONNACK to 3yaReFCIs2ANhx7YJHmRU5 (0, 0) Received DISCONNECT from 3yaReFCIs2ANhx7YJHmRU5 Client 3yaReFCIs2ANhx7YJHmRU5 disconnected.
排查进展
- 已确认网络连通性正常(ping MQTT主机返回
<mqtt host> is alive!) - 开启MQTT客户端debug级日志,未获取到更多有效故障信息
排查与解决建议
验证密码文件路径与权限
检查Docker容器内/config/config/passwds.txt路径是否存在,且Mosquitto进程有读取权限。可进入容器执行ls -l /config/config/passwds.txt验证,若路径错误,修改为实际存储路径(比如/config/passwds.txt),并将文件权限调整为644。临时禁用认证测试
临时注释password_file配置,开启allow_anonymous true,重启Mosquitto后测试HAOS是否能保持连接。若连接正常,说明问题出在认证环节,重新用mosquitto_passwd生成密码文件,确保用户名密码与HAOS配置完全一致(注意大小写、特殊字符)。检查HAOS MQTT集成配置
- 确认HAOS中MQTT集成的「高级选项」里,SSL/TLS处于关闭状态(当前代理1883端口未配置SSL,强制启用会导致连接后断开)
- 尝试手动指定唯一客户端ID,避免自动生成的ID可能引发的异常
调整虚拟机网络模型
临时将HAOS虚拟机的网络模型改为e1000(Intel网卡),部分环境下virtio-net可能存在TCP会话异常,更换后测试连接稳定性。抓取数据包分析
在Unraid主机上执行tcpdump抓取MQTT流量,命令如下:tcpdump -i br0 port 1883 and host <HAOS_IP> and host <MQTT_IP> -w mqtt_capture.pcap用Wireshark打开捕获文件,查看CONNECT/CONNACK后的数据包细节,定位未被日志记录的异常。
内容的提问来源于stack exchange,提问作者Mattygabe
相关产品推荐
相关产品推荐

