forma correcta de instanciar el cliente Paho en JavaScript para wss (websocket seguro)

Lamentablemente, la documentación de Paho está bastante fragmentada en este momento, y algunos enlaces del sitio web de Eclipse no funcionan.

Aquí hay algunos enlaces que funcionan (a partir de 05/2019):

Y aquí hay una fantástica página web de Steve:

Hay un importante cambio de ruptura en el espacio de nombres Paho, donde se encontrará con problemas al utilizar el código de Steve:

"Anteriormente el Namepsace del cliente era Paho.MQTTA partir de la versión 1.1.0 (rama de desarrollo) se ha simplificado a Paho. Debería poder simplemente hacer una búsqueda y reemplazo en su código para resolver esto, por ejemplo, todas las instancias de Cliente Paho.MQTT ahora será Paho.Cliente y Paho.MQTT.Message será Paho.Mensaje." (como se ve en GitHub)

Como dice el texto, utilice Paho.Client en lugar de Paho.MQTT.Client y Paho.Message en lugar de Paho.MQTT.Message.

Otro problema al que me enfrenté fue la incapacidad del cliente para conectarse en wss:// (websockets seguros). Es necesario utilizar una sintaxis especial para ello.

TL;DR forzando WSS con Paho:

La sintaxis es:

mqtt = new Paho.Client("wss://key:[email protected]/mqtt", "clientid");

Tenga en cuenta que NO pasamos ningún puerto. El puerto es opcional y tiene que ser establecido como parte del URI. Reemplace el key:[email protected] con su propia URL. /mqtt es el predeterminado, y también está configurado en VerneMQ para los websockets de esa manera.

El identificador del cliente debe ser una cadena.

Errores

Aquí hay algunos equivocada (!) muestras de código y los errores con los que se encontrará en ellas:

La página en 'https://picockpit.local/debugpaho' fue cargada sobre HTTPS, pero intentó conectarse al punto final inseguro de WebSocket 'ws://picockpit.local:443/mqtt'. Esta solicitud ha sido bloqueada; este punto final debe estar disponible a través de WSS.

Esto es cuando usted asume que Paho autodetectará el protocolo correcto para usted, si usted carga sobre HTTPS. No lo hará. Tienes que pasar una URI a Paho.Client (ver arriba).

La URL 'ws://[wss://picockpit.local/mqtt]:0' no es válida. Error: Fallo en la construcción de 'WebSocket': La URL 'ws://[wss://picockpit.local/mqtt]:0' no es válida.

Esto es cuando intentas pasar todos los parámetros - omite todos los otros parámetros, sólo pasa el clientid (una cadena). (Intenté poner el puerto a 0 ya que pensé que sería ignorado).

Excepción jQuery.Deferred: Cannot read property 'Client' of undefined TypeError: No se puede leer la propiedad 'Client' de undefined

mqtt = new Paho.MQTT.Client(uri, 0, "", "myclientid");

Esto ocurrirá si no sustituye Paho.MQTT.Client por Paho.Client como se aconseja más arriba.

jquery.min.js:2 Error no detectado: AMQJS0012E Objeto de tipo inválido para el puerto.

en new Client (paho-mqtt.min.js:62)

en MQTTconnect (pcp-code.js:17)

en la ejecución (debugpaho:133)

at HTMLDocument. (debugpaho:137)

en l (jquery.min.js:2)

en c (jquery.min.js:2)

mqtt = new Paho.Client("wss://key:[email protected]");

Confusamente, esto nos dice que pasemos un puerto. Tal vez la coincidencia de un URI completo es por la coincidencia de una barra final después del nombre de host también?

mqtt = nuevo Paho.Client("wss://key:[email protected]/mqtt", 443);

jquery.min.js:2 Error no detectado: AMQJS0013E Argumento no válido 443 para clientId.

La conexión WebSocket a 'wss://key:[email protected]/mqtt' ha fallado: Error durante el handshake de WebSocket: Código de respuesta inesperado: 403

Finalmente, esta es una forma correcta de conectarse a Paho vía MQTT. El código de error se debe a que el backend no funciona como se espera (no es un problema debido a Paho).