lora — sterownik modemu LoRa#

Moduł lora udostępnia sterownik modemu LoRa Murata CMWX1ZZABZ na płytce Arduino Portenta Vision Shield. Udostępnia on wysokopoziomową klasę Lora, która opakowuje zestaw poleceń AT używany przez oprogramowanie układowe modemu (w tym oprogramowanie układowe Arduino MKRWAN ARD-078), dzięki czemu aplikacja może dołączyć do sieci LoRaWAN oraz wysyłać i odbierać pakiety.

Przykład:

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)

Stałe#

Tryby aktywacji#

lora.MODE_ABP: int#

Tryb Activation By Personalization.

lora.MODE_OTAA: int#

Tryb Over-The-Air Activation.

Tryby wyjścia RF#

lora.RF_MODE_RFO: int#

Użyj wyjścia RF modemu RFO (niskiej mocy).

lora.RF_MODE_PABOOST: int#

Użyj wyjścia RF modemu PA_BOOST (wysokiej mocy).

Pasma#

lora.BAND_AS923: int#

Pasmo regionalne AS923 (Azja 923 MHz).

lora.BAND_AU915: int#

Pasmo regionalne AU915 (Australia 915 MHz).

lora.BAND_EU868: int#

Pasmo regionalne EU868 (Europa 868 MHz).

lora.BAND_KR920: int#

Pasmo regionalne KR920 (Korea 920 MHz).

lora.BAND_IN865: int#

Pasmo regionalne IN865 (Indie 865 MHz).

lora.BAND_US915: int#

Pasmo regionalne US915 (Stany Zjednoczone 915 MHz).

lora.BAND_US915_HYBRID: int#

Plan regionalny hybrydowy US915 (podpasmo).

Klasy urządzeń#

lora.CLASS_A: str#

Urządzenie końcowe LoRaWAN klasy A.

lora.CLASS_B: str#

Urządzenie końcowe LoRaWAN klasy B.

lora.CLASS_C: str#

Urządzenie końcowe LoRaWAN klasy C.

Wyjątki#

exception lora.LoraError#

Bazowy wyjątek zgłaszany dla dowolnego błędu zwróconego przez modem lub sterownik.

exception lora.LoraErrorTimeout#

Zgłaszany, gdy modem nie odpowie w skonfigurowanym czasie oczekiwania (bufor odbiorczy jest pusty).

exception lora.LoraErrorParam#

Zgłaszany przy odpowiedzi +ERR_PARAM, gdy polecenie AT zostało wydane z nieprawidłowym parametrem.

exception lora.LoraErrorBusy#

Zgłaszany przy odpowiedzi +ERR_BUSY, gdy modem jest zajęty przetwarzaniem poprzedniego polecenia.

exception lora.LoraErrorOverflow#

Zgłaszany przy odpowiedzi +ERR_PARAM_OVERFLOW, gdy parametr przekracza maksymalną dozwoloną długość.

exception lora.LoraErrorNoNetwork#

Zgłaszany przy odpowiedzi +ERR_NO_NETWORK, gdy modem nie dołączył do sieci.

exception lora.LoraErrorRX#

Zgłaszany przy odpowiedzi +ERR_RX, gdy podczas odbierania pakietu downlink wystąpi błąd.

exception lora.LoraErrorUnknown#

Zgłaszany przy odpowiedzi +ERR_UNKNOWN lub gdy modem zgłosi nieudokumentowany błąd.

Klasy#

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)#

Tworzy nowy sterownik modemu. Konstruktor inicjalizuje (lub automatycznie tworzy) UART oraz piny reset/boot, wykonuje sprzętowy reset modułu, przeprowadza synchronizację autobaud, ponownie uruchamia moduł, odpytuje wersję jego oprogramowania układowego i konfiguruje żądane pasmo regionalne band.

