lora — LoRa-Modemtreiber#

Das Modul lora stellt einen Treiber für das LoRa-Modem Murata CMWX1ZZABZ auf dem Arduino Portenta Vision Shield bereit. Es bietet eine High-Level-Klasse Lora, die den vom Modem genutzten AT-Befehlssatz kapselt (einschließlich der Arduino-MKRWAN-Firmware ARD-078), sodass eine Anwendung einem LoRaWAN-Netzwerk beitreten und Pakete senden bzw. empfangen kann.

Beispiel:

import lora

modem = lora.Lora(band=lora.BAND_EU868, debug=True)
print("Device EUI:", modem.get_device_eui())
if modem.join_OTAA("0000000000000000", "00000000000000000000000000000000"):
    modem.send_data(b"hello", confirmed=True)

Konstanten#

Aktivierungsmodi#

lora.MODE_ABP: int#

Activation-By-Personalization-Modus.

lora.MODE_OTAA: int#

Over-The-Air-Activation-Modus.

RF-Ausgangsmodi#

lora.RF_MODE_RFO: int#

Den RFO-Ausgang (niedrige Leistung) des Modems verwenden.

lora.RF_MODE_PABOOST: int#

Den PA_BOOST-Ausgang (hohe Leistung) des Modems verwenden.

Bänder#

lora.BAND_AS923: int#

Regionales Band AS923 (Asien 923 MHz).

lora.BAND_AU915: int#

Regionales Band AU915 (Australien 915 MHz).

lora.BAND_EU868: int#

Regionales Band EU868 (Europa 868 MHz).

lora.BAND_KR920: int#

Regionales Band KR920 (Korea 920 MHz).

lora.BAND_IN865: int#

Regionales Band IN865 (Indien 865 MHz).

lora.BAND_US915: int#

Regionales Band US915 (Vereinigte Staaten 915 MHz).

lora.BAND_US915_HYBRID: int#

Regionaler Plan US915 hybrid (Sub-Band).

Geräteklassen#

lora.CLASS_A: str#

LoRaWAN-Endgerät der Klasse A.

lora.CLASS_B: str#

LoRaWAN-Endgerät der Klasse B.

lora.CLASS_C: str#

LoRaWAN-Endgerät der Klasse C.

Ausnahmen#

exception lora.LoraError#

Basisausnahme, die für jeden vom Modem oder Treiber zurückgegebenen Fehler ausgelöst wird.

exception lora.LoraErrorTimeout#

Wird ausgelöst, wenn das Modem nicht innerhalb des konfigurierten Timeouts antwortet (der Empfangspuffer ist leer).

exception lora.LoraErrorParam#

Wird bei einer +ERR_PARAM-Antwort ausgelöst, wenn ein AT-Befehl mit einem ungültigen Parameter abgesetzt wurde.

exception lora.LoraErrorBusy#

Wird bei einer +ERR_BUSY-Antwort ausgelöst, wenn das Modem mit der Verarbeitung eines vorherigen Befehls beschäftigt ist.

exception lora.LoraErrorOverflow#

Wird bei einer +ERR_PARAM_OVERFLOW-Antwort ausgelöst, wenn ein Parameter die maximal zulässige Länge überschreitet.

exception lora.LoraErrorNoNetwork#

Wird bei einer +ERR_NO_NETWORK-Antwort ausgelöst, wenn das Modem keinem Netzwerk beigetreten ist.

exception lora.LoraErrorRX#

Wird bei einer +ERR_RX-Antwort ausgelöst, wenn beim Empfang eines Downlinks ein Fehler auftritt.

exception lora.LoraErrorUnknown#

Wird bei einer +ERR_UNKNOWN-Antwort ausgelöst oder wenn das Modem einen undokumentierten Fehler meldet.

Klassen#

class lora.Lora(uart: machine.UART | None = None, rst_pin: machine.Pin | None = None, boot_pin: machine.Pin | None = None, band: int = BAND_EU868, poll_ms: int = 300000, debug: bool = False)#

Erstellt einen neuen Modemtreiber. Der Konstruktor initialisiert (oder erstellt automatisch) die UART- sowie die Reset-/Boot-Pins, führt einen Hardware-Reset des Moduls durch, synchronisiert die Baudrate (Autobaud), startet das Modul neu, fragt dessen Firmware-Version ab und konfiguriert das angeforderte regionale band.

