lora — driver pentru modem LoRa#

Modulul lora oferă un driver pentru modemul LoRa Murata CMWX1ZZABZ de pe Arduino Portenta Vision Shield. Acesta expune o clasă Lora de nivel înalt care încapsulează setul de comenzi AT folosit de firmware-ul modemului (inclusiv firmware-ul Arduino MKRWAN ARD-078), astfel încât o aplicație să se poată conecta la o rețea LoRaWAN și să trimită/primească pachete.

Exemplu:

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)

Constante#

Moduri de activare#

lora.MODE_ABP: int#

Mod de activare prin personalizare (Activation By Personalization).

lora.MODE_OTAA: int#

Mod de activare prin aer (Over-The-Air Activation).

Moduri de ieșire RF#

lora.RF_MODE_RFO: int#

Folosește ieșirea RF RFO (consum redus) a modemului.

lora.RF_MODE_PABOOST: int#

Folosește ieșirea RF PA_BOOST (putere mare) a modemului.

Benzi#

lora.BAND_AS923: int#

Banda regională AS923 (Asia 923 MHz).

lora.BAND_AU915: int#

Banda regională AU915 (Australia 915 MHz).

lora.BAND_EU868: int#

Banda regională EU868 (Europa 868 MHz).

lora.BAND_KR920: int#

Banda regională KR920 (Coreea 920 MHz).

lora.BAND_IN865: int#

Banda regională IN865 (India 865 MHz).

lora.BAND_US915: int#

Banda regională US915 (Statele Unite 915 MHz).

lora.BAND_US915_HYBRID: int#

Planul regional US915 hibrid (sub-bandă).

Clase de dispozitive#

lora.CLASS_A: str#

Dispozitiv final LoRaWAN de clasă A.

lora.CLASS_B: str#

Dispozitiv final LoRaWAN de clasă B.

lora.CLASS_C: str#

Dispozitiv final LoRaWAN de clasă C.

Excepții#

exception lora.LoraError#

Excepție de bază generată pentru orice eroare returnată de modem sau de driver.

exception lora.LoraErrorTimeout#

Generată atunci când modemul nu răspunde în intervalul de timp configurat (tamponul de recepție este gol).

exception lora.LoraErrorParam#

Generată la un răspuns +ERR_PARAM atunci când o comandă AT a fost emisă cu un parametru invalid.

exception lora.LoraErrorBusy#

Generată la un răspuns +ERR_BUSY atunci când modemul este ocupat cu procesarea unei comenzi anterioare.

exception lora.LoraErrorOverflow#

Generată la un răspuns +ERR_PARAM_OVERFLOW atunci când un parametru depășește lungimea maximă permisă.

exception lora.LoraErrorNoNetwork#

Generată la un răspuns +ERR_NO_NETWORK atunci când modemul nu s-a conectat la o rețea.

exception lora.LoraErrorRX#

Generată la un răspuns +ERR_RX atunci când apare o eroare în timpul recepției unui downlink.

exception lora.LoraErrorUnknown#

Generată la un răspuns +ERR_UNKNOWN sau atunci când modemul raportează o eroare nedocumentată.

Clase#

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

Construiește un nou driver de modem. Constructorul inițializează (sau creează automat) UART-ul și pinii de reset/boot, efectuează un reset hardware al modulului, realizează sincronizarea autobaud, repornește modulul, interoghează versiunea firmware-ului și configurează banda regională band solicitată.

Parametrii:
  • uart – Instanță machine.UART preconfigurată folosită pentru a comunica cu modemul. Dacă este None, driverul deschide UART(8, 19200) cu cadrare 8N2 (valoarea implicită pentru Portenta Vision Shield).

  • rst_pin – Instanță machine.Pin care controlează linia de reset a modemului. Dacă este None, "PC6" este configurat ca ieșire push-pull.

  • boot_pin – Instanță machine.Pin care controlează linia de selecție boot a modemului. Dacă este None, "PG7" este configurat ca ieșire push-pull menținută în starea joasă.

  • band – Banda regională de configurat. Una dintre constantele BAND_*.

  • poll_ms – Intervalul în milisecunde dintre uplink-urile goale automate declanșate de poll() pentru a menține deschisă fereastra de downlink.

  • debug – Când este True, tot traficul UART este afișat prin print().

LoraErrors: dict#

Mapare de la șirurile de răspuns de eroare ale modemului (de ex. "+ERR_BUSY") la clasa de excepție corespunzătoare. Folosită intern de handle_error().

init_modem() None#

Inițializează leneș self.uart, self.rst_pin și self.boot_pin la valorile implicite pentru Portenta Vision Shield dacă nu sunt deja setate. Apelată din constructor; în mod normal nu este invocată de codul utilizatorului.

