lora — LoRa modem upravljački program#

Modul lora pruža upravljački program za Murata CMWX1ZZABZ LoRa modem na Arduino Portenta Vision Shield. Izlaže visokorazinsku klasu Lora koja omata skup AT naredbi koje koristi firmware modema (uključujući Arduino MKRWAN ARD-078 firmware) tako da aplikacija može pristupiti LoRaWAN mreži te slati/primati pakete.

Primjer:

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)

Konstante#

Načini aktivacije#

lora.MODE_ABP: int#

Način aktivacije personalizacijom (Activation By Personalization).

lora.MODE_OTAA: int#

Način aktivacije putem zraka (Over-The-Air Activation).

Načini RF izlaza#

lora.RF_MODE_RFO: int#

Koristi RFO (niskoenergetski) RF izlaz modema.

lora.RF_MODE_PABOOST: int#

Koristi PA_BOOST (visokoenergetski) RF izlaz modema.

Pojasevi#

lora.BAND_AS923: int#

AS923 (Azija 923 MHz) regionalni pojas.

lora.BAND_AU915: int#

AU915 (Australija 915 MHz) regionalni pojas.

lora.BAND_EU868: int#

EU868 (Europa 868 MHz) regionalni pojas.

lora.BAND_KR920: int#

KR920 (Koreja 920 MHz) regionalni pojas.

lora.BAND_IN865: int#

IN865 (Indija 865 MHz) regionalni pojas.

lora.BAND_US915: int#

US915 (Sjedinjene Američke Države 915 MHz) regionalni pojas.

lora.BAND_US915_HYBRID: int#

US915 hibridni (pod-pojas) regionalni plan.

Klase uređaja#

lora.CLASS_A: str#

LoRaWAN krajnji uređaj klase A.

lora.CLASS_B: str#

LoRaWAN krajnji uređaj klase B.

lora.CLASS_C: str#

LoRaWAN krajnji uređaj klase C.

Iznimke#

exception lora.LoraError#

Osnovna iznimka koja se podiže za bilo kakvu pogrešku koju vrati modem ili upravljački program.

exception lora.LoraErrorTimeout#

Podiže se kada modem ne odgovori unutar konfiguriranog vremena čekanja (međuspremnik za primanje je prazan).

exception lora.LoraErrorParam#

Podiže se kod +ERR_PARAM odgovora kada je AT naredba izdana s nevažećim parametrom.

exception lora.LoraErrorBusy#

Podiže se kod +ERR_BUSY odgovora kada je modem zauzet obradom prethodne naredbe.

exception lora.LoraErrorOverflow#

Podiže se kod +ERR_PARAM_OVERFLOW odgovora kada parametar premašuje najveću dopuštenu duljinu.

exception lora.LoraErrorNoNetwork#

Podiže se kod +ERR_NO_NETWORK odgovora kada se modem nije pridružio mreži.

exception lora.LoraErrorRX#

Podiže se kod +ERR_RX odgovora kada dođe do pogreške tijekom primanja silazne veze.

exception lora.LoraErrorUnknown#

Podiže se kod +ERR_UNKNOWN odgovora ili kada modem prijavi nedokumentiranu pogrešku.

Klase#

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

Konstruira novi upravljački program modema. Konstruktor inicijalizira (ili automatski kreira) UART i pinove za reset/boot, izvodi hardverski reset modula, obavlja autobaud sinkronizaciju, ponovno pokreće modul, ispituje verziju njegovog firmwarea te konfigurira traženi regionalni band.

Parametri:
  • uart – Unaprijed konfigurirana machine.UART instanca koja se koristi za komunikaciju s modemom. Ako je None, upravljački program otvara UART(8, 19200) s 8N2 okvirima (zadana postavka za Portenta Vision Shield).

  • rst_pinmachine.Pin koji upravlja reset linijom modema. Ako je None, "PC6" se konfigurira kao push-pull izlaz.

  • boot_pinmachine.Pin koji upravlja boot-select linijom modema. Ako je None, "PG7" se konfigurira kao push-pull izlaz povučen na nisko.

  • band – Regionalni pojas koji se konfigurira. Jedna od BAND_* konstanti.

  • poll_ms – Interval u milisekundama između automatskih praznih uzlaznih veza koje pokreće poll() kako bi prozor silazne veze ostao otvoren.

  • debug – Kada je True, sav UART promet se ispisuje putem print().

LoraErrors: dict#

Mapiranje iz nizova odgovora pogreške modema (npr. "+ERR_BUSY") na odgovarajuću klasu iznimke. Koristi se interno od strane handle_error().

init_modem() None#

Lijeno inicijalizira self.uart, self.rst_pin i self.boot_pin na njihove zadane vrijednosti za Portenta Vision Shield ako još nisu postavljeni. Poziva se iz konstruktora; obično ga ne poziva korisnički kod.

debug_print(data: str) None#

