Versions Compared

Key

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

...

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

...

 - Rest Transformations

 - Routes

 - Users


Usando um Gateway de dados

Com um Gateway é possivel gerenciar as mensagens de vários dispositivos, não sendo necessário guardar as credenciais individualmente de cada um deles:

...

Tipo

URI

Definição

Authorização

Body (exemplo)

Response (exemplo)

GET

/v1/{ID_APLICACAO}/gateways

Recupera a lista de Gateways

Oauth2 (application flow)


Code: 200

{ "timestamp": 1520617039, "code": 200, "status": "success", "result": [ { "name": "GatewayGPSDev", "description": "Gateway For GPS Dev", "locationName": "default", "active": true, "guid": "238f99d1-ab4c-4cde-9fe2-439b1ad6fbc9" }]},

POST
/v1/{ID_APLICACAO}/gateways
Registra um GatewayOauth2 (application flow){
  "name": "Gateway002",
  "description": "simple",
  "locationName": "default",
  "active": true
}

Code: 201

{ "timestamp": 1520616086, "code": 201, "status": "success", "result": { "name": "Gateway002", "description": "gateway 002", "locationName": "default", "active": true, "guid": "36fd3679-fab0-4dff-ae93-84234893b3e6" } }

DELETE/v1/{ID_APLICACAO}/gateways/{GATEWAY_GUID}Remove um GatewayOauth2 (application flow)

Code: 204

GET/v1/{ID_APLICACAO}/gateways/{GATEWAY_GUID}Recupera um GatewayOauth2 (application flow)

Code: 200

{ "timestamp": 1520617039, "code": 200, "status": "success", "result": { "name": "GatewayGPSDev", "description": "Gateway For GPS Dev", "locationName": "default", "active": true, "guid": "238f99d1-ab4c-4cde-9fe2-439b1ad6fbc9" }},

PUT/v1/{ID_APLICACAO}/gateways/{GATEWAY_GUID}Atualiza um GatewayOauth2 (application flow){
  "name": "Gateway002",
  "description": "theupdate",
  "locationName": "default",
  "active": true
}

Code: 200

{ "timestamp": 1520617039, "code": 200, "status": "success", "result": { "name": "GatewayGPSDev", "description": "Gateway For GPS Dev", "locationName": "default", "active": true, "guid": "238f99d1-ab4c-4cde-9fe2-439b1ad6fbc9" }},

GET/v1/{ID_APLICACAO}/gateways/{GATEWAY_GUID}/tokenSolcita um token de acessoOauth2 (application flow)

Code: 200

{ "timestamp": 1520617689, "code": 200, "status": "success", "result": { "access_token": "9a46f5d6-69cd-4b1f-86c8-c0c1d6163148", "token_type": "bearer", "scope": "read write" } }


Enviando mensagens de um Dispositivo através de um Gateway


Para enviar mensagens de dispositivos tirando vantagem de um gateway ( que pode ser um software ou um gateway fisico ), vamos primeiro registrar o nosso Gateway fazendo uma requisição na api da Konker:

...

Agora é possível verificar as mensagens pelo console da plataforma:


Enviando mensagens via Gateway sem a necessidade do dispositivo já existir

Agora é possível enviar mensagens para a plataforma via Gateway sem a necessidade de criar os dispositivos antes de enviar as mensagens. Com o Gateway já criado e com o token gerado conforme mostrado nos passos basta enviar os dados através do modulo de ingestão da plataforma, conforme mostrado abaixo:

...