lora — LoRa-modemdriver

De lora-module biedt een driver voor de Murata CMWX1ZZABZ LoRa-modem op het Arduino Portenta Vision Shield. Hij stelt een hoogniveau Lora-klasse beschikbaar die de AT-commandoset omsluit die door de modemfirmware wordt gebruikt (waaronder de Arduino MKRWAN ARD-078-firmware), zodat een applicatie zich kan aansluiten op een LoRaWAN-netwerk en pakketten kan verzenden/ontvangen.

Voorbeeld:

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)

Constanten

Activeringsmodi

lora.MODE_ABP: int

Modus Activation By Personalization.

lora.MODE_OTAA: int

Modus Over-The-Air Activation.

RF-uitgangsmodi

lora.RF_MODE_RFO: int

Gebruik de RFO-uitgang (laag vermogen) van de modem.

lora.RF_MODE_PABOOST: int

Gebruik de PA_BOOST-uitgang (hoog vermogen) van de modem.

Banden

lora.BAND_AS923: int

Regionale band AS923 (Azië 923 MHz).

lora.BAND_AU915: int

Regionale band AU915 (Australië 915 MHz).

lora.BAND_EU868: int

Regionale band EU868 (Europa 868 MHz).

lora.BAND_KR920: int

Regionale band KR920 (Korea 920 MHz).

lora.BAND_IN865: int

Regionale band IN865 (India 865 MHz).

lora.BAND_US915: int

Regionale band US915 (Verenigde Staten 915 MHz).

lora.BAND_US915_HYBRID: int

Regionaal plan US915 hybride (sub-band).

Apparaatklassen

lora.CLASS_A: str

LoRaWAN-eindapparaat Klasse A.

lora.CLASS_B: str

LoRaWAN-eindapparaat Klasse B.

lora.CLASS_C: str

LoRaWAN-eindapparaat Klasse C.

Uitzonderingen

exception lora.LoraError

Basisuitzondering die wordt opgegooid voor elke fout die door de modem of de driver wordt teruggegeven.

exception lora.LoraErrorTimeout

Opgegooid wanneer de modem niet reageert binnen de geconfigureerde timeout (de ontvangstbuffer is leeg).

exception lora.LoraErrorParam

Opgegooid bij een +ERR_PARAM-respons wanneer een AT-commando is uitgevoerd met een ongeldige parameter.

exception lora.LoraErrorBusy

Opgegooid bij een +ERR_BUSY-respons wanneer de modem bezig is met het verwerken van een vorig commando.

exception lora.LoraErrorOverflow

Opgegooid bij een +ERR_PARAM_OVERFLOW-respons wanneer een parameter de maximaal toegestane lengte overschrijdt.

exception lora.LoraErrorNoNetwork

Opgegooid bij een +ERR_NO_NETWORK-respons wanneer de modem zich niet bij een netwerk heeft aangesloten.

exception lora.LoraErrorRX

Opgegooid bij een +ERR_RX-respons wanneer er een fout optreedt tijdens het ontvangen van een downlink.

exception lora.LoraErrorUnknown

Opgegooid bij een +ERR_UNKNOWN-respons of wanneer de modem een ongedocumenteerde fout meldt.

Klassen

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)

Construeert een nieuwe modemdriver. De constructor initialiseert (of maakt automatisch aan) de UART en de reset-/boot-pinnen, voert een hardware-reset van de module uit, voert autobaud-synchronisatie uit, herstart de module, vraagt de firmwareversie op en configureert de gevraagde regionale band.

Parameters:
  • uart – Vooraf geconfigureerde machine.UART-instantie die wordt gebruikt om met de modem te communiceren. Als None, opent de driver UART(8, 19200) met 8N2-framing (de standaard van het Portenta Vision Shield).

  • rst_pinmachine.Pin die de resetlijn van de modem aanstuurt. Als None, wordt "PC6" geconfigureerd als push-pull-uitgang.

  • boot_pinmachine.Pin die de boot-selectlijn van de modem aanstuurt. Als None, wordt "PG7" geconfigureerd als push-pull-uitgang die laag wordt getrokken.

  • band – De te configureren regionale band. Een van de BAND_*-constanten.

  • poll_ms – Interval in milliseconden tussen automatische lege uplinks die door poll() worden geactiveerd om het downlink-venster open te houden.

  • debug – Wanneer True, wordt al het UART-verkeer afgedrukt via print().

LoraErrors: dict

Toewijzing van modemfoutresponsstrings (bijv. "+ERR_BUSY") aan de bijbehorende uitzonderingsklasse. Intern gebruikt door handle_error().

init_modem() None

Initialiseert self.uart, self.rst_pin en self.boot_pin lui naar hun standaardwaarden voor het Portenta Vision Shield als ze nog niet zijn ingesteld. Wordt aangeroepen vanuit de constructor; normaal niet aangeroepen door gebruikerscode.

debug_print(data: str) None

