在JavaScript中实例化Paho客户端的正确方法,用于wss(安全的websocket)。
不幸的是,目前Paho的文档相当零散,而且Eclipse网站上的一些链接也不起作用。
这里有一些工作链接(截至2019年5月)。
- https://www.eclipse.org/paho/clients/js/
- https://www.eclipse.org/paho/files/jsdoc/index.html
- https://github.com/eclipse/paho.mqtt.javascript
这里是史蒂夫的一个奇妙的网站。
在Paho命名空间中有一个重要的突破性变化,在那里你使用Steve的代码会遇到麻烦。
"以前,客户的Namepsace是 Paho.MQTT
,从1.1.0版本(开发分支)开始,这一点现在已经被简化为 霸王
.你应该能够简单地在你的代码中做一个查找和替换来解决这个问题,例如,所有的实例的 Paho.MQTT.客户端
现在将是 Paho.Client
和 Paho.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的问题)。