我已经使用mod_websocket设置了lighttpd,正如Dom Bramley的博客文章中所讨论的那样(除了我使用的是Beagle Wheone而不是rPi的BeagleBone Black。)
[在lighttpd / mod_websocket构建过程中,我被问到是否要修补服务器,我说是的。]
我有蚊子MQTT经纪人在同一主机上运行并发布各种主题。
当我尝试通过Web套接字与浏览器客户端连接到代理时,我可以看到一切都可以正常运行到websocket的http升级并将连接请求转发给mosquitto。 Mosquitto获取连接请求并接受它。但是,返回到浏览器的响应不包括回显原始升级请求中的subproto说明符mqttv3.1的Sec-Websocket-Protocol标头。客户端正确拒绝此答案,并且连接已关闭。
来自mqttws31.js:912的javascript错误是"发送非空的Sec-Websocket-Protocol标头但未收到任何响应。"有了Wireshark,我可以看到这是真的; 101 Switching Protocols响应包含升级,连接和Sec-Websocket-Accept标题,但没有别的。
我的mod_websocket配置文件定义了host,port,type和subproto与Dom的示例相同,我可以从各种调试语句中看到请求正确地一直到Mosquitto。
有人可以建议如何让Websocket-Protocol标头包含在响应中吗?它必须有效,Dom写了一篇博文,描述了他是如何做到的!
答案 0 :(得分:1)
我认为mod_websocket的最新版本破坏/删除了子协议支持,但现在无法确认。您可以尝试使用早期版本,或者像WSS一样使用专用的websocket来连接TCP网关
答案 1 :(得分:1)
mod_websocket作者(Norio Kobota)通过对mod_websocket进行更新,快速有效地解决了这个问题。该修补程序目前位于开发分支中,可在github上获得。我们的讨论是mod_websocket issue 28的主题的一部分。
简而言之,我所拥有的用例(预先编写的客户端库和现有的TCP后端)在连接时协议协商方面比自己动手的客户端和服务器组合灵活得多。但是,在我的情况下,我并不需要任何灵活性或与后端协商,因此mod_websocket可以回应它已经给出的配置,而不必深入了解子协议的细节。
更新的mod_websocket在满足MQTT客户端库的websocket握手期间从其配置文件中回显subproto条目。
所以现在我有两个websocket客户端和TCP后端之间的适配器解决方案!谢谢大家的帮助。
道格约翰逊