在JavaScript中实例化Paho客户端的正确方法,用于wss(安全的websocket)。

不幸的是,目前Paho的文档相当零散,而且Eclipse网站上的一些链接也不起作用。

这里有一些工作链接(截至2019年5月)。

这里是史蒂夫的一个奇妙的网站。

在Paho命名空间中有一个重要的突破性变化,在那里你使用Steve的代码会遇到麻烦。

"以前,客户的Namepsace是 Paho.MQTT,从1.1.0版本(开发分支)开始,这一点现在已经被简化为 霸王.你应该能够简单地在你的代码中做一个查找和替换来解决这个问题,例如,所有的实例的 Paho.MQTT.客户端 现在将是 Paho.ClientPaho.MQTT.Message 将是 霸昊.留言."(见于 GitHub)

正如文中所说,使用Paho.Client而不是Paho.MQTT.Client,使用Paho.Message而不是Paho.MQTT.Message。

我面临的另一个问题是客户端无法在wss://(安全网络套接字)上连接。你需要为此使用一个特殊的语法。

TL;DR 迫使WSS与Paho。

语法是。

mqtt = new Paho.Client("wss://key:[email protected]/mqtt", "clientid");

请注意,我们不需要传入任何端口。端口是可选的,必须作为URI的一部分来设置。替换为 key:[email protected] 部分用你自己的URL。/mqtt是默认的,在VerneMQ上也是这样配置的,用于websockets。

客户端ID必须是一个字符串。

误区

这里有一些 错误的 (!)的代码样本和你将在其中运行的错误。

在'https://picockpit.local/debugpaho'的页面是通过HTTPS加载的,但试图连接到不安全的WebSocket端点'ws://picockpit.local:443/mqtt'。该请求已被阻止;该端点必须通过WSS可用。

这时你认为如果你通过HTTPS加载,Paho会自动为你检测出正确的协议。它不会的。你必须向Paho.Client传递一个URI(见上文)。

URL 'ws://[wss://picockpit.local/mqtt]:0' 无效。错误。构建'WebSocket'失败。URL 'ws://[wss://picockpit.local/mqtt]:0' 无效。

这是你试图传入所有参数的时候 - 省略所有其他参数,只传入clientid(一个字符串)。(我试图将端口设置为0,因为我认为它会被忽略)。

jQuery.Deferred异常。无法读取未定义的'Client'属性 TypeError:无法读取未定义的'Client'属性

mqtt = new Paho.MQTT.Client(uri, 0, "", "myclientid")。

如果你没有按照上面的建议将Paho.MQTT.Client替换为Paho.Client,就会发生这种情况。

jquery.min.js:2 未发现的错误。AMQJS0012E 端口的类型对象无效。

at new Client (paho-mqtt.min.js:62)

在MQTTconnect (pcp-code.js:17)

在运行时(debugpaho:133)

at HTMLDocument. (debugpaho:137)

at l (jquery.min.js:2)

at c (jquery.min.js:2)

mqtt = new Paho.Client("wss://key:[email protected]");

令人困惑的是,这告诉我们要传入一个端口。也许对一个完整的URI的匹配是通过对主机名后面的尾部斜杠的匹配?

mqtt = new Paho.Client("wss://key:[email protected]/mqtt", 443);

jquery.min.js:2 未发现的错误。AMQJS0013E Invalid argument 443 for clientId.

与'wss://key:[email protected]/mqtt'的WebSocket连接失败。在WebSocket握手过程中出错。意外的响应代码。403

最后,这是一个通过MQTT连接到Paho的正确方法。错误代码是由于后端没有按照预期工作(这不是由于Paho的问题)。