manière correcte d'instancier le client Paho en JavaScript pour wss (secure websocket)

La documentation de Paho est malheureusement assez fragmentée pour le moment, et certains liens sur le site d'Eclipse ne fonctionnent pas.

Voici quelques liens qui fonctionnent (à partir de 05/2019) :

Et voici un site web fantastique de Steve :

Il y a un changement de rupture important dans l'espace de noms Paho, où vous aurez des problèmes en utilisant le code de Steve :

"Auparavant, le Namepsace du client était Paho.MQTTÀ partir de la version 1.1.0 (branche de développement), cela a été simplifié en Paho. Vous devriez être en mesure de faire une recherche et un remplacement dans votre code pour résoudre ce problème, par exemple toutes les instances de Paho.MQTT.Client sera désormais Paho.Client et Paho.MQTT.Message sera Paho.Message." (comme vu sur GitHub)

Comme le dit le texte, utilisez Paho.Client au lieu de Paho.MQTT.Client et Paho.Message au lieu de Paho.MQTT.Message.

Un autre problème auquel j'ai été confronté est l'incapacité du client à se connecter sur wss:// (secure websockets). Vous devez utiliser une syntaxe spéciale pour cela.

TL;DR forcer WSS avec Paho :

La syntaxe est la suivante :

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

Notez que nous ne transmettons PAS de port. Le port est optionnel et doit être défini comme faisant partie de l'URI. Remplacez le key:[email protected] avec votre propre URL. /mqtt est par défaut, et également configuré sur VerneMQ pour les websockets de cette façon.

L'identifiant du client doit être une chaîne de caractères.

Erreurs

Voici quelques mauvais ( !) des échantillons de code et les erreurs que vous y rencontrerez :

La page 'https://picockpit.local/debugpaho' a été chargée via HTTPS, mais a tenté de se connecter à l'extrémité WebSocket non sécurisée 'ws://picockpit.local:443/mqtt'. Cette requête a été bloquée ; ce point d'accès doit être disponible via WSS.

C'est le moment où vous supposez que Paho détectera automatiquement le bon protocole pour vous, si vous chargez sur HTTPS. Il ne le fera pas. Vous devez passer un URI à Paho.Client (voir ci-dessus).

L'URL 'ws://[wss://picockpit.local/mqtt]:0' est invalide. Erreur : Impossible de construire 'WebSocket' : L'URL 'ws://[wss://picockpit.local/mqtt]:0' n'est pas valide.

C'est quand vous essayez de passer tous les paramètres - omettez tous les autres paramètres, passez juste le clientid (une chaîne). (J'ai essayé de mettre le port à 0 car je pensais qu'il serait ignoré).

Exception jQuery.Deferred : Impossible de lire la propriété 'Client' d'undefined TypeError : Impossible de lire la propriété 'Client' d'undefined

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

Cela se produira si vous ne remplacez pas Paho.MQTT.Client par Paho.Client comme conseillé ci-dessus.

jquery.min.js:2 Uncaught Error : AMQJS0012E Invalid type object for port.

au nouveau client (paho-mqtt.min.js:62)

à MQTTconnect (pcp-code.js:17)

à l'exécution (debugpaho:133)

at HTMLDocument. (debugpaho:137)

à l (jquery.min.js:2)

at c (jquery.min.js:2)

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

Ce qui est déroutant, c'est qu'il nous demande de passer un port. Peut-être que la recherche d'un URI complet se fait également par la recherche d'une barre oblique après le nom d'hôte ?

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

jquery.min.js:2 Uncaught Error : AMQJS0013E Invalid argument 443 for clientId.

La connexion WebSocket à 'wss://key:[email protected]/mqtt' a échoué : Erreur lors de l'établissement de la connexion WebSocket : Code de réponse inattendu : 403

Finalement, voici une façon correcte de se connecter à Paho via MQTT. Le code d'erreur est dû au fait que le backend ne fonctionne pas comme prévu (ce n'est pas un problème dû à Paho).