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

  • Mosquitto Websocket 不能连接,解决过程小记已关闭评论
  • 262 次浏览
  • A+
所属分类:.NET技术
摘要

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


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功能,安装其它软件完善系统

  2. 开启日志,查看websocket是否正常

    后来看到配置文件有日志配置项,就想着让 Mosquitto 打印出运行日志,看看有什么异常之类的。意外的是,日志里明确记录到启动了websock,端口号也与配置一致,并且没有任何异常记录。再次搁置。

    #设置日志为文件类型,并写入指定文件,必须为绝对路径,路径符号为\或ss log_dest file C:Program Filesmosquittologsinfo.log # 注意 路径要存在,日志文件会自动生成  #记录日志的级别 log_type information  #说明,关于日志。要先查看安装目录下的 README-windows.txt 文件,里面有关于类型限制与权限相关的内容 
  3. 怀疑是不是客户端的问题,所以找了其它几个客户端

    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,承诺会修复。

    问题依旧没有解决

  4. 系统搞完之后,想着放弃之前再努力一次

    猜想,是不是和操作系统(新系统是(windwos 11)啥的有关。启动之前全新安装的win10虚拟机。在win10虚拟机,试过之后,失望的是问题依旧。

  5. 看到希望

    依然不死心,突然的想到,会不会是 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版使用。

  6. 完美解决问题

    回退版本的方法,还是感到美中不足。

    猜想,新版本不可能不支持老功能,并且已经连续三个版本了,简单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 
  7. 总结

    • 解决问题就是多角度排查事件,转角可以是碰到爱情,更可能是柳暗花明。坚持多想想办法。
    • 开源软件要选择用户量大的,维护时间长的,最好是一直在维护的。这样出了问题,很大可能已经有人遇到并解决了。
    • 最重要 有问题不能先看百度或只看百度
    • 感谢开源维护者的努力
  8. 后记