Parameter:
  • uart – Vorkonfigurierte machine.UART-Instanz zur Kommunikation mit dem Modem. Wenn None, öffnet der Treiber UART(8, 19200) mit 8N2-Framing (der Standardeinstellung des Portenta Vision Shield).

  • rst_pinmachine.Pin, der die Reset-Leitung des Modems steuert. Wenn None, wird "PC6" als Push-Pull-Ausgang konfiguriert.

  • boot_pinmachine.Pin, der die Boot-Select-Leitung des Modems steuert. Wenn None, wird "PG7" als nach Low gezogener Push-Pull-Ausgang konfiguriert.

  • band – Zu konfigurierendes regionales Band. Eine der BAND_*-Konstanten.

  • poll_ms – Intervall in Millisekunden zwischen automatischen leeren Uplinks, die von poll() ausgelöst werden, um das Downlink-Fenster offen zu halten.

  • debug – Wenn True, wird der gesamte UART-Verkehr über print() ausgegeben.

LoraErrors: dict#

Zuordnung von Fehlerantwort-Strings des Modems (z. B. "+ERR_BUSY") zu der entsprechenden Ausnahmeklasse. Wird intern von handle_error() verwendet.

init_modem() None#

Initialisiert self.uart, self.rst_pin und self.boot_pin verzögert auf ihre Portenta-Vision-Shield-Standardwerte, sofern sie noch nicht gesetzt sind. Wird vom Konstruktor aufgerufen; normalerweise nicht durch Benutzercode aufgerufen.

debug_print(data: str) None#

Gibt data aus, wenn debug beim Erstellen aktiviert wurde, andernfalls geschieht nichts.

is_arduino_firmware() bool#

Gibt True zurück, wenn auf dem Modem die Arduino-MKRWAN-Firmware ARD-078 läuft (erkannt anhand des zwischengespeicherten fw_version-Strings).

configure_class(_class: str) None#

Konfiguriert die LoRaWAN-Geräteklasse.

Parameter:

_class – Eines von CLASS_A, CLASS_B, CLASS_C.

configure_band(band: int) bool#

Konfiguriert das regionale Band und aktiviert auf Arduino-Firmware mit BAND_EU868 den ETSI-Duty-Cycle-Begrenzer. Gibt bei Erfolg True zurück.

Parameter:

band – Eine der BAND_*-Konstanten.

set_baudrate(baudrate: int) None#

Ändert die UART-Baudrate des Modems (AT+UART).

Parameter:

baudrate – Neue Baudrate in Bit pro Sekunde.

set_autobaud(timeout: int = 10000) bool#

Sendet leere AT-Befehle, bis das Modem mit +OK antwortet oder bis timeout Millisekunden verstrichen sind. Gibt True zurück, wenn die Synchronisation erfolgreich war.

Parameter:

timeout – Maximale Zeit für den Versuch, in Millisekunden.

get_fw_version() str#

Fragt den Geräte-String des Modems (AT+DEV?) und die Firmware-Version (AT+VER?) ab und gibt sie als einen einzigen, durch Leerzeichen getrennten String zurück.

get_device_eui() str#

Gibt die 64-Bit-Device-EUI des Modems als Hex-String zurück.

factory_default() None#

Stellt über AT+FACNEW die Werkseinstellungen wieder her.

restart() None#

Synchronisiert die Baudrate erneut, startet das Modem neu, liest die Firmware-Version erneut ein und wendet das konfigurierte regionale Band erneut an. Löst bei einem Fehler LoraError aus.

set_rf_power(mode: int, power: int) None#

Konfiguriert die RF-Ausgangsstufe des Modems (AT+RFPOWER).

Parameter:
set_port(port: int) None#

Konfiguriert den LoRaWAN-Anwendungsport (1..223), der von nachfolgenden send_data()-Aufrufen verwendet wird.

Parameter:

port – LoRaWAN-FPort.

set_public_network(enable: bool) None#

Aktiviert oder deaktiviert das Public-Network-Sync-Word.

Parameter:

enableTrue für das öffentliche LoRaWAN-Sync-Word, False für das private.

sleep(enable: bool) None#

Versetzt das Modem in den Low-Power-Schlafmodus (True) oder weckt es auf (False).

