korrekte Instanziierung des Paho Client in JavaScript für wss (secure websocket)
Die Paho-Dokumentation ist im Moment leider noch sehr lückenhaft, und einige Links auf der Eclipse-Website funktionieren nicht.
Hier sind einige funktionierende Links (Stand: 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
Und hier ist eine fantastische Website von Steve:
Es gibt eine wichtige Änderung im Paho-Namensraum, bei der Sie Probleme bekommen werden, wenn Sie Steves Code verwenden:
"Zuvor war der Namepsace des Kunden Paho.MQTT
Ab der Version 1.1.0 (Entwicklungszweig) wurde dies nun vereinfacht zu Paho
. Sie sollten in der Lage sein, dies durch einfaches Suchen und Ersetzen in Ihrem Code zu beheben, zum Beispiel alle Instanzen von Paho.MQTT.Client
wird nun Paho.Client
und Paho.MQTT.Nachricht
wird sein Paho.Nachricht
." (zu sehen bei GitHub)
Wie der Text sagt, verwenden Sie Paho.Client anstelle von Paho.MQTT.Client und Paho.Message anstelle von Paho.MQTT.Message.
Ein weiteres Problem, mit dem ich konfrontiert wurde, war die Unfähigkeit des Clients, eine Verbindung über wss:// (sichere Websockets) herzustellen. Sie müssen dafür eine spezielle Syntax verwenden.
TL;DR erzwingt WSS mit Paho:
Die Syntax lautet:
mqtt = new Paho.Client("wss://key:[email protected]/mqtt", "clientid");
Beachten Sie, dass wir KEINEN Port mitgeben. Der Port ist optional und muss als Teil des URIs angegeben werden. Ersetzen Sie die key:[email protected] Teil mit Ihrer eigenen URL. /mqtt ist Standard, und auch auf VerneMQ für Websockets so konfiguriert.
Die Client-ID muss eine Zeichenkette sein.
Fehler
Hier sind einige falsch (!) Code-Beispiele und die Fehler, die Sie darin finden werden:
Die Seite 'https://picockpit.local/debugpaho' wurde über HTTPS geladen, hat aber versucht, sich mit dem unsicheren WebSocket-Endpunkt 'ws://picockpit.local:443/mqtt' zu verbinden. Diese Anfrage wurde blockiert; dieser Endpunkt muss über WSS verfügbar sein.
Dies ist der Fall, wenn Sie davon ausgehen, dass Paho automatisch das richtige Protokoll für Sie erkennt, wenn Sie über HTTPS laden. Das tut es nicht. Sie müssen eine URI an Paho.Client übergeben (siehe oben).
Die URL 'ws://[wss://picockpit.local/mqtt]:0' ist ungültig. Fehler: WebSocket' konnte nicht erstellt werden: Die URL 'ws://[wss://picockpit.local/mqtt]:0' ist ungültig.
Dies ist der Fall, wenn Sie versuchen, alle Parameter einzugeben - lassen Sie alle anderen Parameter weg, geben Sie nur die clientid (eine Zeichenkette) ein. (Ich habe versucht, den Port auf 0 zu setzen, da ich dachte, er würde ignoriert werden).
jQuery.Deferred-Ausnahme: Cannot read property 'Client' of undefined TypeError: Die Eigenschaft 'Client' von undefined kann nicht gelesen werden
mqtt = new Paho.MQTT.Client(uri, 0, "", "myclientid");
Dies geschieht, wenn Sie Paho.MQTT.Client nicht wie oben beschrieben durch Paho.Client ersetzen.
jquery.min.js:2 Unerwarteter Fehler: AMQJS0012E Ungültiger Objekttyp für Port.
bei new Client (paho-mqtt.min.js:62)
bei MQTTconnect (pcp-code.js:17)
bei run (debugpaho:133)
bei HTMLDocument. (debugpaho:137)
at l (jquery.min.js:2)
at c (jquery.min.js:2)
mqtt = new Paho.Client("wss://key:[email protected]");
Verwirrenderweise werden wir hier aufgefordert, einen Port anzugeben. Vielleicht ist der Abgleich für eine vollständige URI durch den Abgleich für einen abschließenden Schrägstrich nach dem Hostnamen als gut?
mqtt = new Paho.Client("wss://key:[email protected]/mqtt", 443);
jquery.min.js:2 Unerwarteter Fehler: AMQJS0013E Ungültiges Argument 443 für clientId.
WebSocket-Verbindung zu 'wss://key:[email protected]/mqtt' fehlgeschlagen: Fehler beim WebSocket-Handshake: Unerwarteter Antwortcode: 403
Schließlich ist dies ein korrekter Weg, um sich mit Paho über MQTT zu verbinden. Der Fehlercode ist darauf zurückzuführen, dass das Backend nicht wie erwartet funktioniert (dies ist kein Problem, das auf Paho zurückzuführen ist).