Ir al contenido principal
Todas las coleccionesRecursos técnicos
Decodificador como servicio (DaaS) de Ubidots, SenseCap S2102 y TTS: ejemplo práctico
Decodificador como servicio (DaaS) de Ubidots, SenseCap S2102 y TTS: ejemplo práctico

La siguiente guía técnica describe cómo usar el "decodificador como servicio" (DaaS) de Ubidots utilizándolo en una aplicación real.

Sergio M avatar
Escrito por Sergio M
Actualizado hace más de 4 meses

Requisitos

  • Cualquier dispositivo que envíe datos a un Plugin o una UbiFunction en Ubidots desde cualquier servidor de red LoRaWAN.

  • La URL del repositorio en el que se encuentra el decodificador del dispositivo.

1. Comentarios preliminares

  • Si no has revisado la guía técnica anterior sobre Ubidots DaaS aún, te recomendamos encarecidamente que lo hagas.

  • Esta guía técnica utiliza un SenseCAP S2102 - Sensor de Intensidad de Luz Inalámbrico LoRaWAN que está registrado en TTS LNS, configurado para que no se realice decodificación en el lado de TTS. En otras palabras, los datos binarios sin procesar llegarán a Ubidots para usar nuestro DaaS.

2. Identificar el punto de entrada del decodificador y los argumentos que espera

  • Puede haber varias funciones diferentes definidas, por lo que necesitas identificar el punto de entrada del decodificador. Afortunadamente, la mayoría de los decodificadores están bien comentados y te dicen exactamente cuál es el punto de entrada.

  • Además, nota en la siguiente imagen que este decodificador declara e inicializa una variable bytes con datos contenidos dentro de la clave bytes en el objeto de argumentos entrantes, por lo que si el objeto entrante no tiene dicha clave, el decodificador fallará al ejecutarse desde el principio.

  • Teniendo en cuenta lo anterior, el decodificador espera un objeto como el siguiente en sus argumentos:

{
'bytes' : '01ABEDF5CD'
}

3. Construir la solicitud para usar el DaaS de Ubidots

  • Como se indica en la guía anterior, el cuerpo de la solicitud para usar el DaaS de Ubidots es un JSON como el siguiente:

{
"url": "DECODER-URL-RAW-FORMAT",
"payload": {
DECODER-EXPECTED-OBJECT
},
"function": "DECODERS-ENTRY-POINT"
}

Dónde:

Llave

Valor

url

La URL del repositorio que aloja el decodificador.

payload

Un objeto que coincida con el esperado por el decodificador.

function

El nombre de la función principal o punto de entrada del decodificador.

Teniendo eso en cuenta, el cuerpo de una solicitud para usar el DaaS de Ubidots en el SenseCAP S2102 - Sensor de Intensidad de Luz Inalámbrico LoRaWAN debería verse así:

{
"url": "https://raw.githubusercontent.com/Seeed-Solution/TTN-Payload-Decoder/master/decoder_new-v3.js",
"payload": {
'bytes' : '01ABEDF5CD' (A hex string)
},
"function": "decodeUplink"
}

Dirígete al plugin que recibe los datos y ve a su sección de decodificador. Luego, en el editor de código, haz lo siguiente:

Importa la biblioteca requerida para emitir la solicitud HTTP:

const axios = require('axios');

Define e inicializa la URL del decodificador y el punto de entrada:

const decoderURL = 'https://raw.githubusercontent.com/Seeed-Solution/TTN-Payload-Decoder/master/decoder_new-v3.js';
const decoderEntryPoint = 'decodeUplink';

Declara la función para emitir la solicitud al endpoint del DaaS de Ubidots:

async function DaaS(decoderURL, entryPoint, payloadToDecode, ubidotsToken)
{
var headers = {"X-Auth-Token": ubidotsToken, "Content-Type": "application/json"};

var payload =
{
"url" : decoderURL,
"payload" : payloadToDecode,
"function" : entryPoint
}

var options =
{
"method" : 'post',
"url" : 'http://functions.ubidots.com/pub/decode/custom',
"data" : payload,
"json" : true,
"headers" : headers,
};

const req = await axios.request(options);
return req.data.decoded;

}

Declara la función para construir una carga útil compatible con Ubidots a partir de la que devuelve el decodificador del dispositivo. Para este ejemplo en particular, puedes encontrar dicha función en otra de nuestras guías técnicas. Si estás usando otro dispositivo, necesitas saber qué objeto devuelve el decodificador del dispositivo para formatearlo a un JSON compatible con Ubidots.

function buildUbidotsPayload(args) 
{
var ubidotsPayload = {};
var messages = args.data.messages;
var varLabelMap =
{
4097:"air-temperature",
4098:"air-humidity",
4099:"light-intensity",
4100:"CO2-concentration",
4102:"soil-temperature",
4103:"soil-humidity",
4108:"soil-electrical-conductivity",
};
messages.forEach(msg =>
{
if (msg.hasOwnProperty("measurementId"))
{
ubidotsPayload[varLabelMap[msg.measurementId]] = msg["measurementValue"];
}
});

return ubidotsPayload;
}


Declara la función principal:

async function formatPayload(args)
{
var ubidotsToken = args._parameters.token;
var incomingBinaryData = args.uplink_message.decoded_payload.payload;
var decodedData = await DaaS(decoderURL,decoderEntryPoint, {"bytes" : Buffer.from(incomingBinaryData,'hex')},ubidotsToken);
var ubidotsaPyload = buildUbidotsPayload(decodedData);
return ubidotsaPyload;
}


Por último, el decodificador del plugin completo debería verse así:

const axios = require('axios');

const decoderURL = 'https://raw.githubusercontent.com/Seeed-Solution/TTN-Payload-Decoder/master/decoder_new-v3.js';
const decoderEntryPoint = 'decodeUplink';


async function formatPayload(args)
{
var ubidotsToken = args._parameters.token;
var incomingBinaryData = args.uplink_message.decoded_payload.payload;
var decodedData = await DaaS(decoderURL,decoderEntryPoint, {"bytes" : Buffer.from(incomingBinaryData,'hex')},ubidotsToken);
var ubidotsaPyload = buildUbidotsPayload(decodedData);
return ubidotsaPyload;
}

function buildUbidotsPayload(args)
{
var ubidotsPayload = {};
var messages = args.data.messages;
var varLabelMap =
{
4097:"air-temperature",
4098:"air-humidity",
4099:"light-intensity",
4100:"CO2-concentration",
4102:"soil-temperature",
4103:"soil-humidity",
4108:"soil-electrical-conductivity",
};
messages.forEach(msg =>
{
if (msg.hasOwnProperty("measurementId"))
{
ubidotsPayload[varLabelMap[msg.measurementId]] = msg["measurementValue"];
}
});

return ubidotsPayload;
}

async function DaaS(decoderURL, entryPoint, payloadToDecode, ubidotsToken)
{
var headers = {"X-Auth-Token": ubidotsToken, "Content-Type": "application/json"};

var payload =
{
"url" : decoderURL,
"payload" : payloadToDecode,
"function" : entryPoint
}

var options =
{
"method" : 'post',
"url" : 'http://functions.ubidots.com/pub/decode/custom',
"data" : payload,
"json" : true,
"headers" : headers,
};

const req = await axios.request(options);
return req.data.decoded;

}



module.exports = { formatPayload };

4. Visualización de los datos

Después de completar con éxito los pasos anteriores, tu dispositivo debería mostrarse en Ubidots con sus datos:

¿Ha quedado contestada tu pregunta?