Drukt data af als debug was ingeschakeld tijdens het construeren, en doet anders niets.

is_arduino_firmware() bool

Geeft True terug als de modem de Arduino MKRWAN ARD-078-firmware draait (gedetecteerd vanuit de gecachte fw_version-string).

configure_class(_class: str) None

Configureert de LoRaWAN-apparaatklasse.

Parameters:

_class – Een van CLASS_A, CLASS_B, CLASS_C.

configure_band(band: int) bool

Configureert de regionale band en schakelt, op Arduino-firmware met BAND_EU868, de ETSI duty-cycle-begrenzer in. Geeft True terug bij succes.

Parameters:

band – Een van de BAND_*-constanten.

set_baudrate(baudrate: int) None

Wijzigt de UART-baudrate van de modem (AT+UART).

Parameters:

baudrate – Nieuwe baudrate, in bits per seconde.

set_autobaud(timeout: int = 10000) bool

Verzendt lege AT-commando’s totdat de modem reageert met +OK of totdat timeout milliseconden zijn verstreken. Geeft True terug als de synchronisatie is gelukt.

Parameters:

timeout – Maximale tijd die aan de poging wordt besteed, in milliseconden.

get_fw_version() str

Vraagt de apparaatstring van de modem op (AT+DEV?) en de firmwareversie (AT+VER?) en geeft deze terug als één string gescheiden door een spatie.

get_device_eui() str

Geeft de 64-bits Device EUI van de modem terug als een hexstring.

factory_default() None

Herstelt de fabrieksinstellingen via AT+FACNEW.

restart() None

Hersynchroniseert de baudrate, herstart de modem, leest de firmwareversie opnieuw uit en past de geconfigureerde regionale band opnieuw toe. Gooit LoraError op bij mislukking.

set_rf_power(mode: int, power: int) None

Configureert de RF-uitgangstrap van de modem (AT+RFPOWER).

Parameters:
set_port(port: int) None

Configureert de LoRaWAN-applicatiepoort (1..223) die door volgende send_data()-aanroepen wordt gebruikt.

Parameters:

port – LoRaWAN FPort.

set_public_network(enable: bool) None

Schakelt het sync-woord voor het publieke netwerk in of uit.

Parameters:

enableTrue voor het publieke LoRaWAN-sync-woord, False voor het privé sync-woord.

sleep(enable: bool) None

Zet de modem in energiezuinige slaapstand (True) of wekt hem op (False).

format(hexMode: bool) None

Selecteert het dataformaat dat over de UART wordt gebruikt voor payloadbytes.

Parameters:

hexModeTrue voor het ASCII-hex-payloadformaat, False voor ruwe binaire data.

set_datarate(dr: int) None

Stelt de LoRaWAN-datasnelheidindex in (AT+DR).

Parameters:

dr – Regiospecifieke datasnelheidindex.

get_datarate() int

Geeft de huidige LoRaWAN-datasnelheidindex terug.

set_adr(adr: bool) None

Schakelt Adaptive Data Rate in of uit.

Parameters:

adrTrue om ADR in te schakelen, False om het uit te schakelen.

get_adr() int

Geeft de huidige ADR-instelling terug (1 indien ingeschakeld, anders 0).

get_devaddr() str

Geeft het huidige 32-bits DevAddr terug als een hexstring.

get_nwk_skey() str

Geeft de huidige Network Session Key terug als een hexstring.

get_appskey() str

Geeft de huidige Application Session Key terug als een hexstring.

get_rx2dr() int

Geeft de datasnelheidindex terug die voor het RX2-ontvangstvenster wordt gebruikt.

set_rx2dr(dr: int) None

Stelt de datasnelheidindex in die voor het RX2-ontvangstvenster wordt gebruikt.

Parameters:

dr – Regiospecifieke datasnelheidindex.

get_ex2freq() int

Geeft de frequentie, in Hz, terug die voor het RX2-ontvangstvenster wordt gebruikt.

set_rx2freq(freq: int) None

Stelt de frequentie in die voor het RX2-ontvangstvenster wordt gebruikt.

Parameters:

freq – Frequentie in Hz.

set_fcu(fcu: int) None

Stelt de uplink-frameteller in (AT+FCU).

Parameters:

fcu – Nieuwe waarde voor de uplink-frameteller.

get_fcu() int

Geeft de huidige uplink-frameteller terug.

set_fcd(fcd: int) None

Stelt de downlink-frameteller in (AT+FCD).

Parameters:

fcd – Nieuwe waarde voor de downlink-frameteller.

get_fcd() int

Geeft de huidige downlink-frameteller terug.

change_mode(mode: int) None

Schakelt de activeringsmodus om.

Parameters:

mode – Een van MODE_ABP, MODE_OTAA.

join(timeout_ms: int) bool

Geeft een AT+JOIN af en wacht op de join-accept-gebeurtenis. Geeft True terug als de modem +EVENT=1,1 meldt (aansluiting geslaagd) binnen timeout_ms.