Parametry:
  • uart – Wstępnie skonfigurowana instancja machine.UART używana do komunikacji z modemem. Jeśli None, sterownik otwiera UART(8, 19200) z ramkowaniem 8N2 (domyślnym dla Portenta Vision Shield).

  • rst_pinmachine.Pin sterujący linią reset modemu. Jeśli None, jako wyjście push-pull konfigurowany jest "PC6".

  • boot_pinmachine.Pin sterujący linią boot-select modemu. Jeśli None, jako wyjście push-pull podciągnięte do stanu niskiego konfigurowany jest "PG7".

  • band – Pasmo regionalne do skonfigurowania. Jedna ze stałych BAND_*.

  • poll_ms – Odstęp w milisekundach pomiędzy automatycznymi pustymi uplinkami wyzwalanymi przez poll() w celu utrzymania otwartego okna downlink.

  • debug – Gdy True, cały ruch UART jest wypisywany za pomocą print().

LoraErrors: dict#

Mapowanie z łańcuchów odpowiedzi błędów modemu (np. "+ERR_BUSY") na odpowiadające im klasy wyjątków. Używane wewnętrznie przez handle_error().

init_modem() None#

Leniwie inicjalizuje self.uart, self.rst_pin i self.boot_pin do ich wartości domyślnych dla Portenta Vision Shield, jeśli nie zostały jeszcze ustawione. Wywoływane z konstruktora; zwykle nie jest wywoływane przez kod użytkownika.

debug_print(data: str) None#

Wypisuje data, jeśli przy tworzeniu obiektu włączono debug, w przeciwnym razie nie robi nic.

is_arduino_firmware() bool#

Zwraca True, jeśli modem działa na oprogramowaniu układowym Arduino MKRWAN ARD-078 (wykryte na podstawie zbuforowanego łańcucha fw_version).

configure_class(_class: str) None#

Konfiguruje klasę urządzenia LoRaWAN.

Parametry:

_class – Jedna z wartości CLASS_A, CLASS_B, CLASS_C.

configure_band(band: int) bool#

Konfiguruje pasmo regionalne oraz, na oprogramowaniu układowym Arduino z BAND_EU868, włącza ogranicznik cyklu pracy ETSI. Zwraca True w przypadku powodzenia.

Parametry:

band – Jedna ze stałych BAND_*.

set_baudrate(baudrate: int) None#

Zmienia szybkość transmisji (baud) UART modemu (AT+UART).

Parametry:

baudrate – Nowa szybkość transmisji (baud), w bitach na sekundę.

set_autobaud(timeout: int = 10000) bool#

Wysyła puste polecenia AT, aż modem odpowie +OK lub upłynie timeout milisekund. Zwraca True, jeśli synchronizacja się powiodła.

Parametry:

timeout – Maksymalny czas przeznaczony na próby, w milisekundach.

get_fw_version() str#

Odpytuje łańcuch urządzenia modemu (AT+DEV?) oraz wersję oprogramowania układowego (AT+VER?) i zwraca je jako pojedynczy łańcuch rozdzielony spacjami.

get_device_eui() str#

Zwraca 64-bitowy Device EUI modemu jako łańcuch szesnastkowy.

factory_default() None#

Przywraca ustawienia fabryczne za pomocą AT+FACNEW.

restart() None#

Ponownie synchronizuje szybkość transmisji (baud), uruchamia ponownie modem, ponownie odczytuje wersję oprogramowania układowego i ponownie stosuje skonfigurowane pasmo regionalne. Zgłasza LoraError w przypadku niepowodzenia.

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

Konfiguruje stopień wyjściowy RF modemu (AT+RFPOWER).

Parametry:
  • mode – Jedna z wartości RF_MODE_RFO, RF_MODE_PABOOST.

  • power – Indeks mocy wyjściowej, w jednostkach specyficznych dla oprogramowania układowego.

set_port(port: int) None#

Konfiguruje port aplikacji LoRaWAN (1..223) używany przez kolejne wywołania send_data().

Parametry:

port – FPort LoRaWAN.

set_public_network(enable: bool) None#

