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):

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.MQTTa 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).