User Tools

Site Tools


lets_plaiy:lorawan:start

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
lets_plaiy:lorawan:start [2026/04/27 17:16] jan.sonntaglets_plaiy:lorawan:start [2026/04/28 12:20] (current) jan.sonntag
Line 5: Line 5:
  
 ===== Was ist LoRaWAN? ===== ===== Was ist LoRaWAN? =====
 +{{pdfjs 75%,500px>:lets_plaiy:lorawan:lorawan-introduction.pdf}}
  
 ===== The Things Network ===== ===== The Things Network =====
Line 28: Line 29:
 Das Terminal werden wir auch im weiteren Teil des Workshops verwenden. Das Terminal werden wir auch im weiteren Teil des Workshops verwenden.
  
-===== Erste manuelle Tests ===== +===== Was sind AT-Befehle und wie funktionieren sie? =====
-Falls du das LoRa-Modul ohne Python-Skript direkt über die vom Modul verwendenten AT-Befehle testen möchtest, kannst du das Terminalprogramm **Minicom** verwenden. Dies ist besonders nützlich, um die RX/TX-Crossover-Funktionalität zu prüfen oder die Hardware-Verbindung zu verifizieren.+
  
-==== 1. Installation ==== +AT-Befehle (abgeleitet von **AT**tention) sind ein standardisierter Befehlssatz zur Steuerung von Modems und Funkmodulen über eine serielle Schnittstelle (UART). In diesem Workshop dienen sie als Brücke zwischen dem Raspberry Pi und dem LoRa-E5 Modul, um komplexe LoRaWAN-Prozesse durch einfache Textbefehle zu steuern. 
-Zuerst muss Minicom auf dem Raspberry Pi installiert werden:+ 
 +==== Funktionsweise im Projekt ==== 
 +Die Kommunikation erfolgt nach einem einfachen Frage-Antwort-Prinzip: Der Raspberry Pi sendet eine Zeichenfolge an das Modul, und das Modul führt die entsprechende Aktion aus oder gibt Informationen zurück.  
 + 
 +  * **Syntax:** Jeder Befehl beginnt mit dem Präfix ''AT''. Parameter werden meist mit einem Gleichheitszeichen (''='') angehängt, während Abfragen oft durch ein Fragezeichen oder den reinen Befehl erfolgen. 
 +  * **Testen:** Ein einfaches ''AT'' dient als Verbindungstest; das Modul antwortet im Idealfall mit "OK"
 +  * **Konfiguration:** Befehle wie ''AT+ID'' werden genutzt, um Hardware-spezifische Adressen wie die DevEui oder AppEui auszulesen, die für die Registrierung im Netzwerk zwingend erforderlich sind. 
 +  * **Aktion:** Mit Befehlen wie ''AT+JOIN'' wird der komplexe Prozess der Netzwerkanmeldung gestartet. Erst nach einer erfolgreichen Bestätigung durch das Modul ("Network joined") können weitere Befehle zum Senden von Daten (z. B. ''AT+MSG'' für Text oder ''AT+MSGHEX'' für Hexadezimalwerte) genutzt werden. 
 + 
 +{{pdfjs 75%,500px>:lets_plaiy:lorawan:lora-e5_at_command_specification_v1.0_.pdf}} 
 + 
 +===== Tests mit Python (Beispiel Skript) ===== 
 +Für eine komfortable Steuerung des LoRa-Moduls steht das Skript ''LoRaWorkshop.py'' zur Verfügung. Dieses automatisiert die AT-Befehle und bietet eine menügeführte Oberfläche im Terminal. 
 + 
 +==== Vorbereitung ==== 
 +Bevor das Skript gestartet werden kann, muss die benötigte Python-Bibliothek installiert werden:
 <code> <code>
-sudo apt install minicom+pip install pyserial
 </code> </code>
  