Włącza lub wyłącza słowo synchronizacji sieci publicznej.

Parametry:

enableTrue dla publicznego słowa synchronizacji LoRaWAN, False dla prywatnego.

sleep(enable: bool) None#

Wprowadza modem w tryb uśpienia niskiej mocy (True) lub wybudza go (False).

format(hexMode: bool) None#

Wybiera format danych używany przez UART dla bajtów ładunku.

Parametry:

hexModeTrue dla formatu ładunku ASCII-hex, False dla surowego formatu binarnego.

set_datarate(dr: int) None#

Ustawia indeks szybkości transmisji danych LoRaWAN (AT+DR).

Parametry:

dr – Indeks szybkości transmisji danych specyficzny dla regionu.

get_datarate() int#

Zwraca bieżący indeks szybkości transmisji danych LoRaWAN.

set_adr(adr: bool) None#

Włącza lub wyłącza Adaptive Data Rate.

Parametry:

adrTrue aby włączyć ADR, False aby je wyłączyć.

get_adr() int#

Zwraca bieżące ustawienie ADR (1 jeśli włączone, 0 w przeciwnym razie).

get_devaddr() str#

Zwraca bieżący 32-bitowy DevAddr jako łańcuch szesnastkowy.

get_nwk_skey() str#

Zwraca bieżący Network Session Key jako łańcuch szesnastkowy.

get_appskey() str#

Zwraca bieżący Application Session Key jako łańcuch szesnastkowy.

get_rx2dr() int#

Zwraca indeks szybkości transmisji danych używany dla okna odbiorczego RX2.

set_rx2dr(dr: int) None#

Ustawia indeks szybkości transmisji danych używany dla okna odbiorczego RX2.

Parametry:

dr – Indeks szybkości transmisji danych specyficzny dla regionu.

get_ex2freq() int#

Zwraca częstotliwość w Hz używaną dla okna odbiorczego RX2.

set_rx2freq(freq: int) None#

Ustawia częstotliwość używaną dla okna odbiorczego RX2.

Parametry:

freq – Częstotliwość w Hz.

set_fcu(fcu: int) None#

Ustawia licznik ramek uplink (AT+FCU).

Parametry:

fcu – Nowa wartość licznika ramek uplink.

get_fcu() int#

Zwraca bieżący licznik ramek uplink.

set_fcd(fcd: int) None#

Ustawia licznik ramek downlink (AT+FCD).

Parametry:

fcd – Nowa wartość licznika ramek downlink.

get_fcd() int#

Zwraca bieżący licznik ramek downlink.

change_mode(mode: int) None#

Przełącza tryb aktywacji.

Parametry:

mode – Jedna z wartości MODE_ABP, MODE_OTAA.

join(timeout_ms: int) bool#

Wydaje polecenie AT+JOIN i czeka na zdarzenie join-accept. Zwraca True, jeśli modem zgłosi +EVENT=1,1 (dołączenie powiodło się) w ciągu timeout_ms.

Parametry:

timeout_ms – Maksymalny czas oczekiwania zarówno na +ACK, jak i na kolejne zdarzenie dołączenia, w milisekundach.

get_join_status() bool#

Zwraca True, jeśli modem jest aktualnie dołączony do sieci.

get_max_size() int#

Zwraca maksymalny rozmiar ładunku LoRaWAN, w bajtach, dla bieżącej szybkości transmisji danych. Na oprogramowaniu układowym Arduino jest on ustalony na 64.

poll() None#

Jeśli od ostatniego wywołania minęło więcej niż poll_ms milisekund, wysyła pusty potwierdzony uplink, aby opróżnić oczekujące pakiety downlink. Przeznaczone do częstego wywoływania z głównej pętli aplikacji.

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

Wysyła uplink LoRaWAN. Zgłasza LoraError, jeśli buff jest większy niż get_max_size().

Parametry:
  • buff – Bajty ładunku do wysłania.

  • confirmed – Gdy True, wysyła potwierdzony uplink (+CTX) i czeka na +ACK z serwera sieci. Gdy False, wysyła niepotwierdzony uplink (+UTX).

