Mosquitto Websocket 不能连接,解决过程小记

新安装完系统,启用 Mosquitto 的 Websocket 功能后,MQTTX 客户端 一直无法连接。问题困扰了几天,中途数次放弃,最终完美解决。记录下解决问题的过程和思路,一来记录下问题解决方案;二来记录下解决的过程与思路,总结一般解决问题的方法。

问题

安装好 Mosquitto, 配置中启用 “允许匿名连接”及配置好 Websocket 监控项,启动服务。使用 MQTTX 客户端,mqtt使用mqtt协议能连接上,但是使用 ws 协议无论怎么设置参数都连接不上。

allow_anonymous true

listener 1883
listener 9001
protocol websockets

解决过程

  1. 觉得是配置问题,于是百度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功能,安装其它软件完善系统

  1. 开启日志,查看websocket是否正常
    后来看到配置文件有日志配置项,就想着让 Mosquitto 打印出运行日志,看看有什么异常之类的。意外的是,日志里明确记录到启动了websock,端口号也与配置一致,并且没有任何异常记录。再次搁置。
#设置日志为文件类型,并写入指定文件,必须为绝对路径,路径符号为\\或\ss
log_dest file C:\Program Files\mosquitto\logs\info.log
# 注意 路径要存在,日志文件会自动生成

#记录日志的级别
log_type information

#说明,关于日志。要先查看安装目录下的 README-windows.txt 文件,里面有关于类型限制与权限相关的内容
  1. 怀疑是不是客户端的问题,所以找了其它几个客户端
    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,承诺会修复。
    问题依旧没有解决
  2. 系统搞完之后,想着放弃之前再努力一次
    猜想,是不是和操作系统(新系统是(windwos 11)啥的有关。启动之前全新安装的win10虚拟机。在win10虚拟机,试过之后,失望的是问题依旧。
  3. 看到希望
    依然不死心,突然的想到,会不会是 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版使用。

  1. 完美解决问题
    回退版本的方法,还是感到美中不足。
    猜想,新版本不可能不支持老功能,并且已经连续三个版本了,简单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
  1. 总结
  • 解决问题就是多角度排查事件,转角可以是碰到爱情,更可能是柳暗花明。坚持多想想办法。
  • 开源软件要选择用户量大的,维护时间长的,最好是一直在维护的。这样出了问题,很大可能已经有人遇到并解决了。
  • 最重要 有问题不能先看百度或只看百度
  • 一看 软件说明文档
  • 二 看 官网文档及变更说明
  • 三看 源代码库
  • 四看 专业网站 Stack Overflow 、微软文档等
  • 感谢开源维护者的努力
  1. 后记
    之后一段时间,收到 MQTT官方 多封回复邮件,说是问题得到修复。对 MQTT表示感谢。