Ispisuje data ako je debug bio omogućen u trenutku konstrukcije, inače ne čini ništa.

is_arduino_firmware() bool#

Vraća True ako modem koristi Arduino MKRWAN ARD-078 firmware (otkriveno iz keširanog fw_version niza).

configure_class(_class: str) None#

Konfigurira klasu LoRaWAN uređaja.

Parametri:

_class – Jedna od CLASS_A, CLASS_B, CLASS_C.

configure_band(band: int) bool#

Konfigurira regionalni pojas i, na Arduino firmwareu s BAND_EU868, omogućuje ETSI ograničivač radnog ciklusa. Vraća True u slučaju uspjeha.

Parametri:

band – Jedna od BAND_* konstanti.

set_baudrate(baudrate: int) None#

Mijenja UART brzinu prijenosa modema (AT+UART).

Parametri:

baudrate – Nova brzina prijenosa, u bitovima u sekundi.

set_autobaud(timeout: int = 10000) bool#

Šalje prazne AT naredbe dok modem ne odgovori s +OK ili dok ne prođe timeout milisekundi. Vraća True ako je sinkronizacija uspjela.

Parametri:

timeout – Najveće vrijeme provedeno u pokušaju, u milisekundama.

get_fw_version() str#

Ispituje niz uređaja modema (AT+DEV?) i verziju firmwarea (AT+VER?) te ih vraća kao jedan niz razdvojen razmakom.

get_device_eui() str#

Vraća 64-bitni Device EUI modema kao heksadecimalni niz.

factory_default() None#

Vraća tvorničke zadane postavke putem AT+FACNEW.

restart() None#

Ponovno sinkronizira brzinu prijenosa, ponovno pokreće modem, ponovno čita verziju firmwarea i ponovno primjenjuje konfigurirani regionalni pojas. Podiže LoraError u slučaju neuspjeha.

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

Konfigurira RF izlazni stupanj modema (AT+RFPOWER).

Parametri:
set_port(port: int) None#

Konfigurira LoRaWAN aplikacijski port (1..223) koji koriste naknadni pozivi send_data().

Parametri:

port – LoRaWAN FPort.

set_public_network(enable: bool) None#

Omogućuje ili onemogućuje sync word javne mreže.

Parametri:

enableTrue za javni LoRaWAN sync word, False za privatni.

sleep(enable: bool) None#

Stavlja modem u niskoenergetsko mirovanje (True) ili ga budi (False).

format(hexMode: bool) None#

Odabire format podataka koji se koristi preko UART-a za bajtove korisnog tereta.

Parametri:

hexModeTrue za ASCII-hex format korisnog tereta, False za sirovi binarni.

set_datarate(dr: int) None#

Postavlja indeks LoRaWAN brzine podataka (AT+DR).

Parametri:

dr – Indeks brzine podataka specifičan za regiju.

get_datarate() int#

Vraća trenutni indeks LoRaWAN brzine podataka.

set_adr(adr: bool) None#

Omogućuje ili onemogućuje prilagodljivu brzinu podataka (Adaptive Data Rate).

Parametri:

adrTrue za omogućavanje ADR-a, False za onemogućavanje.

get_adr() int#

Vraća trenutnu ADR postavku (1 ako je omogućeno, 0 inače).

get_devaddr() str#

Vraća trenutni 32-bitni DevAddr kao heksadecimalni niz.

get_nwk_skey() str#

Vraća trenutni Network Session Key kao heksadecimalni niz.

get_appskey() str#

Vraća trenutni Application Session Key kao heksadecimalni niz.

get_rx2dr() int#

Vraća indeks brzine podataka koji se koristi za RX2 prozor primanja.

set_rx2dr(dr: int) None#

Postavlja indeks brzine podataka koji se koristi za RX2 prozor primanja.

Parametri:

dr – Indeks brzine podataka specifičan za regiju.

get_ex2freq() int#

Vraća frekvenciju, u Hz, koja se koristi za RX2 prozor primanja.

set_rx2freq(freq: int) None#

Postavlja frekvenciju koja se koristi za RX2 prozor primanja.

Parametri:

freq – Frekvencija u Hz.

set_fcu(fcu: int) None#

Postavlja brojač uzlaznih sličica (AT+FCU).

Parametri:

fcu – Nova vrijednost brojača uzlaznih sličica.

get_fcu() int#

Vraća trenutni brojač uzlaznih sličica.

set_fcd(fcd: int) None#

Postavlja brojač silaznih sličica (AT+FCD).

Parametri:

fcd – Nova vrijednost brojača silaznih sličica.

get_fcd() int#

Vraća trenutni brojač silaznih sličica.

change_mode(mode: int) None#

Mijenja način aktivacije.

Parametri:

mode – Jedna od MODE_ABP, MODE_OTAA.

join(timeout_ms: int) bool#