Parameters:

timeout_ms – Maximale tijd om te wachten op zowel de +ACK als de daaropvolgende join-gebeurtenis, in milliseconden.

get_join_status() bool

Geeft True terug als de modem momenteel is aangesloten op een netwerk.

get_max_size() int

Geeft de maximale LoRaWAN-payloadgrootte, in bytes, terug voor de huidige datasnelheid. Op Arduino-firmware is dit vast ingesteld op 64.

poll() None

Als er meer dan poll_ms milliseconden zijn verstreken sinds de laatste aanroep, verzendt een lege bevestigde uplink om openstaande downlinks door te spoelen. Bedoeld om frequent aangeroepen te worden vanuit de hoofdlus van de applicatie.

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

Verzendt een LoRaWAN-uplink. Gooit LoraError op als buff groter is dan get_max_size().

Parameters:
  • buff – Te verzenden payloadbytes.

  • confirmed – Wanneer True, verzendt een bevestigde uplink (+CTX) en wacht op een +ACK van de netwerkserver. Wanneer False, verzendt een onbevestigde uplink (+UTX).

Geeft terug:

True als de modem het pakket heeft geaccepteerd (en, voor bevestigde uplinks, het netwerk het heeft bevestigd), anders False.

receive_data(timeout: int = 1000) dict | None

Wacht op een downlink. Geeft None terug als er binnen timeout milliseconden geen +RECV-gebeurtenis is ontvangen, anders een dict {"port": str, "data": str} met de FPort en de payloadbytes.

Parameters:

timeout – Maximale tijd om te wachten, in milliseconden.

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

Laagniveau UART-lezing. Leest tekens van de modem totdat een scheidingsteken overeenkomt, max_bytes tekens zijn gelezen, of timeout milliseconden zijn verstreken, en geeft dan de opgebouwde string terug met een eventuele afsluitende \r verwijderd.

Parameters:
  • delimiter – Ofwel een enkel teken dat aan het einde van de buffer moet worden gematcht, een string van meerdere tekens die tegen de volledige getrimde buffer wordt gematcht, of een lijst van zulke strings.

  • max_bytes – Indien ingesteld, geeft terug zodra exact dit aantal bytes is gelezen.

  • timeout – Algehele lees-timeout, in milliseconden.

available() int

Geeft het aantal bytes terug dat momenteel beschikbaar is in de UART-ontvangstbuffer van de modem.

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

Schakelt de modem naar OTAA-modus, programmeert de opgegeven sleutels en EUI’s, en probeert vervolgens zich bij het netwerk aan te sluiten. Geeft True terug als de aansluiting is gelukt.

Parameters:
  • appEui – 64-bits Application/Join EUI als een hexstring.

  • appKey – 128-bits Application Key als een hexstring.

  • devEui – Optionele 64-bits Device EUI als een hexstring. Als None, wordt de in de fabriek geprogrammeerde Device EUI gebruikt.

  • timeout – Join-timeout, in milliseconden.

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

Schakelt de modem naar ABP-modus, programmeert de opgegeven adressen en sleutels, en probeert vervolgens zich aan te sluiten. Geeft het resultaat van get_join_status() terug.

Parameters:
  • nwkId – Netwerkidentifier (momenteel genegeerd door de firmware).

  • devAddr – 32-bits Device Address als een hexstring.

  • nwkSKey – 128-bits Network Session Key als een hexstring.

  • appSKey – 128-bits Application Session Key als een hexstring.

  • timeout – Join-timeout, in milliseconden.

handle_error(command: str, data: str) None

Inspecteert een modemrespons en gooit de bijbehorende LoraError-subklasse op als deze een fout vertegenwoordigt. Doet niets voor niet-foutresponsen.

Parameters:
  • command – Het AT-commando (zonder het AT-voorvoegsel) dat data heeft geproduceerd.

  • data – De responsstring die door de modem is teruggegeven.

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

Bouwt een AT-commando op uit cmd en args, voegt optioneel een ruwe data-payload toe, verzendt het, en geeft de respons van de modem terug. Voor query-commando’s die eindigen op ? wordt alleen het waardegedeelte teruggegeven (de substring na =).

Parameters:
  • cmd – AT-commandosuffix (bijv. "+JOIN", "+DR="); het "AT"-voorvoegsel en de afsluitende \r worden automatisch toegevoegd.

  • args – Aanvullende argumenten die na stringconversie aan cmd worden geconcateneerd.

  • delimiter – Scheidingsteken doorgegeven aan receive().

  • data – Optionele ruwe bytes die direct na het AT-commando worden geschreven (gebruikt voor binaire uplink-payloads).

  • timeout – Respons-timeout, in milliseconden.

  • raise_error – Wanneer True, worden foutresponsen omgezet in LoraError-uitzonderingen; wanneer False, wordt de ruwe respons aan de aanroeper teruggegeven.