LoRaWAN-Workshop

Payload-Formater

Der Datentransfer zwischen Node und LoRaWAN-Gateways auf 868MHz kostet Resourcen. Ein wichtiger Faktor ist die Sendezeit und damit verbunden die Batterielaufzeit. Die soll so kurz wie möglich sein.

Wenn man z.B. den Stand eines einfachen Zählers und eine Zeit in Sekunden übertragen will dann wäre das so nicht optimal:

   "Zählerstand: 123;Zeit: 65"

24 Bytes kosten einfach zuviel Resourcen.

Die zwei Variablen passen binär in vier Bytes:

   "007B0041"

Die Daten sind binär mit Hexzahlen dargestellt. Die Variablenname ergeben sich aus der Stelle der jeweiligen Zahl.

Mit dem Programmbeispiel 3 werden drei Werte übertragen:

  • 16bit-Zähler
  • 8bit-Zufallszahl
  • 16bit-Zeitzähler in Sekunden

Diese drei Variablen belegen dann fünf Bytes.

Im Quellcode werden die drei Variablen belegt bzw. der Zähler hochgezählt:

zaehler++;                                       // 16bit-Zähler

mydata[ 0 ] = zaehler >> 8;           // Zahl in Sendearray ablegen

mydata[ 1 ] = zaehler & 0xFF;

mydata[ 2 ] = random( 0, 0xFF );   // Zufallszahl zwischen 00 .. FF

int laufzeit = millis() / 1000;

mydata[ 3 ] = laufzeit >> 8;            // Laufzeit des Nodes in Sekunden

mydata[ 4 ] = laufzeit & 0xFF; 

Die Bit- und Byteschieberrei dient dazu aus die Dezimalzahlen in Binärzahlen zu konvertieren. An dieser Stelle können noch weitere Operationen eingebaut werden die dann die Daten noch mehr komprimieren. So ist es z.B. möglich zwei Variable mit kleinem Wertebereich ( z.B. a = 0 .. 15 und b = 0 ..15 ) in einem Byte zusammenzufassen. Oder bis zu acht Kontakte, also je ein Bit in einem Byte zusammenzufassen.

In mydata steht dann die fertig formatierte Payload bereit zum Senden.

Beispiel:  00 1C ED 03 E3

Dieses Array wird dann an die Sendefunktion der LoRaWAN-Library übergeben und verschlüsselt ausgesendet.

Im LoRaWAN-Server sieht dann der Empfang so aus:

Entschlüsselt aber trotzdem noch nicht so richtig "lesbar" :-(

Hier kommt dann der Payload-Formatter ins Spiel. Da ist ein Programm-Script das die Bytefolgen zerlegt und die Werte den Variablen zuordnet.

Ein Payload-Formatter muss daher immer an den jeweiligen Node angepasst sein. Der Node "verknuddelt" die Daten vorm dem Versand, der Payload-Formater "entwirrt" diese nach dem Empfang wieder.

Der Programmcode befindet sich im Sketch "LoRaWAN-simplenode-3". Diesen findet man im Verzeichnis hamgroup_lorawan/code/LoRaWAN-simplenode-3.

Auch hier muss man die DevEUI und den AppKey im  Quellcode noch anpassen. Dazu kann man den schon vom Beispiel 1 eingerichteten einfachen Node nutzen und die Keys von dort einfach übernehmen. Dabei ist aber zu beachten das nur ein Node mit diesen Einstellungen aktiv ist.

Wenn man das Beispiel 3 angepasst und hochgeladen hat müssten in der TTN-Console die Aussendungen sichtbar sein.

Jetzt muss noch der passende Payload-Dekoder in der TTN-Console in dem eingerichteten Node eingetragen werden.

Den passende Payload-Dekoder kann man direkt aus dem Quellcodes des Beispiels rauskopieren. Der steht ganz unten in einem Kommentarbereich:

function Decoder(bytes, port) {

var decode = {};

decode.zaehler = ((bytes[0] << 8) | bytes[1]);

decode.zufallszahl = bytes[ 2 ];

decode.laufzeit = ((bytes[3] << 8) | bytes[4]);

decode.bytes = bytes;

return decode;

}

Dieser Payload-Formatter ist mit JavaScript geschrieben.

Der muss jetzt in den in der TTN-Konsole angelegten Node kopiert werden:

Den Formatter type auf Javascript umstellen. Dann unter "Payload formatters -> Uplink" den JavaScript-Code einfach reinkopieren.

Nach dem Speichern kann man unter Live data dann die nun hoffentlich richtig formatierte Payload sehen:

Jetzt liegen die drei Variablen in Dezimalform vor. Die Namen der Variablen sind auch entsprechend zugeordnet.

Weitere Informationen zu diesem Thema:

So funktioniert die LoRa Payload

Payload sparen im TTN

 

...

powered by webEdition CMS