LoRaWAN UDP Packet Forwarder 1
17.12.2024
Elektronik | Funk | Software
Der Technik-Blog
Das ESP32 LoRa Board von Heltec ist sehr vielseitig einsetzbar. Das besondere an dem Board ist vor allem die verbaute LoRa-Technologie und die sehr guten Reichweiten von LoRa. LoRa kann hier sowohl im Direct-Mode (z.B. von ESP32 zu ESP32) als auch in verschiede LoRaWAN-Netzwerke wie beispielsweise das TTN kommunizieren. Grundsätzlich werden hier alle LoRaWAN Standards unterstützt, da dies primär nur an der Software liegt. In diesem Artikel geht es um die Kommunikation mit dem ESP32 zum LoRaWAN Netzwerk TTN im ABP-Mode.
Verwendete Library: Arduino LMIC (von MCCI Catena) | Version 3.2.0
Damit der ESP32 mit TTN kommunizieren kann, wird neben dem Board selbst nur noch ein Gateway mit entsprechender Verbindung zum TTN-Netzwerk benötigt. Ein eigenes LoRaWAN Gateway ist nicht unbedingt erforderlich, da die Software mit allen LoRaWAN Gateways, die zu TTN kommunizieren, kompatibel ist. Aber Achtung: Aus der Praxis ist bekannt, dass nicht immer alles mit LoRa sofort und einwandfrei funktioniert. Für die Fehlersuche ist daher ein eigenes Gateway sehr zu empfehlen, da man durch Zugriff auf diese Hardware sehr viele wertvolle Informationen bekommt, die bei der Fehlersuche sehr hilfreich sind. Außerdem kann man dadurch auch feststellen, ob die Datenpakete überhaupt beim TTN-Network-Server ankommen. Für dieses Projekt wurde das Gateway vom Artikel Einrichtung Dragino LG-02 LoRaWAN Gateway mit den dort beschriebenen Einstellungen verwendet.
Neben ABP gibt es bekanntlich auch das OTAA verfahren, um sich am LoRaWAN Netzwerk anzumelden bzw. Daten zu senden. Das OTAA-Verfahren ist sicherer als ABP, allerdings auch "komplizierter". ABP benötigt keinen JOIN-Request um am LoRaWAN teilzunehmen. Es wird keine bidirektionale Verbindung aufgebaut, was bedeutet, dass die maximale Kompatibilität erreicht wird und somit auch jedes Single Channel Gateway die Daten empfangen und weiterleiten kann. Die Sendefrequenz und alle zugehörigen Parameter werden fest eingestellt und können nur am Gerät selbst geändert werden und nicht von TTN bzw. über die ADR. Der größte Vorteil ist daher die einfachere Kommunikation und die höchste Kompatibilität mit den Gateways. Da in der Regel nur Sensordaten übertragen werden, die nicht vertraulich sind, ist die Sicherheit bei ABP ausreichend. Der ESP32 und die in diesem Artikel verwendete Software/Library ist selbstverständlich auch mit OTAA kompatibel und kann entsprechend umprogrammiert werden.
Für LoRaWAN gibt es sehr viele Librarys, ein Großteil davon ist eine Weiterentwicklung oder Modifikation der originalem LMIC Library. Die originale LMIC Library besteht wiederum aus Entwicklungen von IBM und ermöglicht die Kommunikation mit der LoRa-Hardware und LoRaWAN. Der Code wurde dann weiterentwickelt und für das TTN sowie für den Arduino kompatibel gemacht. Die LMIC Repository wird nicht mehr gewartet und gilt somit als veraltet. Sowohl von TTN als auch von den Entwicklern dieser Bibliothek wird die MCCI-Library als die Alternative mit der größten Kompatibilität empfohlen. Die MCCI-Library dient auch für dieses Projekt als Basis und wird entsprechend für den Einsatz am ESP32 LoRa Board angepasst. Generell besteht diese und auch alle anderen Librarys, die auf der LMIC-Library basieren, grundsätzlich aus den folgenden großen Teilkomponenten:
Hardware Controller: Ein wesentlicher Bestandteil der Software ist die richtige Ansteuerung der Hardware. Dazu gehört die Ansteuerung des LoRa-Chips sowie die Steuerung von SPI und weiteren Pins.
LoRaWAN & TNN: LoRa selbst ist nur die physikalische Schnittstelle, also die Datenübertragung per Funk. LoRaWAN nutzt diese Funktechnologie, aber dahinter befindet sich nur Software. Damit LoRaWAN funktioniert, wird ein Netzwerk benötigt, dass sich um die Decodierung/Encodierung, das Routing und die Weitergabe der Daten aus dem LoRaWAN Netzwerk kümmert. TTN (The Things Network) ist wohl das bekannteste und größte, aber nicht einzige LoRaWAN-Netzwerk. Der Mikrocontroller muss dafür die Daten in bestimmten Formaten und Schlüsseln bereitstellen, damit die Kommunikation zu den Gateways und den LoRaWAN Netzwerk funktioniert. Auch das ist Aufgabe der Library.
AES Verschlüsselung: LoRa setzt hauptsächlich auf eine AES-Verschlüsselung. Es ist ein symmetrisches Verschlüsselungsverfahren, was bedeutet, dass die Schlüssel zur Verschlüsselung und Entschlüsselung auf beiden Seiten gleich sind. Aufgabe der Library ist es, sämtliche Schüssel so zu berechnen, dass diese auch vom Netzwerk wieder entschlüsselt werden können. Der wichtigste Schlüssel ist der Application-Key bzw. App-Session-Key, denn dadurch werden die Daten vom Endgerät bis zur Applikation verschlüsselt und sind von einem Gateway oder anderen Systemen dazwischen nicht lesbar. AES gilt grundsätzlich als recht sicher und ist eine gute Basis für die Sicherheit bei IoT-Geräten.
Da die Library grundsätzlich für den Einsatz am Arduino vorgesehen ist, funktioniert diese am ESP32 nicht sofort. Das Hauptproblem dafür ist die unterschiedliche Pinbelegung der Schnittstellen und IO-Pins zwischen Arduino und ESP. Das Heltec ESP32 LoRa (V2) Board hat zum LoRa-Chip folgende Pinbelegung:
Bezeichnung | Pin am ESP32 |
---|---|
SCK | 5 |
MISO | 19 |
MOSI | 27 |
Bezeichnung | Pin am ESP32 |
---|---|
NSS | 18 |
DIO 0 | 26 |
DIO 1 | 35 |
DIO 2 | 34 |
RST | 14 |
Eine sehr wichtige Einstellung an der Library ist die Anpassung an das Europäische Frequenzband. Im Hauptordner der Library befinde sich ein weiterer Ordner mit "project_config". In diesem Ordner befindet sich die Konfigurationsdatei " lmic_project_config.h". Hier wird die zweite Zeile (#define CFG_eu868 1) auskommentiert. Die darunterliegende Zeile wird kommentiert (//#define CFG_us915 1) . Die Library arbeitet ab sofort im EU-Frequenzband auf 868 mHz.
// project-specific definitions #define CFG_eu868 1 //#define CFG_us915 1 //#define CFG_au915 1 //#define CFG_as923 1 //#define LMIC_COUNTRY_CODE LMIC_COUNTRY_CODE_JP /* for as923-JP */ //#define CFG_kr920 1 //#define CFG_in866 1 #define CFG_sx1276_radio 1 //#define LMIC_USE_INTERRUPTS
Damit die Software richtig funktioniert, werden einige Schlüssel benötigt. Die Schlüssel können teilweise selbst generiert werden. Am einfachsten ist es, wenn man die Schlüssel für das jeweilige Gerät automatisch von TTN erzeugen lässt und in den Beispielcode einfügt. Da die Einrichtung für alle Development Boards (Arduino, ESP32, TTGO etc.) gleich ist, gibt es am Blog einen weiteren ausführlichen Artikel über die Einrichtung bei TTN (ABP-Mode).
Als Basis wird der in der Library mitgelieferte ABP-Beispielcode verwendet. Da die Software für den Betrieb am Arduino vorgesehen ist, müssen einige Hardware Pins in der Software geändert werden. Außerdem muss das Gerät vorab schon bei TTN registriert sein, damit alle Schlüssel in den Beispielcode integriert werden können. Als Payload wird der Zeichensatz "Hello World!" übertragen.
1. Anpassen der Keys
Damit die Kommunikation zu TTN im ABP-Mode funktioniert, werden drei Schlüssel benötigt. Die Schlüssel NWKSKEY, APPSKEY und DEVADDR werden in den oberen Zeilen vom Beispielcode eingefügt bzw. bearbeitet. Hier ein Beispiel:
static const PROGMEM u1_t NWKSKEY[16] = { 0x1D, 0x1A, 0x15, 0x1F, 0x38, 0x03, 0xC0, 0xA1, 0x7C, 0xA7, 0xAC, 0x0C, 0x4A, 0x49, 0x3B, 0x2B }; static const u1_t PROGMEM APPSKEY[16] = { 0xEC, 0x19, 0x82, 0xA2, 0xC7, 0x2D, 0xFC, 0x42, 0xD7, 0x35, 0xB8, 0x3E, 0xFE, 0xC0, 0x0F, 0xFE }; static const u4_t DEVADDR = 0x260121A4;
2. LoRa Chip Pin Mapping
Neben den seriellen Kommunikationsleitungen (SPI) hat der LoRa-Chip am ESP32 noch weitere digitale I/O-Pins (DIOs, RST...), die für die Ansteuerung notwendig sind. Der folgende Ausschnitt ist auf die LoRa-Pins an das ESP32 LoRa Board V2 bereits angepasst und kann direkt im Beispielcode ersetzt werden:
const lmic_pinmap lmic_pins = { .nss = 18, .rxtx = LMIC_UNUSED_PIN, .rst = 14, .dio = {26, 34, 35}, };
3. SPI Pins ändern
Wie bereits erwähnt ist die ursprüngliche Library für Arduino Boards entwickelt worden. Da der Arduino nur eine SPI-Schnittstelle mit fixen Pins hat, müssen diese Pins am ESP32 entsprechend angepasst werden. Die folgende Zeile wird direkt in die nächste Zeile nach "void steup(){" kopiert.
void setup() { SPI.begin(5, 19, 27, 18); ....
Der Controller weiß jetzt, über welche Pins eine SPI-Verbindung aufgemacht werden muss und wie der LoRa Chip darüber anzusprechen ist.
Der Beispielcode sendet standardmäßig jedes Datenpaket auf einem anderen Kanal aus. Insgesamt stehen 8+1 Kanäle zur Verfügung. Begonnen wird mit der Aussendung auf Kanal 0. Im nächsten Durchgang wird ein weiteres Datenpaket auf Kanal 1 ausgesendet. Nach acht Aussendungen beginnt die Software wieder bei Kanal 0. Die 8-Kanal LoRa Gateways haben mit dem ständigen Frequenzwechsel keine Probleme. Wer jedoch mit einem Single -Channel Gateway arbeitet, wird nur jedes achte Datenpaket empfangen. Fügt man im Code folgende Zeilen ein, kann man die Aussendung auf einen Kanal beschränken:
//Add this lines inside void setup(): //LMIC_disableChannel(0); LMIC_disableChannel(1); LMIC_disableChannel(2); LMIC_disableChannel(3); LMIC_disableChannel(4); LMIC_disableChannel(5); LMIC_disableChannel(6); LMIC_disableChannel(7); LMIC_disableChannel(8);
Hinweis: In diesem Beispiel wird nur auf Kanal 0 (868.100 MHz @ SF7) gesendet.
Wird der Frame Counter Check in TTN aktiviert, so muss sichergestellt werden, dass der Frame Counter nach einem Reset oder Stromausfall im Controller aktuell bleibt. Der Counter könnte bei jedem Sendevorgang im EEPROM bzw. Flash abgespeichert werden und während den Startvorgang des Controllers wieder aus dem Speicher ausgelesen werden. Über folgende Zeilen kann der Frame Counter (im Zwischenspeicher des Controllers) überschrieben werden:
//Change Xup, Xdown with your own values LMIC.seqnoUp = Xup; //Uplink Counter LMIC.seqnoDn = Xdown; //Downlink Counter
Hinweis: Datentyp ist Integer
Über den Debug-Modus werden im Serial Monitor sehr viele Informationen zum aktuellen Status ausgegeben. Dies ist vor allem für die Überwachung und Fehlersuche ein sehr nützliches Feature. Dazu muss in der Datei "lmic_project_config.h" (siehe Frequenzband Einstellung) folgende Zeile eingefügt werden:
#define LMIC_DEBUG_LEVEL 2
TTN zeigt die Payload als hexadezimale Byte Array an. Jedes übertragene Zeichen wird in einem hexadezimalen Zahlenpaar dargestellt. Der folgende Decoder wandelt die hexadezimalen Bytes entsprechend ASCII-Codierung in einen Klartext-String um:
function Decoder(bytes, port) { return { myTestValue: String.fromCharCode.apply(null, bytes) }; }
Der vollständige Beispielcode für dieses Projekt befindet sich hier.
Einstieg in das LoRaWAN (TTN) mit dem Heltec LoRa32 V3 und Einrichtung vom Board in der Arduino IDE
WeiterlesenStarthilfe LoRaWAN - Diese Seite richtet sich an alle Einsteiger, die mit LoRaWAN starten wollen und ihre Sensoren in das IoT-Netzwerkt TTN integrieren wollen
WeiterlesenAEQ-WEB © 2015-2024 All Right Reserved