lora — driver del modem LoRa#

Il modulo lora fornisce un driver per il modem LoRa Murata CMWX1ZZABZ presente sull’Arduino Portenta Vision Shield. Espone una classe Lora di alto livello che incapsula il set di comandi AT utilizzato dal firmware del modem (incluso il firmware Arduino MKRWAN ARD-078) in modo che un’applicazione possa unirsi a una rete LoRaWAN e inviare/ricevere pacchetti.

Esempio:

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)

Costanti#

Modalità di attivazione#

lora.MODE_ABP: int#

Modalità Activation By Personalization.

lora.MODE_OTAA: int#

Modalità Over-The-Air Activation.

Modalità di uscita RF#

lora.RF_MODE_RFO: int#

Usa l’uscita RF RFO (a bassa potenza) del modem.

lora.RF_MODE_PABOOST: int#

Usa l’uscita RF PA_BOOST (ad alta potenza) del modem.

Bande#

lora.BAND_AS923: int#

Banda regionale AS923 (Asia 923 MHz).

lora.BAND_AU915: int#

Banda regionale AU915 (Australia 915 MHz).

lora.BAND_EU868: int#

Banda regionale EU868 (Europa 868 MHz).

lora.BAND_KR920: int#

Banda regionale KR920 (Corea 920 MHz).

lora.BAND_IN865: int#

Banda regionale IN865 (India 865 MHz).

lora.BAND_US915: int#

Banda regionale US915 (Stati Uniti 915 MHz).

lora.BAND_US915_HYBRID: int#

Piano regionale US915 ibrido (sotto-banda).

Classi di dispositivo#

lora.CLASS_A: str#

Dispositivo terminale LoRaWAN di Classe A.

lora.CLASS_B: str#

Dispositivo terminale LoRaWAN di Classe B.

lora.CLASS_C: str#

Dispositivo terminale LoRaWAN di Classe C.

Eccezioni#

exception lora.LoraError#

Eccezione di base sollevata per qualsiasi errore restituito dal modem o dal driver.

exception lora.LoraErrorTimeout#

Sollevata quando il modem non risponde entro il timeout configurato (il buffer di ricezione è vuoto).

exception lora.LoraErrorParam#

Sollevata su una risposta +ERR_PARAM quando un comando AT è stato emesso con un parametro non valido.

exception lora.LoraErrorBusy#

Sollevata su una risposta +ERR_BUSY quando il modem è occupato a elaborare un comando precedente.

exception lora.LoraErrorOverflow#

Sollevata su una risposta +ERR_PARAM_OVERFLOW quando un parametro supera la lunghezza massima consentita.

exception lora.LoraErrorNoNetwork#

Sollevata su una risposta +ERR_NO_NETWORK quando il modem non si è unito a una rete.

exception lora.LoraErrorRX#

Sollevata su una risposta +ERR_RX quando si verifica un errore durante la ricezione di un downlink.

exception lora.LoraErrorUnknown#

Sollevata su una risposta +ERR_UNKNOWN o quando il modem segnala un errore non documentato.

Classi#

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

Costruisce un nuovo driver del modem. Il costruttore inizializza (o crea automaticamente) la UART e i pin di reset/boot, esegue un reset hardware del modulo, esegue la sincronizzazione autobaud, riavvia il modulo, ne interroga la versione del firmware e configura la band regionale richiesta.

Parametri:
  • uart – Istanza machine.UART pre-configurata usata per comunicare con il modem. Se None, il driver apre UART(8, 19200) con framing 8N2 (il valore predefinito del Portenta Vision Shield).

  • rst_pin – Istanza machine.Pin che pilota la linea di reset del modem. Se None, "PC6" viene configurato come uscita push-pull.

  • boot_pin – Istanza machine.Pin che pilota la linea di boot-select del modem. Se None, "PG7" viene configurato come uscita push-pull tirata a livello basso.

  • band – Banda regionale da configurare. Una delle costanti BAND_*.

  • poll_ms – Intervallo in millisecondi tra gli uplink vuoti automatici attivati da poll() per mantenere aperta la finestra di downlink.

  • debug – Quando è True, tutto il traffico UART viene stampato tramite print().

LoraErrors: dict#

Mappatura dalle stringhe di risposta di errore del modem (es. "+ERR_BUSY") alla corrispondente classe di eccezione. Usata internamente da handle_error().

init_modem() None#

Inizializza pigramente self.uart, self.rst_pin e self.boot_pin ai loro valori predefiniti del Portenta Vision Shield se non sono già impostati. Chiamato dal costruttore; normalmente non invocato dal codice utente.

