lora — ovladač LoRa modemu#

Modul lora poskytuje ovladač pro LoRa modem Murata CMWX1ZZABZ na Arduino Portenta Vision Shield. Vystavuje vysokoúrovňovou třídu Lora, která obaluje sadu AT příkazů používaných firmwarem modemu (včetně Arduino MKRWAN firmwaru ARD-078), takže se aplikace může připojit k síti LoRaWAN a odesílat/přijímat pakety.

Příklad:

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)

Konstanty#

Aktivační režimy#

lora.MODE_ABP: int#

Režim Activation By Personalization.

lora.MODE_OTAA: int#

Režim Over-The-Air Activation.

Režimy RF výstupu#

lora.RF_MODE_RFO: int#

Použít RFO (nízkopříkonový) RF výstup modemu.

lora.RF_MODE_PABOOST: int#

Použít PA_BOOST (vysokopříkonový) RF výstup modemu.

Pásma#

lora.BAND_AS923: int#

Regionální pásmo AS923 (Asie 923 MHz).

lora.BAND_AU915: int#

Regionální pásmo AU915 (Austrálie 915 MHz).

lora.BAND_EU868: int#

Regionální pásmo EU868 (Evropa 868 MHz).

lora.BAND_KR920: int#

Regionální pásmo KR920 (Korea 920 MHz).

lora.BAND_IN865: int#

Regionální pásmo IN865 (Indie 865 MHz).

lora.BAND_US915: int#

Regionální pásmo US915 (Spojené státy 915 MHz).

lora.BAND_US915_HYBRID: int#

Regionální plán US915 hybrid (sub-band).

Třídy zařízení#

lora.CLASS_A: str#

LoRaWAN koncové zařízení třídy A.

lora.CLASS_B: str#

LoRaWAN koncové zařízení třídy B.

lora.CLASS_C: str#

LoRaWAN koncové zařízení třídy C.

Výjimky#

exception lora.LoraError#

Základní výjimka vyvolaná při jakékoli chybě vrácené modemem nebo ovladačem.

exception lora.LoraErrorTimeout#

Vyvolá se, když modem neodpoví v nastaveném časovém limitu (přijímací buffer je prázdný).

exception lora.LoraErrorParam#

Vyvolá se při odpovědi +ERR_PARAM, když byl AT příkaz zadán s neplatným parametrem.

exception lora.LoraErrorBusy#

Vyvolá se při odpovědi +ERR_BUSY, když je modem zaneprázdněn zpracováním předchozího příkazu.

exception lora.LoraErrorOverflow#

Vyvolá se při odpovědi +ERR_PARAM_OVERFLOW, když parametr překročí maximální povolenou délku.

exception lora.LoraErrorNoNetwork#

Vyvolá se při odpovědi +ERR_NO_NETWORK, když se modem nepřipojil k síti.

exception lora.LoraErrorRX#

Vyvolá se při odpovědi +ERR_RX, když dojde k chybě při příjmu downlinku.

exception lora.LoraErrorUnknown#

Vyvolá se při odpovědi +ERR_UNKNOWN nebo když modem hlásí nezdokumentovanou chybu.

Třídy#

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

Vytvoří nový ovladač modemu. Konstruktor inicializuje (nebo automaticky vytvoří) UART a piny pro reset/boot, provede hardwarový reset modulu, vykoná synchronizaci autobaud, restartuje modul, dotáže se na verzi jeho firmwaru a nakonfiguruje požadované regionální pásmo band.

Parametry:
  • uart – Předkonfigurovaná instance machine.UART použitá pro komunikaci s modemem. Pokud je None, ovladač otevře UART(8, 19200) s rámcováním 8N2 (výchozí nastavení pro Portenta Vision Shield).

  • rst_pinmachine.Pin ovládající reset linku modemu. Pokud je None, "PC6" je nakonfigurován jako push-pull výstup.

  • boot_pinmachine.Pin ovládající boot-select linku modemu. Pokud je None, "PG7" je nakonfigurován jako push-pull výstup stažený k nízké úrovni.

  • band – Regionální pásmo, které se má nakonfigurovat. Jedna z konstant BAND_*.

  • poll_ms – Interval v milisekundách mezi automatickými prázdnými uplinky spouštěnými metodou poll() pro udržení otevřeného downlink okna.

  • debug – Když je True, veškerý UART provoz je vypisován pomocí print().

LoraErrors: dict#

Mapování z řetězců chybových odpovědí modemu (např. "+ERR_BUSY") na odpovídající třídu výjimky. Interně používáno metodou handle_error().

init_modem() None#

