【问题标题】:lighttpd/mod_websocket mqtt handshake fail (no subproto)lighttpd/mod_websocket mqtt 握手失败(无子协议)
【发布时间】:2014-02-08 05:12:04
【问题描述】:

我已经按照 Dom Bramley 的博客文章中的讨论设置了带有 mod_websocket 的 lighttpd(除了我使用 BeagleBone Black 和 Debian Wheezy 而不是 rPi。)

https://www.ibm.com/developerworks/community/blogs/B-Fool/entry/setting_up_an_mqtt_websocket_gateway_for_raspberry_pi?lang=en

[在 lighttpd/mod_websocket 构建过程中,有人问我是否要修补服务器,我说是的。]

我有蚊子 MQTT 代理在同一主机上运行并发布各种主题。

当我尝试通过 Web 套接字使用浏览器客户端连接到代理时,我可以看到在 http 升级到 websocket 并将连接请求转发到 mosquitto 方面一切正常。 Mosquitto 获取连接请求并接受它。但是,返回到浏览器的响应不包括与原始升级请求中的子协议说明符 mqttv3.1 相呼应的 Sec-Websocket-Protocol 标头。客户端正确拒绝了这个答案,连接被关闭。

来自 mqttws31.js:912 的 javascript 错误是“Sent non-empty Sec-Websocket-Protocol header but no response is received”。使用 Wireshark,我可以看到这是真的; 101 Switching Protocols 响应包含标头 Upgrade、Connection 和 Sec-Websocket-Accept,但没有其他内容。

我的 mod_websocket 配置文件定义了主机、端口、类型和子协议,与 Dom 的示例相同,我可以从各种调试语句中看到请求正确到达 Mosquitto。

谁能建议如何将 Websocket-Protocol 标头包含在响应中?它必须有效,Dom 写了一篇博客文章描述了他是如何做到的!

【问题讨论】:

  • 如果您对 mod_websocket 有太多麻烦,您可以随时在 node 或 php 或您使用的任何语言中创建自己的 websocket。 github.com/esromneb/phpwebsocket

标签: websocket lighttpd mqtt


【解决方案1】:

我认为 mod_websocket 的最新版本破坏/删除了子协议支持,但现在无法确认。您可以尝试早期版本,或使用专用的 websocket 连接到 tcp 网关,如 WSS

https://github.com/stylpen/WSS/

【讨论】:

  • WSS 是一个很好的推荐。请使用最近修改以支持子协议的tls 分支。
  • This issue 可能特别感兴趣。
  • @ralight:你说的 subproto 被删除是对的。关于这个(github.com/nori0428/mod_websocket/issues/28)的一个线程的结论是“在 mod_websocket 版本 2.9 上不再处理 subproto。并且不需要处理 TCP 模式的 subproto。”我不知道为什么不需要协议协商,这对我来说似乎很重要!是的,有用的线程。我将看看使用 WSS。似乎 lighttpd/web_socket 通过不支持 subproto 将 MQTT 割让给其他人?
  • 取消支持似乎是一个非常愚蠢的决定,但我知道什么!它肯定不仅仅会给 MQTT 带来问题。
  • 我在 web_socket 上打开了一个问题,Issue 33,也许我们会从中看到一些背景信息。
【解决方案2】:

mod_websocket 作者(Norio Kobota)通过更新 mod_websocket 快速有效地为我解决了这个问题。该修复程序当前位于开发分支中,可在 github 上找到。我们的讨论是mod_websocket issue 28 主题的一部分。

简而言之,我所拥有的用例(预先编写的客户端库和现有的 TCP 后端)在连接时间协议协商方面远不如自己滚动的客户端和服务器组合灵活。但是,在我的情况下,我真的不需要任何灵活性或与后端协商,因此 mod_websocket 可以直接回显它已经给出的配置,而无需深入了解子协议的细节。

更新的 mod_websocket 在 websocket 握手期间从其配置文件中回显 subproto 条目,满足 MQTT 客户端库。

所以现在我有两个解决方案,用于 websocket 客户端和 TCP 后端之间的适配器!谢谢大家的帮助。

道格·约翰逊

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-03
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    • 2021-09-05
    • 2018-10-14
    • 2021-06-14
    相关资源
    最近更新 更多