Zwraca:

True, jeśli modem zaakceptował pakiet (a w przypadku potwierdzonych uplinków sieć go potwierdziła), False w przeciwnym razie.

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

Czeka na pakiet downlink. Zwraca None, jeśli w ciągu timeout milisekund nie odebrano zdarzenia +RECV, w przeciwnym razie słownik {"port": str, "data": str} zawierający FPort i bajty ładunku.

Parametry:

timeout – Maksymalny czas oczekiwania, w milisekundach.

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

Niskopoziomowy odczyt UART. Odczytuje znaki z modemu, aż zostanie dopasowany ogranicznik, odczytanych zostanie max_bytes znaków lub upłynie timeout milisekund, a następnie zwraca zgromadzony łańcuch z usuniętym końcowym \r.

Parametry:
  • delimiter – Pojedynczy znak do dopasowania na końcu bufora, wieloznakowy łańcuch do dopasowania względem całego przyciętego bufora albo lista takich łańcuchów.

  • max_bytes – Jeśli ustawione, zwraca natychmiast po odczytaniu dokładnie tylu bajtów.

  • timeout – Całkowity limit czasu odczytu, w milisekundach.

available() int#

Zwraca liczbę bajtów aktualnie dostępnych w buforze odbiorczym UART modemu.

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

Przełącza modem w tryb OTAA, programuje dostarczone klucze i EUI, a następnie próbuje dołączyć do sieci. Zwraca True, jeśli dołączenie się powiodło.

Parametry:
  • appEui – 64-bitowy Application/Join EUI jako łańcuch szesnastkowy.

  • appKey – 128-bitowy Application Key jako łańcuch szesnastkowy.

  • devEui – Opcjonalny 64-bitowy Device EUI jako łańcuch szesnastkowy. Jeśli None, używany jest fabrycznie zaprogramowany Device EUI.

  • timeout – Limit czasu dołączenia, w milisekundach.

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

Przełącza modem w tryb ABP, programuje dostarczone adresy i klucze, a następnie próbuje dołączyć. Zwraca wynik get_join_status().

Parametry:
  • nwkId – Identyfikator sieci (obecnie ignorowany przez oprogramowanie układowe).

  • devAddr – 32-bitowy Device Address jako łańcuch szesnastkowy.

  • nwkSKey – 128-bitowy Network Session Key jako łańcuch szesnastkowy.

  • appSKey – 128-bitowy Application Session Key jako łańcuch szesnastkowy.

  • timeout – Limit czasu dołączenia, w milisekundach.

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

Bada odpowiedź modemu i zgłasza pasującą podklasę LoraError, jeśli reprezentuje ona błąd. Nie robi nic dla odpowiedzi niebędących błędami.

Parametry:
  • command – Polecenie AT (bez prefiksu AT), które wygenerowało data.

  • data – Łańcuch odpowiedzi zwrócony przez modem.

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

Buduje polecenie AT z cmd i args, opcjonalnie dołącza surowy ładunek data, wysyła je i zwraca odpowiedź modemu. W przypadku poleceń zapytań kończących się na ? zwracana jest tylko część z wartością (podłańcuch po =).

Parametry:
  • cmd – Sufiks polecenia AT (np. "+JOIN", "+DR="); prefiks "AT" oraz końcowy \r są dodawane automatycznie.

  • args – Dodatkowe argumenty łączone z cmd po konwersji na łańcuch.

  • delimiter – Ogranicznik przekazywany do receive().

  • data – Opcjonalne surowe bajty zapisywane bezpośrednio po poleceniu AT (używane dla binarnych ładunków uplink).

  • timeout – Limit czasu odpowiedzi, w milisekundach.

  • raise_error – Gdy True, odpowiedzi błędów są konwertowane na wyjątki LoraError; gdy False, surowa odpowiedź jest zwracana do wywołującego.