format(hexMode: bool) None#

Wählt das über UART verwendete Datenformat für Payload-Bytes aus.

Parameter:

hexModeTrue für das ASCII-Hex-Payload-Format, False für rohes Binärformat.

set_datarate(dr: int) None#

Setzt den LoRaWAN-Datenraten-Index (AT+DR).

Parameter:

dr – Regionsspezifischer Datenraten-Index.

get_datarate() int#

Gibt den aktuellen LoRaWAN-Datenraten-Index zurück.

set_adr(adr: bool) None#

Aktiviert oder deaktiviert Adaptive Data Rate.

Parameter:

adrTrue, um ADR zu aktivieren, False, um es zu deaktivieren.

get_adr() int#

Gibt die aktuelle ADR-Einstellung zurück (1 wenn aktiviert, sonst 0).

get_devaddr() str#

Gibt die aktuelle 32-Bit-DevAddr als Hex-String zurück.

get_nwk_skey() str#

Gibt den aktuellen Network Session Key als Hex-String zurück.

get_appskey() str#

Gibt den aktuellen Application Session Key als Hex-String zurück.

get_rx2dr() int#

Gibt den für das RX2-Empfangsfenster verwendeten Datenraten-Index zurück.

set_rx2dr(dr: int) None#

Setzt den für das RX2-Empfangsfenster verwendeten Datenraten-Index.

Parameter:

dr – Regionsspezifischer Datenraten-Index.

get_ex2freq() int#

Gibt die für das RX2-Empfangsfenster verwendete Frequenz in Hz zurück.

set_rx2freq(freq: int) None#

Setzt die für das RX2-Empfangsfenster verwendete Frequenz.

Parameter:

freq – Frequenz in Hz.

set_fcu(fcu: int) None#

Setzt den Uplink-Frame-Zähler (AT+FCU).

Parameter:

fcu – Neuer Wert für den Uplink-Frame-Zähler.

get_fcu() int#

Gibt den aktuellen Uplink-Frame-Zähler zurück.

set_fcd(fcd: int) None#

Setzt den Downlink-Frame-Zähler (AT+FCD).

Parameter:

fcd – Neuer Wert für den Downlink-Frame-Zähler.

get_fcd() int#

Gibt den aktuellen Downlink-Frame-Zähler zurück.

change_mode(mode: int) None#

Wechselt den Aktivierungsmodus.

Parameter:

mode – Eines von MODE_ABP, MODE_OTAA.

join(timeout_ms: int) bool#

Setzt ein AT+JOIN ab und wartet auf das Join-Accept-Ereignis. Gibt True zurück, wenn das Modem innerhalb von timeout_ms +EVENT=1,1 meldet (Join erfolgreich).

Parameter:

timeout_ms – Maximale Wartezeit sowohl auf das +ACK als auch auf das nachfolgende Join-Ereignis, in Millisekunden.

get_join_status() bool#

Gibt True zurück, wenn das Modem aktuell einem Netzwerk beigetreten ist.

get_max_size() int#

Gibt die maximale LoRaWAN-Payload-Größe in Bytes für die aktuelle Datenrate zurück. Auf Arduino-Firmware ist dieser Wert fest auf 64 gesetzt.

poll() None#

Wenn seit dem letzten Aufruf mehr als poll_ms Millisekunden vergangen sind, wird ein leerer bestätigter Uplink gesendet, um ausstehende Downlinks abzurufen. Vorgesehen für den häufigen Aufruf aus der Hauptschleife der Anwendung.

send_data(buff: bytes, confirmed: bool = True) bool#

Sendet einen LoRaWAN-Uplink. Löst LoraError aus, wenn buff größer ist als get_max_size().

Parameter:
  • buff – Zu sendende Payload-Bytes.

  • confirmed – Wenn True, wird ein bestätigter Uplink (+CTX) gesendet und auf ein +ACK des Netzwerkservers gewartet. Wenn False, wird ein unbestätigter Uplink (+UTX) gesendet.

Rückgabe:

True, wenn das Modem das Paket akzeptiert hat (und es bei bestätigten Uplinks vom Netzwerk quittiert wurde), andernfalls False.

receive_data(timeout: int = 1000) dict | None#