Izdaje AT+JOIN i čeka na događaj prihvaćanja pridruživanja. Vraća True ako modem prijavi +EVENT=1,1 (pridruživanje uspjelo) unutar timeout_ms.

Parametri:

timeout_ms – Najveće vrijeme čekanja za oba +ACK i naknadni događaj pridruživanja, u milisekundama.

get_join_status() bool#

Vraća True ako je modem trenutno pridružen mreži.

get_max_size() int#

Vraća najveću veličinu LoRaWAN korisnog tereta, u bajtovima, za trenutnu brzinu podataka. Na Arduino firmwareu to je fiksno 64.

poll() None#

Ako je od posljednjeg poziva prošlo više od poll_ms milisekundi, šalje praznu potvrđenu uzlaznu vezu kako bi se ispraznile silazne veze koje čekaju. Namijenjeno za često pozivanje iz glavne petlje aplikacije.

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

Šalje LoRaWAN uzlaznu vezu. Podiže LoraError ako je buff veći od get_max_size().

Parametri:
  • buff – Bajtovi korisnog tereta za slanje.

  • confirmed – Kada je True, šalje potvrđenu uzlaznu vezu (+CTX) i čeka na +ACK mrežnog poslužitelja. Kada je False, šalje nepotvrđenu uzlaznu vezu (+UTX).

Vraća:

True ako je modem prihvatio paket (i, za potvrđene uzlazne veze, mreža ga je potvrdila), False inače.

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

Čeka na silaznu vezu. Vraća None ako nijedan +RECV događaj nije primljen unutar timeout milisekundi, inače rječnik {"port": str, "data": str} koji sadrži FPort i bajtove korisnog tereta.

Parametri:

timeout – Najveće vrijeme čekanja, u milisekundama.

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

Niskorazinsko UART čitanje. Čita znakove s modema dok se ne podudari razdjelnik, dok se ne pročita max_bytes znakova, ili dok ne prođe timeout milisekundi, zatim vraća akumulirani niz s uklonjenim svim završnim \r.

Parametri:
  • delimiter – Ili jedan znak za podudaranje na kraju međuspremnika, niz s više znakova za podudaranje s cijelim obrezanim međuspremnikom, ili popis takvih nizova.

  • max_bytes – Ako je postavljeno, vraća se čim se pročita točno toliko bajtova.

  • timeout – Ukupno vrijeme čekanja čitanja, u milisekundama.

available() int#

Vraća broj bajtova trenutno dostupnih u UART međuspremniku za primanje modema.

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

Prebacuje modem u OTAA način, programira priložene ključeve i EUI-jeve, zatim pokušava pristupiti mreži. Vraća True ako je pridruživanje uspjelo.

Parametri:
  • appEui – 64-bitni Application/Join EUI kao heksadecimalni niz.

  • appKey – 128-bitni Application Key kao heksadecimalni niz.

  • devEui – Opcionalni 64-bitni Device EUI kao heksadecimalni niz. Ako je None, koristi se tvornički programirani Device EUI.

  • timeout – Vrijeme čekanja pridruživanja, u milisekundama.

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

Prebacuje modem u ABP način, programira priložene adrese i ključeve, zatim pokušava pristupiti. Vraća rezultat get_join_status().

Parametri:
  • nwkId – Identifikator mreže (trenutno ga firmware ignorira).

  • devAddr – 32-bitna adresa uređaja kao heksadecimalni niz.

  • nwkSKey – 128-bitni Network Session Key kao heksadecimalni niz.

  • appSKey – 128-bitni Application Session Key kao heksadecimalni niz.

  • timeout – Vrijeme čekanja pridruživanja, u milisekundama.

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

Pregledava odgovor modema i podiže odgovarajuću LoraError podklasu ako predstavlja pogrešku. Ne čini ništa za odgovore koji nisu pogreške.

Parametri:
  • command – AT naredba (bez AT prefiksa) koja je proizvela data.

  • data – Niz odgovora koji vraća modem.

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

Gradi AT naredbu iz cmd i args, opcionalno dodaje sirovi data korisni teret, šalje je i vraća odgovor modema. Za upitne naredbe koje završavaju s ?, vraća se samo dio s vrijednošću (podniz nakon =).

Parametri:
  • cmd – Sufiks AT naredbe (npr. "+JOIN", "+DR="); "AT" prefiks i završni \r dodaju se automatski.

  • args – Dodatni argumenti spojeni na cmd nakon pretvorbe u niz.

  • delimiter – Razdjelnik proslijeđen na receive().

  • data – Opcionalni sirovi bajtovi zapisani neposredno nakon AT naredbe (koriste se za binarne korisne terete uzlazne veze).

  • timeout – Vrijeme čekanja odgovora, u milisekundama.

  • raise_error – Kada je True, odgovori s pogreškom pretvaraju se u LoraError iznimke; kada je False, sirovi odgovor se vraća pozivatelju.