modo corretto di istanziare il client Paho in JavaScript per wss (secure websocket)
La documentazione di Paho è purtroppo piuttosto frammentata al momento, e alcuni link sul sito di Eclipse non funzionano.
Ecco alcuni link funzionanti (dal 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
Ed ecco un fantastico sito web di Steve:
C'è un importante cambiamento nello spazio dei nomi Paho, dove incontrerete problemi usando il codice di Steve:
"In precedenza il Namepsace del cliente era Paho.MQTT
a partire dalla versione 1.1.0 (ramo di sviluppo) questo è stato semplificato a Paho
. Dovresti essere in grado di fare semplicemente un trova e sostituisci nel tuo codice per risolvere questo, per esempio tutte le istanze di Cliente Paho.MQTT
sarà ora Paho.Client
e Paho.MQTT.Message
sarà Paho.Messaggio
." (come visto su GitHub)
Come dice il testo, usa Paho.Client invece di Paho.MQTT.Client e Paho.Message invece di Paho.MQTT.Message.
Un altro problema che ho affrontato era l'incapacità del client di connettersi su wss:// (websockets sicuri). È necessario utilizzare una sintassi speciale per questo.
TL;DR forzando WSS con Paho:
La sintassi è:
mqtt = nuovo Paho.Client("wss://key:[email protected]/mqtt", "clientid");
Notate che NON passiamo nessuna porta. La porta è opzionale e deve essere impostata come parte dell'URI. Sostituire il key:[email protected] con il proprio URL. /mqtt è predefinito, e anche configurato su VerneMQ per i websockets in questo modo.
L'id del cliente deve essere una stringa.
Errori
Qui ci sono alcuni sbagliato (!) i campioni di codice e gli errori che vi troverete dentro:
La pagina a 'https://picockpit.local/debugpaho' è stata caricata su HTTPS, ma ha tentato di connettersi all'endpoint WebSocket insicuro 'ws://picockpit.local:443/mqtt'. Questa richiesta è stata bloccata; questo endpoint deve essere disponibile su WSS.
Questo è quando supponi che Paho rilevi automaticamente il protocollo corretto per te, se carichi su HTTPS. Non lo farà. Devi passare un URI a Paho.Client (vedi sopra).
L'URL 'ws://[wss://picockpit.local/mqtt]:0' non è valido. Errore: Impossibile costruire 'WebSocket': L'URL 'ws://[wss://picockpit.local/mqtt]:0' non è valido.
Questo è quando provi a passare tutti i parametri - ometti tutti gli altri parametri, passa solo il clientid (una stringa). (Ho provato a impostare la porta a 0 perché pensavo che sarebbe stata ignorata).
eccezione jQuery.Deferred: Impossibile leggere la proprietà 'Client' di undefined TypeError: Impossibile leggere la proprietà 'Client' di undefined
mqtt = nuovo Paho.MQTT.Client(uri, 0, "", "myclientid");
Questo accadrà se non sostituisci Paho.MQTT.Client con Paho.Client come consigliato sopra.
jquery.min.js:2 Errore non trovato: AMQJS0012E Oggetto di tipo non valido per la porta.
al nuovo cliente (paho-mqtt.min.js:62)
in MQTTconnect (pcp-code.js:17)
in esecuzione (debugpaho:133)
in HTMLDocument. (debugpaho:137)
a l (jquery.min.js:2)
in c (jquery.min.js:2)
mqtt = nuovo Paho.Client("wss://key:[email protected]");
Confusamente, questo ci sta dicendo di passare una porta. Forse la corrispondenza per un URI completo è anche la corrispondenza per una barra finale dopo l'hostname?
mqtt = nuovo Paho.Client("wss://key:[email protected]/mqtt", 443);
jquery.min.js:2 Errore inatteso: AMQJS0013E Argomento non valido 443 per clientId.
Connessione WebSocket a 'wss://key:[email protected]/mqtt' fallita: Errore durante l'handshake WebSocket: Codice di risposta inaspettato: 403
Infine, questo è un modo corretto di connettersi a Paho via MQTT. Il codice di errore è dovuto al fatto che il backend non funziona come previsto (questo non è un problema dovuto a Paho).