新安装完系统,启用 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 #2459
Can't access using websockets running on Windows · Issue #2425
Arm 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 、微软文档、自由互联等
- 感谢开源维护者的努力
-
后记