用于 MQTT 的 JavaScript 客户端不使用 WebSockets

Vik*_*dar 4 javascript websocket mqtt angularjs

我正在构建一个 AngularJS 应用程序并使用 Paho JavaScript 客户端通过 Web 套接字连接到 MQTT 代理 (test.mosquitto.org)。这工作得很好。我想通过直接 MQTT 连接到 MQTT 代理(为了支持未启用 websocket 的代理的完整性)。

由于Paho客户端不支持直接MQTT,我尝试了mqtt.js的浏览器版本(browserMqtt.js)。

这是我的代码中的主要行:

//var options = { host: "test.mosquitto.org", port: 8080 }; //works!
var options = { host: "test.mosquitto.org", port: 1883 }; //does not work!
var client  = mqtt.connect(options);
Run Code Online (Sandbox Code Playgroud)

同样,这适用于 WebSockets(端口 8080),但是当我尝试通过直接 MQTT(端口 1883)连接时,我在控制台中从 browserMqtt.js 收到错误消息消息,而不是来自我的错误处理程序,因为它没有触发:

WebSocket connection to 'ws://test.mosquitto.org:1883/' failed: Error during WebSocket handshake: net::ERR_CONNECTION_RESET
Run Code Online (Sandbox Code Playgroud)

我的应用程序在 Chrome 浏览器上运行。

我想知道这是代码问题还是设计问题?是否出于某种原因无法使用 MQTT 从浏览器连接到代理,并且库正在强制调用 WebSocket?

感谢您提供任何见解,因为我从几天来阅读的所有内容中收到了混合信息,但没有明确的示例可以用作解决方案。

rob*_*lep 8

WebSocket 是浏览器支持的协议,而不是普通的 TCP 套接字(如果你想直接运行 MQTT,你最终需要它)。

对于MQTT.js文档指出浏览器部分:

你的经纪人应该接受 websocket 连接

因此,没有办法解决必须从浏览器通过 WebSocket 使用 MQTT 的问题。您可以创建一个(服务器端)代理,该代理将接受 WebSocket 连接以使用普通 MQTT 协议将它们传递给目标代理。