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):
- https://www.eclipse.org/paho/clients/js/
- https://www.eclipse.org/paho/files/jsdoc/index.html
- https://github.com/eclipse/paho.mqtt.javascript
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.MQTT
A 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).