debug_print(data: str) None#

Afișează data dacă debug a fost activat la construire, altfel nu face nimic.

is_arduino_firmware() bool#

Returnează True dacă modemul rulează firmware-ul Arduino MKRWAN ARD-078 (detectat din șirul fw_version din cache).

configure_class(_class: str) None#

Configurează clasa dispozitivului LoRaWAN.

Parametrii:

_class – Una dintre CLASS_A, CLASS_B, CLASS_C.

configure_band(band: int) bool#

Configurează banda regională și, pe firmware Arduino cu BAND_EU868, activează limitatorul de ciclu de funcționare ETSI. Returnează True în caz de succes.

Parametrii:

band – Una dintre constantele BAND_*.

set_baudrate(baudrate: int) None#

Modifică rata baud a UART-ului modemului (AT+UART).

Parametrii:

baudrate – Noua rată baud, în biți pe secundă.

set_autobaud(timeout: int = 10000) bool#

Trimite comenzi AT goale până când modemul răspunde cu +OK sau până când trec timeout milisecunde. Returnează True dacă sincronizarea a reușit.

Parametrii:

timeout – Timpul maxim alocat încercării, în milisecunde.

get_fw_version() str#

Interoghează șirul de identificare al dispozitivului modem (AT+DEV?) și versiunea firmware-ului (AT+VER?) și le returnează ca un singur șir separat prin spațiu.

get_device_eui() str#

Returnează Device EUI pe 64 de biți al modemului ca șir hexazecimal.

factory_default() None#

Restabilește valorile implicite din fabrică prin AT+FACNEW.

restart() None#

Resincronizează rata baud, repornește modemul, recitește versiunea firmware-ului și reaplică banda regională configurată. Generează LoraError în caz de eșec.

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

Configurează etajul de ieșire RF al modemului (AT+RFPOWER).

Parametrii:
set_port(port: int) None#

Configurează portul aplicației LoRaWAN (1..223) folosit de apelurile ulterioare send_data().

Parametrii:

port – FPort-ul LoRaWAN.

set_public_network(enable: bool) None#

Activează sau dezactivează cuvântul de sincronizare pentru rețeaua publică.

Parametrii:

enableTrue pentru cuvântul de sincronizare LoRaWAN public, False pentru cel privat.

sleep(enable: bool) None#

Pune modemul în modul de repaus cu consum redus (True) sau îl trezește (False).

format(hexMode: bool) None#

Selectează formatul de date folosit pe UART pentru octeții de payload.

Parametrii:

hexModeTrue pentru formatul de payload ASCII-hex, False pentru binar brut.

set_datarate(dr: int) None#

Setează indexul ratei de date LoRaWAN (AT+DR).

Parametrii:

dr – Indexul ratei de date specific regiunii.

get_datarate() int#

Returnează indexul curent al ratei de date LoRaWAN.

set_adr(adr: bool) None#

Activează sau dezactivează rata de date adaptivă (Adaptive Data Rate).

Parametrii:

adrTrue pentru a activa ADR, False pentru a-l dezactiva.

get_adr() int#

Returnează setarea curentă ADR (1 dacă este activată, 0 în caz contrar).

get_devaddr() str#

Returnează DevAddr-ul curent pe 32 de biți ca șir hexazecimal.

get_nwk_skey() str#

Returnează cheia curentă de sesiune de rețea (Network Session Key) ca șir hexazecimal.

get_appskey() str#

Returnează cheia curentă de sesiune de aplicație (Application Session Key) ca șir hexazecimal.

get_rx2dr() int#

Returnează indexul ratei de date folosit pentru fereastra de recepție RX2.

set_rx2dr(dr: int) None#

Setează indexul ratei de date folosit pentru fereastra de recepție RX2.

Parametrii:

dr – Indexul ratei de date specific regiunii.

get_ex2freq() int#

Returnează frecvența, în Hz, folosită pentru fereastra de recepție RX2.

set_rx2freq(freq: int) None#

Setează frecvența folosită pentru fereastra de recepție RX2.

Parametrii:

freq – Frecvența în Hz.

set_fcu(fcu: int) None#

Setează contorul de cadre de uplink (AT+FCU).

Parametrii:

fcu – Noua valoare a contorului de cadre de uplink.

get_fcu() int#

Returnează contorul curent de cadre de uplink.

set_fcd(fcd: int) None#

Setează contorul de cadre de downlink (AT+FCD).

Parametrii:

fcd – Noua valoare a contorului de cadre de downlink.

get_fcd() int#

Returnează contorul curent de cadre de downlink.

change_mode(mode: int) None#

Comută modul de activare.

Parametrii:

mode – Una dintre MODE_ABP, MODE_OTAA.

join(timeout_ms: int) bool#