Wartet auf einen Downlink. Gibt None zurück, wenn innerhalb von timeout Millisekunden kein +RECV-Ereignis empfangen wurde, andernfalls ein Dict {"port": str, "data": str}, das den FPort und die Payload-Bytes enthält.

Parameter:

timeout – Maximale Wartezeit in Millisekunden.

receive(delimiter: str | list | None = None, max_bytes: int | None = None, timeout: int = 1000) str#

Low-Level-UART-Lesevorgang. Liest Zeichen vom Modem, bis ein Trennzeichen erkannt wird, max_bytes Zeichen gelesen wurden oder timeout Millisekunden verstrichen sind, und gibt dann den angesammelten String zurück, wobei ein abschließendes \r entfernt wird.

Parameter:
  • delimiter – Entweder ein einzelnes am Ende des Puffers zu erkennendes Zeichen, ein mehrzeichiger String, der mit dem gesamten getrimmten Puffer verglichen wird, oder eine Liste solcher Strings.

  • max_bytes – Wenn gesetzt, wird zurückgekehrt, sobald genau diese Anzahl an Bytes gelesen wurde.

  • timeout – Gesamtes Lese-Timeout in Millisekunden.

available() int#

Gibt die Anzahl der derzeit im UART-Empfangspuffer des Modems verfügbaren Bytes zurück.

join_OTAA(appEui: str, appKey: str, devEui: str = None, timeout: int = 60000) bool#

Schaltet das Modem in den OTAA-Modus, programmiert die angegebenen Schlüssel und EUIs und versucht dann, dem Netzwerk beizutreten. Gibt True zurück, wenn der Join erfolgreich war.

Parameter:
  • appEui – 64-Bit-Application-/Join-EUI als Hex-String.

  • appKey – 128-Bit-Application-Key als Hex-String.

  • devEui – Optionale 64-Bit-Device-EUI als Hex-String. Wenn None, wird die werkseitig programmierte Device-EUI verwendet.

  • timeout – Join-Timeout in Millisekunden.

join_ABP(nwkId: int, devAddr: str, nwkSKey: str, appSKey: str, timeout: int = 60000) bool#

Schaltet das Modem in den ABP-Modus, programmiert die angegebenen Adressen und Schlüssel und versucht dann, beizutreten. Gibt das Ergebnis von get_join_status() zurück.

Parameter:
  • nwkId – Netzwerkkennung (wird derzeit von der Firmware ignoriert).

  • devAddr – 32-Bit-Geräteadresse als Hex-String.

  • nwkSKey – 128-Bit-Network-Session-Key als Hex-String.

  • appSKey – 128-Bit-Application-Session-Key als Hex-String.

  • timeout – Join-Timeout in Millisekunden.

handle_error(command: str, data: str) None#

Untersucht eine Modemantwort und löst die passende LoraError-Unterklasse aus, wenn sie einen Fehler darstellt. Bei Nicht-Fehler-Antworten geschieht nichts.

Parameter:
  • command – Der AT-Befehl (ohne das AT-Präfix), der data erzeugt hat.

  • data – Der vom Modem zurückgegebene Antwort-String.

send_command(cmd: str, *args, delimiter: str = '\\r', data: bytes = None, timeout: int = 1000, raise_error: bool = True) str#

Erstellt einen AT-Befehl aus cmd und args, hängt optional eine rohe data-Payload an, sendet ihn und gibt die Antwort des Modems zurück. Bei Abfragebefehlen, die auf ? enden, wird nur der Werteteil (der Teilstring nach =) zurückgegeben.

Parameter:
  • cmd – AT-Befehlssuffix (z. B. "+JOIN", "+DR="); das "AT"-Präfix und das abschließende \r werden automatisch hinzugefügt.

  • args – Zusätzliche Argumente, die nach der String-Konvertierung an cmd angehängt werden.

  • delimiter – An receive() weitergereichtes Trennzeichen.

  • data – Optionale rohe Bytes, die unmittelbar nach dem AT-Befehl geschrieben werden (verwendet für binäre Uplink-Payloads).

  • timeout – Antwort-Timeout in Millisekunden.

  • raise_error – Wenn True, werden Fehlerantworten in LoraError-Ausnahmen umgewandelt; wenn False, wird die rohe Antwort an den Aufrufer zurückgegeben.