-==== 2. Minicom starten ==== +Hier ist außerdem das Skript. Referenziere es gerne um bestimmte Funktionen zu verstehen: 
-Starte die Kommunikation über die serielle Schnittstelle mit einer Baudrate von 9600:+<file python LoRaWorkshop.py> 
 +import serial 
 +import time 
 + 
 +PORT "/dev/serial0" 
 +BAUD 9600 
 + 
 +def send_command(ser, cmd, wait_for="OK", timeout=5): 
 +    """Sendet einen Befehl und wartet auf eine Antwort.""" 
 +    ser.write(f"{cmd}\r\n".encode()) # wichtig ist \r\n zur bestätigung im Emulator 
 +    start_time = time.time() 
 +    response = "" 
 + 
 +    while (time.time() - start_time) < timeout: 
 +        if ser.in_waiting > 0: 
 +            line = ser.readline().decode(errors='ignore').strip() 
 +            if line: 
 +                print(f"  [Modul]: {line}"
 +                response += line 
 +                if wait_for in line: 
 +                    return True 
 +    return False 
 + 
 +def main_menu(): 
 +    try: 
 +        ser = serial.Serial(PORT, BAUD, timeout=1) 
 +        print("--- LoRa-E5 Schnellwahl-Terminal ---"
 + 
 +        while True: 
 +            print("\nWas küt ?") 
 +            print("1 Test (AT)"
 +            print("IDs auslesen (AT+ID)"
 +            print("3 Mit TTN verbinden (AT+JOIN)"
 +            print("4 Nachricht senden (Text)"
 +            print("5 Nachricht senden (Hex)"
 +            print("6 Reset des Moduls") # Falls timeout wegen zuviel anfragen 
 +            print("7 Nachricht im Loop senden (alle 45s)"
 +            print("c Beliebigen AT-Befehl senden"
 +            print("q Beenden"
 +            # print("f Mit TTN verbindung Forcen (AT+JOIN=FORCE)"
 + 
 +            choice = input("\nAuswahl: ").strip().lower() 
 + 
 +            if choice == '1': 
 +                send_command(ser, "AT"
 + 
 +            elif choice == '2': 
 +                send_command(ser, "AT+ID"
 + 
 +            elif choice == '3': 
 +                print("Join-Prozess gestartet..."
 +                keywords = ["done", "joined already"
 +                ser.write(b"AT+JOIN\r\n"
 +                start_time = time.time() 
 +                joined = False 
 + 
 +                while (time.time() - start_time) < 30: 
 +                    if ser.in_waiting > 0: 
 +                        line = ser.readline().decode(errors='ignore').strip() 
 +                        if line: 
 +                            print(f"  [Modul]: {line}"
 +                            line_lower = line.lower() 
 +                            if any(key in line_lower for key in keywords): 
 +                                joined = True 
 +                                break 
 +                            if "failed" in line_lower or "busy" in line_lower: 
 +                                break 
 + 
 +                if joined: 
 +                    print("Bereit: Modul ist im Netz."
 +                else: 
 +                    print("Timeout oder Fehler beim Join."
 + 
 +            elif choice == '4': 
 +                msg = input("Gib deine Nachricht ein: ") 
 +                send_command(ser, f'AT+MSG="{msg}"'
 + 
 +            elif choice == '5': 
 +                hex_payload = input("Gib den Hex-Code ein (z.B. AA BB 01): ") 
 +                hex_payload = hex_payload.replace(" ", "") # falls Eingabe Leerzeichen beinhaltet 
 +                send_command(ser, f'AT+MSGHEX="{hex_payload}"'
 + 
 +            elif choice == '6': 
 +                send_command(ser, "AT+RESET"
 + 
 +            elif choice == 'f': 
 +                send_command(ser, "AT+JOIN=FORCE"
 +                 
 +            elif choice == '7': 
 +                msg = input("Gib die Nachricht ein, die geloopt werden soll: ") 
 +                print("\nLoop gestartet. Drücke STRG+C (bzw. Ctrl+C), um den Loop zu beenden!"
 +                try: 
 +                    while True: 
 +                        print(f"\nSende Nachricht: {msg}"
 +                        send_command(ser, f'AT+MSG="{msg}"') # Auch mit Sensordaten Möglich einfach msg ändern zu dem Sensor Output 
 +                        print("Warte 45 Sekunden auf die nächste Sendung..."
 +                        time.sleep(45)  # Zeitintervall zur loop übermittlung 
 +                                        # Es gibt Gesetzliche Vorgaben (5min) für den Abstand von Signalen 
 +                                        # Wollen ja nicht die Bundesnetzagentur im nacken haben 
 +                except KeyboardInterrupt: 
 +                    print("\nLoop durch Benutzer abgebrochen. Kehre zum Menü zurück..."
 + 
 +            elif choice == 'c': 
 +                msg = input("command: ") 
 +                send_command(ser, msg) 
 + 
 +            elif choice == 'q': 
 +                print("Programm beendet."
 +                ser.close() 
 +                break 
 +            else: 
 +                print("Ungültige Auswahl."
 +             
 +            time.sleep(1) 
 + 
 +    except serial.SerialException as e: 
 +        print(f"Fehler: Konnte Port {PORT} nicht öffnen ({e})"
 + 
 +if __name__ == "__main__": 
 +    main_menu() 
 +</file> 
 + 
 +==== Skript starten ==== 
 +Navigiere im Terminal in den Ordner, in dem die Datei liegt, und führe sie aus:
 <code> <code>
-sudo minicom -b 9600 -D /dev/serial0+python LoRaWorkshop.py
 </code> </code>
-//Hinweis: Der Pfad /dev/serial0 verweist auf die primäre UART-Schnittstelle des Pi.// 
  
-==== 3. Konfiguration im Terminal ==== +==== Funktionsübersicht ==== 
-Da Minicom standardmäßig deine Eingaben nicht anzeigt, musst du das lokale Echo aktivieren. Die Steuerung erfolgt über **STRG+A**, gefolgt von einer weiteren Taste:+Nach dem Start erscheint ein Auswahlmenü mit folgenden Optionen:
  
-Befehl ^ Funktion ^ +Auswahl ^ Funktion ^ Beschreibung 
-STRG+A => E | **Echo aktivieren**: Damit siehst duwas du tippst. | +**1** | Test (AT) | Prüft, ob die RX/TX-Verbindung zum Modul steht. | 
-STRG+| **Eingabe bestätigen**: Sendet den Befehl an das Modul. | +| **2** | IDs auslesen | Zeigt DevEuiDevAddr und AppEui für die TTN-Registrierung an. | 
-STRG+A => X | **Beenden**: Minicom verlassen und zum Terminal zurückkehren. | +**3** | Mit TTN verbinden | Startet den Join-Prozess (AT+JOIN). Ein Gateway muss erreichbar sein. | 
-| STRG+A => | Terminalfenster aufräumen (Clear). |+| **4** | Nachricht senden (Text) | Übermittelt eine Nachricht im Klartext. | 
 +| **5** | Nachricht senden (Hex) | Übermittelt Daten als Hexadezimal-Zeichen (ASCII-Code). | 
 +| **6** | Reset | Startet das LoRa-Modul neu, falls es nicht reagiert. | 
 +**7** | Loop-Modus | Sendet automatisch alle 45 Sekunden eine Nachricht. | 
 +| **f** | Verbindung erzwingen | Verlässt bestehende Sitzungen und erzwingt einen neuen Join (Force). | 
 +**q** | Beenden | Schließt das Skript (auch per STRG+C möglich). |
  
-==== 4. Wichtige AT-Testbefehle ==== +> **Hinweis:** Die Funktionen zur Datenübertragung (Text/Hex/Loop) stehen erst zur Verfügung, wenn die Netzwerkanfrage erfolgreich war und das Modul "Network joined" meldet.
-Sobald die Verbindung steht, kannst du das Modul mit folgenden Befehlen direkt steuern[cite: 65]:+
  
-^ AT-Befehl ^ Beschreibung ^ +==== Payload Decoder ==== 
-| AT | Testet die RX/TX KommunikationDas Modul sollte mit "OK" antworten[cite: 65]. | +Um die Daten, welche in TTN über LoRaWAN ankommen, zu decodieren kann ein sogenannter Payload Decoder hinterlegt werdenDa die Daten in diesem Fall über die ASCII Tabelle (Gerne mal googelncodiert wurden in Hexadezimalsieht der Decoder in diesem Fall so aus
-| AT+ID | Zeigt die Geräte-IDs an (DevEui, DevAddr, JoinEui), die für TTN benötigt werden[cite65]. | +<file javascript decoder.js> 
-| AT+MODE | Zeigt den aktuellen Modus des Moduls an[cite: 65]| +function decodeUplink(input) { 
-| AT+JOIN | Sendet eine Beitrittsanfrage an das LoRaWAN-Netzwerk[cite: 65]| +  var bytes = input.bytes; 
-| AT+MSG="Text| Sendet eine einfache Textnachricht als ASCII-Zeichen[cite: 65]. |+   
 +  // Konvertierung der Bytes in einen String (ASCII) 
 +  var text = ""
 +  for (var i = 0; i < bytes.length; i++) { 
 +    text += String.fromCharCode(bytes[i]); 
 +  }
  
-> **Wichtig:** Befehle zur Kommunikation (wie das Senden von Nachrichten) funktionieren erst nach einer erfolgreichen Netzwerk-Anfrage (Join)[cite10]+  return { 
- +    data
-===== Tests mit Python (Beispiel Skript) =====+      type"TEXT_MSG", 
 +      message: text, 
 +      length: bytes.length 
 +    } 
 +  }; 
 +
 +</file>
  
 ===== Credits ===== ===== Credits =====
lets_plaiy/lorawan/start.1777302968.txt.gz · Last modified: 2026/04/27 17:16 by jan.sonntag