juiste manier om Paho Client in JavaScript te instantiëren voor wss (secure websocket)
De Paho documentatie is helaas nogal gefragmenteerd op het moment, en sommige links op Eclipse's website werken niet.
Hier zijn enkele werkende links (vanaf 05/2019):
- https://www.eclipse.org/paho/clients/js/
- https://www.eclipse.org/paho/files/jsdoc/index.html
- https://github.com/eclipse/paho.mqtt.javascript
En hier is een fantastische website van Steve:
Er is een belangrijke breuk in de Paho namespace, waar je in de problemen komt als je Steve's code gebruikt:
"Voorheen was de Namepsace van de cliënt Paho.MQTT
, vanaf versie 1.1.0 (develop branch) is dit nu vereenvoudigd tot Paho
. U zou in staat moeten zijn om simpelweg een zoek-en-vervang uit te voeren in uw code om dit op te lossen, bijvoorbeeld alle instanties van Paho.MQTT.Client
zal nu Paho.Client
en Paho.MQTT.Bericht
zal zijn Paho.Bericht
." (zoals gezien op GitHub)
Zoals de tekst zegt, gebruik Paho.Client in plaats van Paho.MQTT.Client en Paho.Message in plaats van Paho.MQTT.Message.
Een ander probleem waar ik tegenaan liep was het onvermogen van de client om verbinding te maken via wss:// (secure websockets). Je moet daar een speciale syntax voor gebruiken.
TL;DR dwingen WSS met Paho:
De syntaxis is:
mqtt = new Paho.Client("wss://key:[email protected]/mqtt", "clientid");
Merk op dat we GEEN poort doorgeven. De poort is optioneel en moet worden ingesteld als onderdeel van de URI. Vervang de key:[email protected] deel met je eigen URL. /mqtt is standaard, en ook geconfigureerd op VerneMQ voor websockets op die manier.
De client id moet een string zijn.
Fouten
Hier zijn enkele verkeerde (!) codevoorbeelden en de fouten die je daarin tegenkomt:
De pagina op 'https://picockpit.local/debugpaho' werd geladen over HTTPS, maar probeerde verbinding te maken met het onveilige WebSocket-eindpunt 'ws://picockpit.local:443/mqtt'. Dit verzoek is geblokkeerd; dit eindpunt moet beschikbaar zijn via WSS.
Dit is wanneer je aanneemt dat Paho automatisch het juiste protocol voor je zal detecteren, als je over HTTPS laadt. Dat is niet het geval. Je moet een URI doorgeven aan Paho.Client (zie hierboven).
De URL 'ws://[wss://picockpit.local/mqtt]:0' is ongeldig. Fout: Mislukt bij het construeren van 'WebSocket': De URL 'ws://[wss://picockpit.local/mqtt]:0' is ongeldig.
Dit is wanneer je probeert alle parameters in te geven - laat alle andere parameters weg, geef alleen de clientid (een string) in. (Ik heb geprobeerd om de poort op 0 te zetten, omdat ik dacht dat die genegeerd zou worden).
jQuery.Deferred uitzondering: Kan eigenschap 'Client' van ongedefinieerd niet lezen TypeError: Kan eigenschap 'Client' van undefined niet lezen
mqtt = new Paho.MQTT.Client(uri, 0, "", "myclientid");
Dit zal gebeuren als je Paho.MQTT.Client niet vervangt door Paho.Client zoals hierboven geadviseerd.
jquery.min.js:2 Uncaught Error: AMQJS0012E Ongeldig type object voor poort.
bij new Client (paho-mqtt.min.js:62)
bij MQTTconnect (pcp-code.js:17)
bij run (debugpaho:133)
bij HTMLDocument. (debugpaho:137)
bij l (jquery.min.js:2)
bij c (jquery.min.js:2)
mqtt = new Paho.Client("wss://key:[email protected]");
Verwarrend genoeg vertelt dit ons om een poort in te geven. Misschien is het matchen voor een volledige URI ook het matchen voor een slash achter de hostnaam?
mqtt = new Paho.Client("wss://key:[email protected]/mqtt", 443);
jquery.min.js:2 Uncaught Error: AMQJS0013E Ongeldig argument 443 voor clientId.
WebSocket verbinding met 'wss://key:[email protected]/mqtt' mislukt: Fout tijdens WebSocket handshake: Onverwachte antwoordcode: 403
Eindelijk, dit is een correcte manier om verbinding te maken met Paho via MQTT. De foutcode is te wijten aan het feit dat de backend niet werkt zoals verwacht (dit is geen probleem van Paho).