Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

IMPORTANTE: As mensagens enviadas via MQTT são limitadas a 32Kb. Caso a mensagem ultrapasse esse limite, ela será rejeitada pelo broker.

Envio MQTT via Javascript:

para enviar dados para a plataforma via Javascript, em geral aplicações que rodam como servidores (Node.js) ou cliente (dentro do browser) podem conectar-se diretamente a plataforma usando MQTT.

Vale ressaltar que há duas opções ao utilizar  bibliotecas MQTT em Javascript: as que falam TCP nativamente ou outras que utilizam Websockets. 

A plataforma da Konker na nuvem suporta conexões TCP diretamente – portanto soluções usando Websocket precisam utilizar um proxy para poder funcionar adequadamente.

vamos ver as diferenças entre elas.

<TODO>

nesse caso é necessário rodar um proxy websocket – um simples e rápido de executar é o websocketify, (https://hub.docker.com/r/efrecon/websockify) que pode ser instanciado via Docker da seguinte maneira:

docker run -it --rm -p 8080:80 --name websockify efrecon/websockify 80 mqtt.demo.konkerlabs.net:1883
dessa forma ele criará um proxy para o cliente websocket se conectar via a plataforma de forma transparente, recebendo conexões em 127.0.0.1:8080 e redirecionando para o endereço mqtt.demo.konkerlabs.net:1883.
NOTA: se você for rodar esse websocket em produção é recomendável que utilize um servidor (DigitalOcean, AWS, Azure, ...) rodando o websocketify, com opções de segurança ativa (filtros, etc) ara permitir sua conexão. 
feito isso é necessário aplicar um patch no código fonte-original do client do paho-mqtt para que ele funcione adequadamente com o webproxy – de forma com que ele consiga estabelecer conexões de protocolo binário (e não apenas mqtt ou mqttv1.3 que é o  seu padrão) 1 conforme descrito abaixo... o código fonte original da biblioteca pode ser encontrado em https://www.eclipse.org/paho/clients/js/ nessa versão 1.1.0 ... pode-ser aplicar o seguinte patch .
(...) na linha 1050 há a definição do protocolo a ser utilizado pela biblioteca ... usar o binario para funcionar adequadamente com o websocket proxy 
var wsType = 'binary';


if (this.connectOptions.mqttVersion < 4) {
this.socket = new WebSocket(wsurl, [wsType]);// ["mqttv3.1"]);
} else {
this.socket = new WebSocket(wsurl, [wsType]);// ["mqtt"]);
}
(...)
feito isso basta utilizar a classe Paho.Client (antiga Paho.MQTT.Client) para estabelecer a conexão e fazer o envio dos dados ... 
NOTA1: é necessário que o payload enviado seja um JSON serializável ... não fazer dessa forma implica em que a mensagem não será ingerida na plataforma adequadamente.
NOTA2: é necessário utilizar essa bilbioteca alterada para que a conexão funcione ... senão receberá um erro "code 400, message Client must support 'binary' or 'base64' protocol"
feito isso o código abaixo funciona adequdamente – apenas garanta que o servidor onde o Paho.Client se conecta é o mesmo servidor onde você configurou o seu websocketify 

<html>
<head>
<script src="./paho-mqtt.js" type="text/javascript"></script>
<script type="text/javascript" language="javascript">

// Create a client instance
var client = new Paho.Client('127.0.0.1', 8080, '', "paho sample client");

// set callback handlers
client.onConnectionLost = onConnectionLost;
client.onMessageArrived = onMessageArrived;

// connect the client
var username = '<PLACE USERNAME GENERATED BY KONKER PLATFORM FOR THIS DEVICE>';
var password = '<PASSWORD GENERATED BY KONKER PLATFORM>';
// TODO-REMOVE THIS
//
client.connect({userName: username, password: password, onSuccess:onConnect, onFailure:doFail});
// TO ENABLE TRACING ...
// client.startTrace();

function doFail() {
console.log('FAIL');
}

// called when the client connects
function onConnect() {
// Once a connection has been made, make a subscription and send a message.
console.log("onConnect");
// subcribe to a channel
client.subscribe("data/"+username+"/pub/sample");

// TYPE #1: sending a message using Message object ...
// send a message using Paho.Message object ...
// IMPORTANT: the content of the message should be a VALID JSON ...
// most efficient way to create is generate an Object / dictionary / Map and generate a JSON.stringify() from it
// * MUST define a topic or destinationName
//
message = new Paho.Message(JSON.stringify({data:new Date()}));
message.topic = "data/"+username+"/pub/sample";
//
client.send(message);

// client.send(message);
// TYPE #2: send a message using direct interface ...
//
client.publish("data/"+username+"/pub/sample", JSON.stringify({dt: new Date()}));

// logging

console.log('PAHO TRACKING');
console.log(client.getTraceLog());
}

// called when the client loses its connection
function onConnectionLost(responseObject) {
if (responseObject.errorCode !== 0) {
console.log("onConnectionLost:"+responseObject.errorMessage);
}
}

// called when a message arrives
function onMessageArrived(message) {
console.log("onMessageArrived:"+message.payloadString);
}
</script>
</head>
<body>
</body>
</html>
 1 há alguns posts relacionados a esse "bug" que podem ser encontrados em https://github.com/eclipse/paho.mqtt.javascript/issues/57

(Opcional) Enviando dados com Geolocalização

...