forma correcta de instanciar o Paho Client em JavaScript para wss (secure websocket)

A documentação Paho está, infelizmente, bastante fragmentada no momento, e alguns links no site do Eclipse não funcionam.

Aqui estão alguns links de trabalho (a partir de 05/2019):

E aqui está um site fantástico do Steve:

Há uma mudança importante no espaço de nomes Paho, onde você terá problemas usando o código do Steve:

"Anteriormente a Namepsace do Cliente era Paho.MQTTA partir da versão 1.1.0 (ramo de desenvolvimento), esta foi agora simplificada para Paho. Você deve ser capaz de simplesmente encontrar e substituir no seu código para resolver isso, por exemplo, todos os casos de Paho.MQTT.Cliente será agora Paho.Cliente e Paho.MQTT.Mensagem será Paho.Mensagem.” (como visto em GitHub)

Como o texto diz, use Paho.Client em vez de Paho.MQTT.Client e Paho.Message em vez de Paho.MQTT.Message.

Outro problema que eu enfrentei foi a incapacidade do cliente de se conectar no wss:// (secure websockets). Você precisa usar uma sintaxe especial para isso.

TL;DR forçando WSS com Paho:

A sintaxe é:

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

Note que nós NÃO passamos em nenhum porto. A porta é opcional e tem de ser definida como parte do URI. Substitua a key:[email protected] parte com o seu próprio URL. /mqtt é o padrão, e também configurado no VerneMQ para websockets dessa forma.

A identificação do cliente tem de ser um fio.

Erros

Aqui estão alguns errado (!) amostras de código e os erros com os quais se deparará:

A página em 'https://picockpit.local/debugpaho' foi carregada sobre HTTPS, mas tentou ligar-se ao inseguro terminal WebSocket 'ws://picockpit.local:443/mqtt'. Este pedido foi bloqueado; este endpoint deve estar disponível sobre o WSS.

Isto é quando você assume que Paho irá auto-detectar o protocolo correcto para si, se você carregar sobre HTTPS. Não o fará. Você tem que passar em um URI para Paho.Client (veja acima).

A URL 'ws://[wss://picockpit.local/mqtt]:0' é inválida. Erro: Falha na construção do 'WebSocket': A URL 'ws://[wss://picockpit.local/mqtt]:0' é inválida.

Isto é quando você tenta passar em todos os parâmetros - omitir todos os outros parâmetros, basta passar no clientid (uma string). (Eu tentei definir a porta para 0 como eu pensei que seria ignorada).

jQuery.excepção diferida: Não é possível ler a propriedade 'Cliente' do TipoError indefinido: Não é possível ler o imóvel 'Client' de indefinido

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

Isto acontecerá se você não substituir Paho.MQTT.Client por Paho.Client como aconselhado acima.

jquery.min.js:2 Uncaught Error: AMQJS0012E Objeto de tipo inválido para porta.

no novo Cliente (paho-mqtt.min.js:62)

em MQTTconnect (pcp-code.js:17)

at run (debugpaho:133)

em HTMLDocument. (debugpaho:137)

em l (jquery.min.js:2)

em c (jquery.min.js:2)

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

Confusamente, isto está a dizer-nos para passarmos num porto. Talvez a correspondência para um URI completo seja por uma correspondência para uma barra de reboque também após o nome da hostname?

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

jquery.min.js:2 Uncaught Error: AMQJS0013E Argumento inválido 443 para clientId.

A ligação WebSocket a 'wss://key:[email protected]/mqtt' falhou: Erro durante o aperto de mão da WebSocket: Código de resposta inesperado: 403

Finalmente, esta é uma forma correcta de se ligar ao Paho via MQTT. O código de erro é devido ao backend não funcionar como esperado (isto não é um problema devido ao Paho).