debug_print(data: str) None#

Stampa data se debug era abilitato al momento della costruzione, altrimenti non fa nulla.

is_arduino_firmware() bool#

Restituisce True se il modem esegue il firmware Arduino MKRWAN ARD-078 (rilevato dalla stringa fw_version memorizzata in cache).

configure_class(_class: str) None#

Configura la classe di dispositivo LoRaWAN.

Parametri:

_class – Una tra CLASS_A, CLASS_B, CLASS_C.

configure_band(band: int) bool#

Configura la banda regionale e, sul firmware Arduino con BAND_EU868, abilita il limitatore del duty-cycle ETSI. Restituisce True in caso di successo.

Parametri:

band – Una delle costanti BAND_*.

set_baudrate(baudrate: int) None#

Modifica il baud rate della UART del modem (AT+UART).

Parametri:

baudrate – Nuovo baud rate, in bit al secondo.

set_autobaud(timeout: int = 10000) bool#

Invia comandi AT vuoti finché il modem non risponde con +OK o finché non trascorrono timeout millisecondi. Restituisce True se la sincronizzazione è riuscita.

Parametri:

timeout – Tempo massimo da dedicare al tentativo, in millisecondi.

get_fw_version() str#

Interroga la stringa del dispositivo modem (AT+DEV?) e la versione del firmware (AT+VER?) e le restituisce come un’unica stringa separata da spazi.

get_device_eui() str#

Restituisce il Device EUI a 64 bit del modem come stringa esadecimale.

factory_default() None#

Ripristina le impostazioni di fabbrica tramite AT+FACNEW.

restart() None#

Ri-sincronizza il baud rate, riavvia il modem, rilegge la versione del firmware e riapplica la banda regionale configurata. Solleva LoraError in caso di errore.

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

Configura lo stadio di uscita RF del modem (AT+RFPOWER).

Parametri:
set_port(port: int) None#

Configura la porta dell’applicazione LoRaWAN (1..223) usata dalle successive chiamate a send_data().

Parametri:

port – FPort LoRaWAN.

set_public_network(enable: bool) None#

Abilita o disabilita la sync word di rete pubblica.

Parametri:

enableTrue per la sync word LoRaWAN pubblica, False per quella privata.

sleep(enable: bool) None#

Mette il modem in modalità sleep a basso consumo (True) o lo risveglia (False).

format(hexMode: bool) None#

Seleziona il formato dei dati usato sulla UART per i byte del payload.

Parametri:

hexModeTrue per il formato di payload ASCII-hex, False per il binario grezzo.

set_datarate(dr: int) None#

Imposta l’indice del data rate LoRaWAN (AT+DR).

Parametri:

dr – Indice del data rate specifico per regione.

get_datarate() int#

Restituisce l’indice corrente del data rate LoRaWAN.

set_adr(adr: bool) None#

Abilita o disabilita l’Adaptive Data Rate.

Parametri:

adrTrue per abilitare l’ADR, False per disabilitarlo.

get_adr() int#

Restituisce l’impostazione corrente dell’ADR (1 se abilitato, 0 altrimenti).

get_devaddr() str#

Restituisce il DevAddr a 32 bit corrente come stringa esadecimale.

get_nwk_skey() str#

Restituisce la Network Session Key corrente come stringa esadecimale.

get_appskey() str#

Restituisce l’Application Session Key corrente come stringa esadecimale.

get_rx2dr() int#

Restituisce l’indice del data rate usato per la finestra di ricezione RX2.

set_rx2dr(dr: int) None#

Imposta l’indice del data rate usato per la finestra di ricezione RX2.

Parametri:

dr – Indice del data rate specifico per regione.

get_ex2freq() int#

Restituisce la frequenza, in Hz, usata per la finestra di ricezione RX2.

set_rx2freq(freq: int) None#

Imposta la frequenza usata per la finestra di ricezione RX2.

Parametri:

freq – Frequenza in Hz.

set_fcu(fcu: int) None#

Imposta il contatore di frame di uplink (AT+FCU).

Parametri:

fcu – Nuovo valore del contatore di frame di uplink.

get_fcu() int#

Restituisce il contatore di frame di uplink corrente.

set_fcd(fcd: int) None#

Imposta il contatore di frame di downlink (AT+FCD).

Parametri:

fcd – Nuovo valore del contatore di frame di downlink.

get_fcd() int#

Restituisce il contatore di frame di downlink corrente.

change_mode(mode: int) None#

Cambia la modalità di attivazione.

Parametri:

mode – Una tra MODE_ABP, MODE_OTAA.