Líně inicializuje self.uart, self.rst_pin a self.boot_pin na jejich výchozí hodnoty pro Portenta Vision Shield, pokud ještě nejsou nastaveny. Volá se z konstruktoru; běžně se uživatelským kódem nevolá.

debug_print(data: str) None#

Vypíše data, pokud byl při konstrukci povolen debug, jinak neudělá nic.

is_arduino_firmware() bool#

Vrátí True, pokud modem běží na Arduino MKRWAN firmwaru ARD-078 (detekováno z uloženého řetězce fw_version).

configure_class(_class: str) None#

Nakonfiguruje třídu LoRaWAN zařízení.

Parametry:

_class – Jedna z CLASS_A, CLASS_B, CLASS_C.

configure_band(band: int) bool#

Nakonfiguruje regionální pásmo a na Arduino firmwaru s BAND_EU868 povolí ETSI omezovač pracovního cyklu. Při úspěchu vrátí True.

Parametry:

band – Jedna z konstant BAND_*.

set_baudrate(baudrate: int) None#

Změní přenosovou rychlost (baud rate) UART modemu (AT+UART).

Parametry:

baudrate – Nová přenosová rychlost (baud rate) v bitech za sekundu.

set_autobaud(timeout: int = 10000) bool#

Odesílá prázdné příkazy AT, dokud modem neodpoví +OK nebo dokud neuplyne timeout milisekund. Vrátí True, pokud synchronizace uspěla.

Parametry:

timeout – Maximální čas strávený pokusy, v milisekundách.

get_fw_version() str#

Dotáže se na řetězec zařízení modemu (AT+DEV?) a verzi firmwaru (AT+VER?) a vrátí je jako jediný řetězec oddělený mezerou.

get_device_eui() str#

Vrátí 64bitový Device EUI modemu jako hexadecimální řetězec.

factory_default() None#

Obnoví tovární nastavení pomocí AT+FACNEW.

restart() None#

Znovu synchronizuje přenosovou rychlost (baud rate), restartuje modem, znovu načte verzi firmwaru a znovu aplikuje nakonfigurované regionální pásmo. Při selhání vyvolá LoraError.

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

Nakonfiguruje stupeň RF výstupu modemu (AT+RFPOWER).

Parametry:
set_port(port: int) None#

Nakonfiguruje LoRaWAN aplikační port (1..223) používaný následnými voláními send_data().

Parametry:

port – LoRaWAN FPort.

set_public_network(enable: bool) None#

Povolí nebo zakáže sync word veřejné sítě.

Parametry:

enableTrue pro veřejný LoRaWAN sync word, False pro soukromý.

sleep(enable: bool) None#

Uvede modem do nízkopříkonového spánku (True) nebo jej probudí (False).

format(hexMode: bool) None#

Vybere datový formát používaný přes UART pro bajty payloadu.

Parametry:

hexModeTrue pro formát payloadu ASCII-hex, False pro surovou binární podobu.

set_datarate(dr: int) None#

Nastaví index LoRaWAN datové rychlosti (AT+DR).

Parametry:

dr – Index datové rychlosti specifický pro region.

get_datarate() int#

Vrátí aktuální index LoRaWAN datové rychlosti.

set_adr(adr: bool) None#

Povolí nebo zakáže Adaptive Data Rate.

Parametry:

adrTrue pro povolení ADR, False pro jeho zakázání.

get_adr() int#

Vrátí aktuální nastavení ADR (1 pokud je povoleno, jinak 0).

get_devaddr() str#

Vrátí aktuální 32bitový DevAddr jako hexadecimální řetězec.

get_nwk_skey() str#

Vrátí aktuální Network Session Key jako hexadecimální řetězec.

get_appskey() str#

Vrátí aktuální Application Session Key jako hexadecimální řetězec.

get_rx2dr() int#

Vrátí index datové rychlosti používaný pro přijímací okno RX2.

set_rx2dr(dr: int) None#

Nastaví index datové rychlosti používaný pro přijímací okno RX2.

Parametry:

dr – Index datové rychlosti specifický pro region.

get_ex2freq() int#

Vrátí frekvenci v Hz používanou pro přijímací okno RX2.

set_rx2freq(freq: int) None#

Nastaví frekvenci používanou pro přijímací okno RX2.

Parametry:

freq – Frekvence v Hz.

set_fcu(fcu: int) None#

Nastaví čítač uplink rámců (AT+FCU).

Parametry:

fcu – Nová hodnota čítače uplink rámců.

get_fcu() int#

Vrátí aktuální čítač uplink rámců.

set_fcd(fcd: int) None#

Nastaví čítač downlink rámců (AT+FCD).

Parametry:

fcd – Nová hodnota čítače downlink rámců.

get_fcd() int#

Vrátí aktuální čítač downlink rámců.

change_mode(mode: int) None#

