LoRa: Datenmanagment, encoding, decoding etc.

Hallo alle zusammen,

in einem LoRaWAN- Projekt beschäftige ich mich zurzeit mit der Auslesung eines gemultiplexten Sensorboards.
Es handelt sich dabei um eine Sensornode mit 8 Sensoren + Referenzsensor.

Die Aufgabe besteht jetzt darin, dass die Packages welche beim the things network (TTN) ankommen, mit einem footprint zu versehen, sodass ich immer sagen kann, von welcher Node welcher Sensorwert stammt.

Insgesamt werdens über 16 Nodes werden mit jeweils 8 Sensoren.

Die encodierten Sensorwerte werden standardmäßig als 16 bit werte übertragen (highbyte & lowbyte).
Die Idee ist nun die 16 bit auszureizen: Bei der Zahl 65535 sind die letzten 3 stellen (535) für den sensorwert von 0 bis 100 reserviert. Die Stelle 5 für den Sensor ( 1 bis 8 ) und 6 für die Node.

Da wir vorsehen nie mehr als 10 Nodes je Gateway einzusetzen sollte das kein Problem darstellen.

Meine Frage an euch ist:

Gibt es einen einfacheren oder anderen Weg damit umzugehen, wie ich verlässlich einen Footprint je Sensorwert "zuweisen/mitsenden" kann ?

Vielleicht hat sich der ein oder andere schon einmal mit der Frage beschäftigt, und hätte einen Tipp diesbezüglich ?

mfg Stephan

also eigentlich siehst du ja genau über die Device-ID welcher Node etwas gesandt hat.
Wenn du magst, kannst du ja in deiner Payload auch eine selbstvergebene ID mitsenden.

Ich schlage mich zwar in den Nutzdaten nicht mit einzelnen bits umher, verwende aber ein selbstgewählte Formatierung die ca so abläuft:
Ich habe verschiedene Sensortypen definiert. Jeder Node schickt nur jene Sensortypen die bei ihm installiert sind.

Das erste Byte enthält in einer Bitmap die Information, welche Felder mitgesandt werden. Wenn ich mehr als 7 Werte senden möchte, gibt es in der bitmap des ersten Bytes eine Info, dass es eine sekundäre Bitmap folgt, die aus mehreren bytes besteht. Die Nachrichten beginnen also mit 1, 1+2, oder 1+2+3 = 6bytes zur Kennung welche Nutzdaten übertragen werden. Aktuell habe ich nicht mehr als - Hausnummer - etwa 20 verschiedene Sensordaten. 6 bytes (6x8 = 48) - den 3 Bit Overhead für die Folge-Byte-Kennzeichnung geht das System also bis 44 Sensorwerte pro Nachricht, und ich könnte dann noch immer im 6. Byte das bit für eine weitere Bitmap kennzeichnen.

Die Sensordaten belegen dann den Platz gem ihrer Wertigkeit in der Bitmap und gem. einer zentralen definition wie lang sie sind - aber hier bleibe ich aktuell auf Byteebene. Dass könnte man noch einstampfen auf Bits, war mir aber der Aufwand nicht wert.
Wenn der Sensor XY nicht übertragen wird, bleibt das bit in der Bitmap auf 0, und ich belege auch keinen Platz in der Payload dafür.

Auf zentraler Seite verwende ich EINEN einzigen generellen Decoder für alle meine Nodes, der die Payload gem. Bitmap in JSON parst und an meine Applikation weitersendet. Wenn dich das interessiert, dann kann ich das mal raussuchen.

Das alles braucht man nicht zwangsweise selber machen. Du kannst dir auch z.B. Cayenne LPP ansehen. Cayenne LPP arbeitet eher nach einem TV (Tag-Value) Prinzip - das war mir zu viel Overhead und wollte ich nicht, bzw. wollte ich eben bei einer Nachricht von mehreren Feldern auch immer die Tags mitschicken. Das übernimmt bei mir eben das erste (die bis zu 6 ersten) Bitmap-Bytes.

hier z.B. zwei Unterschiedliche Nodes, du siehst die Payload - und die konvertierten Werte:

  • ok du siehst fast nichts. Naja dann evtl. abends...

Die encodierten Sensorwerte werden standardmäßig als 16 bit werte übertragen (highbyte & lowbyte).
Die Idee ist nun die 16 bit auszureizen: Bei der Zahl 65535 sind die letzten 3 stellen (535) für den sensorwert von 0 bis 100 reserviert. Die Stelle 5 für den Sensor ( 1 bis 8 ) und 6 für die Node

struct BitFeldCodierung
{
  unsigned sensor : 3;
  unsigned node   : 3;
  int      wert   : 16-2*3;
};

Da muss man nur etwas vorsichtig sein, wenn man die Daten zwischen verschiedenen Geräten austauscht. Die Anordnung im Speicher ist "implementation defined"