join(timeout_ms: int) bool#

Emette un AT+JOIN e attende l’evento di join-accept. Restituisce True se il modem segnala +EVENT=1,1 (join riuscito) entro timeout_ms.

Parametri:

timeout_ms – Tempo massimo di attesa sia per l”+ACK sia per il successivo evento di join, in millisecondi.

get_join_status() bool#

Restituisce True se il modem è attualmente unito a una rete.

get_max_size() int#

Restituisce la dimensione massima del payload LoRaWAN, in byte, per il data rate corrente. Sul firmware Arduino questa è fissata a 64.

poll() None#

Se sono trascorsi più di poll_ms millisecondi dall’ultima chiamata, invia un uplink confermato vuoto per svuotare i downlink in sospeso. Pensato per essere chiamato frequentemente dal loop principale dell’applicazione.

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

Trasmette un uplink LoRaWAN. Solleva LoraError se buff è più grande di get_max_size().

Parametri:
  • buff – Byte del payload da trasmettere.

  • confirmed – Quando è True, invia un uplink confermato (+CTX) e attende un +ACK dal network server. Quando è False, invia un uplink non confermato (+UTX).

Ritorna:

True se il modem ha accettato il pacchetto (e, per gli uplink confermati, la rete lo ha riconosciuto), False altrimenti.

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

Attende un downlink. Restituisce None se non è stato ricevuto alcun evento +RECV entro timeout millisecondi, altrimenti un dizionario {"port": str, "data": str} contenente l’FPort e i byte del payload.

Parametri:

timeout – Tempo massimo di attesa, in millisecondi.

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

Lettura UART di basso livello. Legge caratteri dal modem finché non viene trovato un delimitatore, finché non sono stati letti max_bytes caratteri, o finché non trascorrono timeout millisecondi, quindi restituisce la stringa accumulata con eventuali \r finali rimossi.

Parametri:
  • delimiter – Un singolo carattere da confrontare alla fine del buffer, una stringa di più caratteri da confrontare con l’intero buffer ripulito, oppure una lista di tali stringhe.

  • max_bytes – Se impostato, restituisce non appena sono stati letti esattamente questi byte.

  • timeout – Timeout di lettura complessivo, in millisecondi.

available() int#

Restituisce il numero di byte attualmente disponibili nel buffer di ricezione UART del modem.

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

Commuta il modem in modalità OTAA, programma le chiavi e gli EUI forniti, quindi tenta di unirsi alla rete. Restituisce True se il join è riuscito.

Parametri:
  • appEui – Application/Join EUI a 64 bit come stringa esadecimale.

  • appKey – Application Key a 128 bit come stringa esadecimale.

  • devEui – Device EUI a 64 bit opzionale come stringa esadecimale. Se None, viene usato il Device EUI programmato in fabbrica.

  • timeout – Timeout del join, in millisecondi.

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

Commuta il modem in modalità ABP, programma gli indirizzi e le chiavi forniti, quindi tenta di unirsi. Restituisce il risultato di get_join_status().

Parametri:
  • nwkId – Identificatore di rete (attualmente ignorato dal firmware).

  • devAddr – Device Address a 32 bit come stringa esadecimale.

  • nwkSKey – Network Session Key a 128 bit come stringa esadecimale.

  • appSKey – Application Session Key a 128 bit come stringa esadecimale.

  • timeout – Timeout del join, in millisecondi.

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

Esamina una risposta del modem e solleva la sottoclasse LoraError corrispondente se rappresenta un errore. Non fa nulla per le risposte che non sono errori.

Parametri:
  • command – Il comando AT (senza il prefisso AT) che ha prodotto data.

  • data – La stringa di risposta restituita dal modem.

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

Costruisce un comando AT a partire da cmd e args, opzionalmente accoda un payload data grezzo, lo trasmette e restituisce la risposta del modem. Per i comandi di query che terminano con ?, viene restituita solo la parte del valore (la sottostringa dopo =).

Parametri:
  • cmd – Suffisso del comando AT (es. "+JOIN", "+DR="); il prefisso "AT" e il \r finale vengono aggiunti automaticamente.

  • args – Argomenti aggiuntivi concatenati a cmd dopo la conversione in stringa.

  • delimiter – Delimitatore inoltrato a receive().

  • data – Byte grezzi opzionali scritti immediatamente dopo il comando AT (usati per i payload di uplink binari).

  • timeout – Timeout della risposta, in millisecondi.

  • raise_error – Quando è True, le risposte di errore vengono convertite in eccezioni LoraError; quando è False, la risposta grezza viene restituita al chiamante.