3. LoRaWAN – Codec/Decode para datos en tramas

Los datos de sensor/acción se ordenan en una trama LoRa en forma de bytes antes de la transmisión. Se pretende minimizar la cantidad de bytes usados por mensaje, siguiendo la directiva LoRa de mensajes de corta duración.

Un mensaje se puede simplificar, por ejemplo un «ON»/»OFF» presentado en LoRa puede ser 1 «o» 0, que es tan solo un bit. Los mensajes se administran por ChirpStack y los puede traducir nuevamente en mensajes «ON»/»OFF» para ser actualizados en un Broker como Home Assistant.

Un ejemplo básico de instrucciones para un dispositivo genérico permite presentar el uso de librerías LoRaWAN de HELTEC.

Trama de datos en dispositivo

Los datos son enviados en una trama como un tren de bits escritos en orden. Por ejemplo, en el dispositivo se tiene los valores de contador1, contador2 y unalectura como datos a ser transmitidos, por lo que se plantea el siguiente esquema:

Las instruciones en el IDE arduino para el ejemplo de la trama de datos Sigue el mismo orden.

byte    contador1 = 0;
uint8_t contador2 = 0;  
int unalectura = 221;

static void prepareTxFrame( uint8_t port ){
    contador1 = contador1 + 1;
    contador2 = contador2 - 1;

    //orden de trama
    appDataSize = 4         //AppDataSize max value is 64
    appData[0] = contador1; //0x01;
    appData[1] = contador2;
    appData[2] = highByte(unalectura);
    appData[3] = lowByte(unalectura);

    // mostrar en puerto USB
    Serial.println(contador1);
    Serial.println(contador2);
    Serial.println(unalectura);
}

En casos particulares hay que ajustar la trama de acuerdo a las lecturas de sensores o información que se requiera transmitir

Trama de datos en ChirpStack application – server

La trama de datos llega en binario hasta el componente application-server y de forma predeterminada se presenta en formato Base64.

Para leer los datos se puede usar el convetidor en línea o utilizar un decodificador/codificador con instrucciones en JavaScript.

https://v2.cryptii.com/base64/decimal

En ChirpStack en la sección Device-profiles/codec se puede escribir un decodificador para la trama de datos y reconstruirlo en la forma con las variables originales.

para el ejemplo presentado y siguiendo el esquema inicial, las instrucciones en JavaScript son:

function Decode(fPort, bytes, variables) {
	var contador1 = bytes[0];
  	var contador2 = bytes[1];
  	var unalectura = (bytes[2] << 8) |(bytes[3]);
  var appData = {'contador1':contador1, 'contador2':contador2, 'unalectura': unalectura}
  return appData;
}

Con lo que en Chirpstack se obtiene para datos del dispositivo de una trama en particular:

Referencia: https://heltec-automation-docs.readthedocs.io/en/latest/general/decode_payload.html

Trama de datos en MQTT-Mosquitto

Para capturar los datos en un broker, por ejemplo Home Assistant, se puede usar el mensaje MQTT del application-server. Es posible leer las tramas MQTT de application-server o integrar las plataformas entre si por medio de «integration»

Lecturas de mensajes MQTT

Para observar la estructura del mensaje se realiza una subscripción al mensaje MQTT de la aplicación para un dispositivo:

mosquitto_sub -v -h localhost -p 1883 -t 'application/1/device/#'

y se obtiene los datos decodificados por JavaScript:

Con lo que se puede proceder a incorporar la instrucción en Home-Assistant.

Referencia: TTN – Optimizacion Payload.pdf , https://github.com/akirasan/TTN_LoRaWAN