lets_plaiy:lorawan:start
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| lets_plaiy:lorawan:start [2026/04/27 17:16] – jan.sonntag | lets_plaiy:lorawan:start [2026/04/28 12:20] (current) – jan.sonntag | ||
|---|---|---|---|
| Line 5: | Line 5: | ||
| ===== Was ist LoRaWAN? ===== | ===== Was ist LoRaWAN? ===== | ||
| + | {{pdfjs 75%, | ||
| ===== 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/ | + | |
| - | ==== 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: | ||
| + | |||
| + | * **Syntax:** Jeder Befehl beginnt mit dem Präfix '' | ||
| + | * **Testen:** Ein einfaches '' | ||
| + | * **Konfiguration: | ||
| + | * **Aktion:** Mit Befehlen wie '' | ||
| + | |||
| + | {{pdfjs 75%, | ||
| + | |||
| + | ===== Tests mit Python (Beispiel Skript) ===== | ||
| + | Für eine komfortable Steuerung des LoRa-Moduls steht das Skript '' | ||
| + | |||
| + | ==== Vorbereitung ==== | ||
| + | Bevor das Skript gestartet werden kann, muss die benötigte Python-Bibliothek | ||
| < | < | ||
| - | sudo apt install | + | pip install |
| </ | </ | ||
| - | ==== 2. Minicom starten | + | Hier ist außerdem das Skript. Referenziere es gerne um bestimmte Funktionen zu verstehen: |
| - | Starte | + | <file python LoRaWorkshop.py> |
| + | import serial | ||
| + | import time | ||
| + | |||
| + | PORT = "/ | ||
| + | BAUD = 9600 | ||
| + | |||
| + | def send_command(ser, | ||
| + | """ | ||
| + | ser.write(f" | ||
| + | start_time = time.time() | ||
| + | response = "" | ||
| + | |||
| + | while (time.time() - start_time) < timeout: | ||
| + | if ser.in_waiting > 0: | ||
| + | line = ser.readline().decode(errors=' | ||
| + | if line: | ||
| + | print(f" | ||
| + | response += line | ||
| + | if wait_for in line: | ||
| + | return True | ||
| + | return False | ||
| + | |||
| + | def main_menu(): | ||
| + | try: | ||
| + | ser = serial.Serial(PORT, | ||
| + | print(" | ||
| + | |||
| + | while True: | ||
| + | print(" | ||
| + | print(" | ||
| + | print(" | ||
| + | print(" | ||
| + | print(" | ||
| + | print(" | ||
| + | print(" | ||
| + | print(" | ||
| + | print(" | ||
| + | print(" | ||
| + | # print(" | ||
| + | |||
| + | choice = input(" | ||
| + | |||
| + | if choice | ||
| + | send_command(ser, | ||
| + | |||
| + | elif choice | ||
| + | | ||
| + | |||
| + | elif choice == ' | ||
| + | print(" | ||
| + | keywords = [" | ||
| + | ser.write(b" | ||
| + | start_time = time.time() | ||
| + | joined = False | ||
| + | |||
| + | while (time.time() - start_time) < 30: | ||
| + | if ser.in_waiting > 0: | ||
| + | line = ser.readline().decode(errors=' | ||
| + | if line: | ||
| + | print(f" | ||
| + | line_lower = line.lower() | ||
| + | if any(key in line_lower for key in keywords): | ||
| + | joined = True | ||
| + | break | ||
| + | if " | ||
| + | break | ||
| + | |||
| + | if joined: | ||
| + | print(" | ||
| + | else: | ||
| + | print(" | ||
| + | |||
| + | elif choice == ' | ||
| + | msg = input(" | ||
| + | send_command(ser, | ||
| + | |||
| + | elif choice == ' | ||
| + | hex_payload = input(" | ||
| + | hex_payload = hex_payload.replace(" | ||
| + | send_command(ser, | ||
| + | |||
| + | elif choice == ' | ||
| + | send_command(ser, | ||
| + | |||
| + | elif choice == ' | ||
| + | send_command(ser, | ||
| + | |||
| + | elif choice == ' | ||
| + | msg = input(" | ||
| + | print(" | ||
| + | try: | ||
| + | while True: | ||
| + | print(f" | ||
| + | send_command(ser, | ||
| + | print(" | ||
| + | time.sleep(45) | ||
| + | # Es gibt Gesetzliche Vorgaben (5min) für den Abstand | ||
| + | # Wollen ja nicht die Bundesnetzagentur im nacken haben | ||
| + | except KeyboardInterrupt: | ||
| + | print(" | ||
| + | |||
| + | elif choice == ' | ||
| + | msg = input(" | ||
| + | send_command(ser, | ||
| + | |||
| + | elif choice == ' | ||
| + | print(" | ||
| + | ser.close() | ||
| + | break | ||
| + | else: | ||
| + | print(" | ||
| + | |||
| + | time.sleep(1) | ||
| + | |||
| + | except serial.SerialException as e: | ||
| + | print(f" | ||
| + | |||
| + | if __name__ == " | ||
| + | main_menu() | ||
| + | </ | ||
| + | |||
| + | ==== Skript starten ==== | ||
| + | Navigiere im Terminal in den Ordner, in dem die Datei liegt, und führe sie aus: | ||
| < | < | ||
| - | sudo minicom -b 9600 -D / | + | python LoRaWorkshop.py |
| </ | </ | ||
| - | //Hinweis: Der Pfad / | ||
| - | ==== 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 | + | ^ Auswahl |
| - | | STRG+A => E | **Echo aktivieren**: Damit siehst du, was du tippst. | | + | | **1** | Test (AT) | Prüft, ob die RX/ |
| - | | STRG+J | **Eingabe bestätigen**: Sendet den Befehl an das Modul. | | + | | **2** | IDs auslesen | Zeigt DevEui, DevAddr und AppEui für die TTN-Registrierung an. | |
| - | | STRG+A => X | **Beenden**: Minicom verlassen | + | | **3** | Mit TTN verbinden | Startet den Join-Prozess (AT+JOIN). Ein Gateway muss erreichbar sein. | |
| - | | STRG+A => C | 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 | ||
| + | | **7** | Loop-Modus | Sendet automatisch alle 45 Sekunden eine Nachricht. | | ||
| + | | **f** | Verbindung erzwingen | Verlässt bestehende Sitzungen | ||
| + | | **q** | Beenden | Schließt das Skript (auch per STRG+C | ||
| - | ==== 4. Wichtige AT-Testbefehle ==== | + | > **Hinweis: |
| - | Sobald | + | |
| - | ^ AT-Befehl ^ Beschreibung ^ | + | ==== Payload Decoder ==== |
| - | | AT | Testet | + | Um die Daten, welche in TTN über LoRaWAN ankommen, zu decodieren kann ein sogenannter Payload Decoder hinterlegt werden. Da die Daten in diesem Fall über die ASCII Tabelle |
| - | | AT+ID | Zeigt die Geräte-IDs an (DevEui, DevAddr, JoinEui), die für TTN benötigt werden[cite: 65]. | | + | <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: | + | var bytes = input.bytes; |
| - | | AT+MSG="Text" | + | |
| + | // Konvertierung der Bytes in einen String (ASCII) | ||
| + | var text = "" | ||
| + | for (var i = 0; i < bytes.length; | ||
| + | text += String.fromCharCode(bytes[i]); | ||
| + | } | ||
| - | > **Wichtig:** Befehle zur Kommunikation (wie das Senden von Nachrichten) funktionieren erst nach einer erfolgreichen Netzwerk-Anfrage (Join)[cite: 10]. | + | return { |
| - | + | data: { | |
| - | ===== Tests mit Python (Beispiel Skript) ===== | + | type: " |
| + | message: text, | ||
| + | length: bytes.length | ||
| + | } | ||
| + | }; | ||
| + | } | ||
| + | </ | ||
| ===== Credits ===== | ===== Credits ===== | ||
lets_plaiy/lorawan/start.1777302968.txt.gz · Last modified: 2026/04/27 17:16 by jan.sonntag