Emite un AT+JOIN și așteaptă evenimentul de acceptare a conectării. Returnează True dacă modemul raportează +EVENT=1,1 (conectare reușită) în intervalul timeout_ms.

Parametrii:

timeout_ms – Timpul maxim de așteptare pentru +ACK și pentru evenimentul de conectare ulterior, în milisecunde.

get_join_status() bool#

Returnează True dacă modemul este în prezent conectat la o rețea.

get_max_size() int#

Returnează dimensiunea maximă a payload-ului LoRaWAN, în octeți, pentru rata de date curentă. Pe firmware Arduino aceasta este fixată la 64.

poll() None#

Dacă au trecut mai mult de poll_ms milisecunde de la ultimul apel, trimite un uplink confirmat gol pentru a goli downlink-urile în așteptare. Destinată apelării frecvente din bucla principală a aplicației.

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

Transmite un uplink LoRaWAN. Generează LoraError dacă buff este mai mare decât get_max_size().

Parametrii:
  • buff – Octeții de payload de transmis.

  • confirmed – Când este True, trimite un uplink confirmat (+CTX) și așteaptă un +ACK de la serverul de rețea. Când este False, trimite un uplink neconfirmat (+UTX).

Întoarce:

True dacă modemul a acceptat pachetul (și, pentru uplink-urile confirmate, rețeaua l-a confirmat), False în caz contrar.

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

Așteaptă un downlink. Returnează None dacă niciun eveniment +RECV nu a fost primit în timeout milisecunde, altfel un dicționar {"port": str, "data": str} care conține FPort-ul și octeții de payload.

Parametrii:

timeout – Timpul maxim de așteptare, în milisecunde.

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

Citire UART de nivel scăzut. Citește caractere de la modem până când este găsit un delimitator, până când au fost citite max_bytes caractere sau până când trec timeout milisecunde, apoi returnează șirul acumulat cu orice \r final eliminat.

Parametrii:
  • delimiter – Fie un singur caracter de potrivit la sfârșitul tamponului, fie un șir cu mai multe caractere de potrivit cu întregul tampon ajustat, fie o listă de astfel de șiruri.

  • max_bytes – Dacă este setat, returnează imediat ce au fost citiți exact atâția octeți.

  • timeout – Timpul total de așteptare la citire, în milisecunde.

available() int#

Returnează numărul de octeți disponibili în prezent în tamponul de recepție UART al modemului.

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

Comută modemul în modul OTAA, programează cheile și EUI-urile furnizate, apoi încearcă să se conecteze la rețea. Returnează True dacă conectarea a reușit.

Parametrii:
  • appEui – Application/Join EUI pe 64 de biți ca șir hexazecimal.

  • appKey – Application Key pe 128 de biți ca șir hexazecimal.

  • devEui – Device EUI opțional pe 64 de biți ca șir hexazecimal. Dacă este None, se folosește Device EUI programat din fabrică.

  • timeout – Timpul limită pentru conectare, în milisecunde.

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

Comută modemul în modul ABP, programează adresele și cheile furnizate, apoi încearcă să se conecteze. Returnează rezultatul lui get_join_status().

Parametrii:
  • nwkId – Identificatorul de rețea (în prezent ignorat de firmware).

  • devAddr – Device Address pe 32 de biți ca șir hexazecimal.

  • nwkSKey – Network Session Key pe 128 de biți ca șir hexazecimal.

  • appSKey – Application Session Key pe 128 de biți ca șir hexazecimal.

  • timeout – Timpul limită pentru conectare, în milisecunde.

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

Inspectează un răspuns al modemului și generează subclasa LoraError corespunzătoare dacă acesta reprezintă o eroare. Nu face nimic pentru răspunsurile care nu sunt erori.

Parametrii:
  • command – Comanda AT (fără prefixul AT) care a produs data.

  • data – Șirul de răspuns returnat de modem.

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

Construiește o comandă AT din cmd și args, opțional adaugă un payload brut data, o transmite și returnează răspunsul modemului. Pentru comenzile de interogare care se termină cu ?, este returnată doar porțiunea de valoare (subșirul de după =).

Parametrii:
  • cmd – Sufixul comenzii AT (de ex. "+JOIN", "+DR="); prefixul "AT" și \r final sunt adăugate automat.

  • args – Argumente suplimentare concatenate la cmd după conversia în șir.

  • delimiter – Delimitatorul transmis mai departe către receive().

  • data – Octeți bruți opționali scriși imediat după comanda AT (folosiți pentru payload-uri de uplink binare).

  • timeout – Timpul limită pentru răspuns, în milisecunde.

  • raise_error – Când este True, răspunsurile de eroare sunt convertite în excepții LoraError; când este False, răspunsul brut este returnat apelantului.