Mosquitto Websocket 不能连接,解决过程小记
新安装完系统,启用 Mosquitto 的 Websocket 功能后,MQTTX 客户端 一直无法连接。问题困扰了几天,中途数次放弃,最终完美解决。记录下解决问题的过程和思路,一来记录下问题解决方案;二来记录下解决的过程与思路,总结一般解决问题的方法。
问题
安装好 Mosquitto, 配置中启用 “允许匿名连接”及配置好 Websocket 监控项,启动服务。使用 MQTTX 客户端,mqtt使用mqtt协议能连接上,但是使用 ws 协议无论怎么设置参数都连接不上。
allow_anonymous true
listener 1883
listener 9001
protocol websockets
解决过程
- 觉得是配置问题,于是百度websocket配置并做各种修改。
- 按网上修改配置为以下配置无果
port 1883
listener 9001
protocol websockets
- 修改为以下,无果
listener 1883
protocol mqtt
listener 9001
protocol websockets
- 修改为以下,无果
listener 1883/0.0.0.0
protocol mqtt
listener 9001/0.0.0.0
protocol websockets
- 修改为以下,无果
listener 1883 0.0.0.0
protocol mqtt
listener 9001 0.0.0.0
protocol websockets
学到如下知识
- 修改配置后,重启服务,配置才能生效
- 修改配置后,服务不能重启,说明配置项有错误
- 尽量使用 listener 替代 port
- 必须使用 protocol websock 才能启用 websock 不配置的话默认为mqtt协议
- listener 除端口外,可以配置主机名或ip地址,默认只监听本地回环。
- 监听所有 IP(回环 局域网IP 外网 或 多网卡多IP) 可以使用 0.0.0.0
- listener 端口和IP之间,使用 空格 或 / 都可以,但后续发现 空格是标准;/ 有时会导致配置无效
各种修改无效之后,放弃Websocket功能,安装其它软件完善系统
- 开启日志,查看websocket是否正常
后来看到配置文件有日志配置项,就想着让 Mosquitto 打印出运行日志,看看有什么异常之类的。意外的是,日志里明确记录到启动了websock,端口号也与配置一致,并且没有任何异常记录。再次搁置。
#设置日志为文件类型,并写入指定文件,必须为绝对路径,路径符号为\\或\ss
log_dest file C:\Program Files\mosquitto\logs\info.log
# 注意 路径要存在,日志文件会自动生成
#记录日志的级别
log_type information
#说明,关于日志。要先查看安装目录下的 README-windows.txt 文件,里面有关于类型限制与权限相关的内容
- 怀疑是不是客户端的问题,所以找了其它几个客户端
MQTT Box、MQTT Explorer、MQTTnetApp、MQTT X 均不能连接。但是意外的发现,使用EMQX 服务的web管理页面中的"工具-> Websocket"可以连接。
猜想,是不是MQTT X的bug,于是跑到 MQTT X 开源项目中,提了个[问题]([Bug] 连接 WebSocket 错误 · Issue #939 · emqx/MQTTX (github.com)) ,惊喜的是,第2天就收到回复,并且确认是个bug,承诺会修复。
问题依旧没有解决 - 系统搞完之后,想着放弃之前再努力一次
猜想,是不是和操作系统(新系统是(windwos 11)啥的有关。启动之前全新安装的win10虚拟机。在win10虚拟机,试过之后,失望的是问题依旧。 - 看到希望
依然不死心,突然的想到,会不会是 Mosquitto自身的版本问题。
首先去官网(后面看到安装目录里也有)版本变更记录里找,可惜没有找到什么有用的,再次失望。
又想,既然有了虚拟机环境,就一个版本一个版本的,试试。虽然笨了点,也用不了多长时间。测试结果
mosquitto版本 | MQTTX[1.7.3] | MQTTnetApp[1.3.0] | MQTT-Explorer[0.4.0] |
1.6.9 | 能连接 | 能连接 | 能连接 |
2.0.0 | 不能 | 能 | 能 |
2.0.8 | 能 | 能 | 能 |
2.0.9 | 能 | 能 | 能 |
2.0.10 | 能 | 能 | 能 |
2.0.11 | 能 | 能 | 能 |
2.0.12 | 不能 | 不能 | 不能 |
2.0.13 | 不能 | 不能 | 不能 |
2.0.14(当前最新) | 不能 | 不能 | 不能 |
看来,还真是版本的问题。起码可以降级到2.0.11版使用。
- 完美解决问题
回退版本的方法,还是感到美中不足。
猜想,新版本不可能不支持老功能,并且已经连续三个版本了,简单bug的话,应该已经修复了。可能是配置什么的,变更了没有记录,websocket用的人比较少。
百度不到,官网没有。既然在开源软件,难道只能去看源代码!也不知道是啥语言写的。去看看。
查看源代码库时,眼前一亮,看到 issues,怎么把这个忘记了。去搜索了下 websocket ,再次惊喜的发现,有几项相关的,
看了下,真的是有问有答有解决。完美解决。
搜索Anonymous setting for websockets is being ignored · Issue #2459Can't access using websockets running on Windows · Issue #2425Arm executable 2.0.12 broken · Issue #2398 后续发现 Stack Overflow 上也有人提出过,Mosquitto no websocket connection since version 02.0.12 原因:2.0.12及以上版本,配置websocket时,必须添加socket_domain配置项,来指定是 ipv4 还是 ipv6
# 完美解决方案
# mqtt 协议配置,分为IP4和IP6两种,当前可以只配置启用一种
listener 1883 0.0.0.0
socket_domain ipv4
protocol mqtt
listener 1883 ::
socket_domain ipv6
protocol mqtt
# webscoket 协议配置,分为IP4和IP6两种,当前可以只配置启用一种
listener 9001 0.0.0.0
protocol websockets
socket_domain ipv4
listener 9001 ::
protocol websockets
socket_domain ipv4
- 总结
- 解决问题就是多角度排查事件,转角可以是碰到爱情,更可能是柳暗花明。坚持多想想办法。
- 开源软件要选择用户量大的,维护时间长的,最好是一直在维护的。这样出了问题,很大可能已经有人遇到并解决了。
- 最重要 有问题不能先看百度或只看百度
- 一看 软件说明文档
- 二 看 官网文档及变更说明
- 三看 源代码库
- 四看 专业网站 Stack Overflow 、微软文档等
- 感谢开源维护者的努力
- 后记
之后一段时间,收到 MQTT官方 多封回复邮件,说是问题得到修复。对 MQTT表示感谢。