Přepne aktivační režim.

Parametry:

mode – Jedna z MODE_ABP, MODE_OTAA.

join(timeout_ms: int) bool#

Vydá AT+JOIN a počká na událost join-accept. Vrátí True, pokud modem nahlásí +EVENT=1,1 (připojení uspělo) během timeout_ms.

Parametry:

timeout_ms – Maximální čas čekání na +ACK i následnou událost připojení, v milisekundách.

get_join_status() bool#

Vrátí True, pokud je modem aktuálně připojen k síti.

get_max_size() int#

Vrátí maximální velikost LoRaWAN payloadu v bajtech pro aktuální datovou rychlost. Na Arduino firmwaru je pevně nastavena na 64.

poll() None#

Pokud od posledního volání uplynulo více než poll_ms milisekund, odešle prázdný potvrzený uplink pro vyprázdnění čekajících downlinků. Určeno k častému volání z hlavní smyčky aplikace.

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

Odešle LoRaWAN uplink. Vyvolá LoraError, pokud je buff větší než get_max_size().

Parametry:
  • buff – Bajty payloadu k odeslání.

  • confirmed – Když je True, odešle potvrzený uplink (+CTX) a počká na +ACK od síťového serveru. Když je False, odešle nepotvrzený uplink (+UTX).

Vrací:

True, pokud modem přijal paket (a u potvrzených uplinků jej síť potvrdila), jinak False.

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

Počká na downlink. Vrátí None, pokud během timeout milisekund nebyla přijata žádná událost +RECV, jinak slovník {"port": str, "data": str} obsahující FPort a bajty payloadu.

Parametry:

timeout – Maximální čas čekání, v milisekundách.

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

Nízkoúrovňové čtení UART. Čte znaky z modemu, dokud není shodný oddělovač, dokud není načteno max_bytes znaků nebo dokud neuplyne timeout milisekund, poté vrátí nahromaděný řetězec s odstraněným koncovým \r.

Parametry:
  • delimiter – Buď jeden znak, který se má shodovat na konci bufferu, víceznakový řetězec, který se má shodovat s celým oříznutým bufferem, nebo seznam takových řetězců.

  • max_bytes – Pokud je nastaveno, vrátí se, jakmile je načteno přesně tolik bajtů.

  • timeout – Celkový časový limit čtení, v milisekundách.

available() int#

Vrátí počet bajtů aktuálně dostupných v přijímacím bufferu UART modemu.

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

Přepne modem do režimu OTAA, naprogramuje dodané klíče a EUI a poté se pokusí připojit k síti. Vrátí True, pokud připojení uspělo.

Parametry:
  • appEui – 64bitový Application/Join EUI jako hexadecimální řetězec.

  • appKey – 128bitový Application Key jako hexadecimální řetězec.

  • devEui – Volitelný 64bitový Device EUI jako hexadecimální řetězec. Pokud je None, použije se tovární naprogramovaný Device EUI.

  • timeout – Časový limit připojení, v milisekundách.

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

Přepne modem do režimu ABP, naprogramuje dodané adresy a klíče a poté se pokusí připojit. Vrátí výsledek get_join_status().

Parametry:
  • nwkId – Identifikátor sítě (aktuálně firmwarem ignorováno).

  • devAddr – 32bitová adresa zařízení (Device Address) jako hexadecimální řetězec.

  • nwkSKey – 128bitový Network Session Key jako hexadecimální řetězec.

  • appSKey – 128bitový Application Session Key jako hexadecimální řetězec.

  • timeout – Časový limit připojení, v milisekundách.

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

Prozkoumá odpověď modemu a vyvolá odpovídající podtřídu LoraError, pokud představuje chybu. U nechybových odpovědí neudělá nic.

Parametry:
  • command – AT příkaz (bez prefixu AT), který vyprodukoval data.

  • data – Řetězec odpovědi vrácený modemem.

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

Sestaví AT příkaz z cmd a args, volitelně připojí surový payload data, odešle jej a vrátí odpověď modemu. U dotazovacích příkazů končících na ? se vrací pouze hodnotová část (podřetězec za =).

Parametry:
  • cmd – Přípona AT příkazu (např. "+JOIN", "+DR="); prefix "AT" a koncový \r se přidávají automaticky.

  • args – Další argumenty zřetězené k cmd po převodu na řetězec.

  • delimiter – Oddělovač předaný metodě receive().

  • data – Volitelné surové bajty zapsané ihned po AT příkazu (používané pro binární payloady uplinku).

  • timeout – Časový limit odpovědi, v milisekundách.

  • raise_error – Když je True, chybové odpovědi se převedou na výjimky LoraError; když je False, surová odpověď se vrátí volajícímu.