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