无法使用 Paho Javascript 库通过 ssl web-socket 连接到远程 mqtt 代理

Unable to connect to remote mqtt broker over ssl web-socket using Paho Javascript library

我遇到错误:

与 'wss://iot.XXXX.GG:8883/mqtt' 的 WebSocket 连接失败:连接在收到握手响应之前关闭

当尝试使用 Windows 10 上的 Javascript Paho 库通过 SSL 连接到远程 Mosquitto 代理时。

我已经尝试过的内容如下所示:

<script type = "text/javascript" language = "javascript">
        var mqtt;
        var reconnectTimeout = 2000;
        var host="iot.XXXX.GG" ;
        var port=8883;

function onConnect() {
// Once a connection has been made, make a subscription and send a message.

        console.log("Connected ");
        message = new Paho.MQTT.Message("Hello World");
        message.destinationName = "sensor1";
        mqtt.send(message);
      }
      function MQTTconnect() {
        console.log("connecting to "+ host +" "+ port);
        mqtt = new Paho.MQTT.Client(host,port,"clientjs");  
        var options = {         
            useSSL:true,
            timeout: 3,
            userName:"abc",
            password:"qweqwe",
            onSuccess: onConnect
         };
        mqtt.connect(options);
};
</script>

预期结果应该是一条消息“已连接。实际结果显示在此 post 的开头,作为我得到的错误。

顺便说一下,我的 Mosquitto.conf 文件是:

allow_anonymous false
password_file /etc/mosquitto/passwd

listener 1883 localhost
protocol mqtt

listener 8883
certfile /etc/letsencrypt/live/iot.XXXX.GG/cert.pem
cafile /etc/letsencrypt/live/iot.XXXX.GG/chain.pem
keyfile /etc/letsencrypt/live/iot.XXXX.GG/privkey.pem

# WebSockets - insecure
listener 8083
protocol websockets
#http_dir /home/ΧΧΧΧ/domains/iot.XXXX.GG/public_html
#certfile /etc/letsencrypt/live/iot.XXXX.GG/cert.pem
#cafile /etc/letsencrypt/live/iot.XXXX.GG/chain.pem
#keyfile /etc/letsencrypt/live/iot.XXXX.GG/privkey.pem

Paho MQTT 客户端只能连接到配置为 运行 MQTT over WebSockets 的代理。

您提供的 mosquitto.conf 文件定义了 3 个侦听器。

  1. 端口 1883 上的默认本机 MQTT 侦听器仅绑定到本地主机
  2. 使用 letsencrypt 证书的 8883 端口上的原生 MQTT over SSL 侦听器
  3. 端口 8083 上的 WebSockets 侦听器上的 MQTT,证书已被注释掉。

如果您想使用基于 WebSocket 和 SSL 的 MQTT 从网页进行连接,您需要取消注释来自第三个侦听器的证书并将您在页面中连接到的端口更改为 8083(不是 8883)