lora — Controlador de módem LoRa

El módulo lora proporciona un controlador para el módem LoRa Murata CMWX1ZZABZ del Arduino Portenta Vision Shield. Expone una clase Lora de alto nivel que envuelve el conjunto de comandos AT utilizado por el firmware del módem (incluido el firmware Arduino MKRWAN ARD-078) para que una aplicación pueda unirse a una red LoRaWAN y enviar/recibir paquetes.

Ejemplo:

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)

Constantes

Modos de activación

lora.MODE_ABP: int

Modo de activación por personalización (Activation By Personalization).

lora.MODE_OTAA: int

Modo de activación por aire (Over-The-Air Activation).

Modos de salida de RF

lora.RF_MODE_RFO: int

Usar la salida de RF RFO (baja potencia) del módem.

lora.RF_MODE_PABOOST: int

Usar la salida de RF PA_BOOST (alta potencia) del módem.

Bandas

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 (Corea 920 MHz).

lora.BAND_IN865: int

Banda regional IN865 (India 865 MHz).

lora.BAND_US915: int

Banda regional US915 (Estados Unidos 915 MHz).

lora.BAND_US915_HYBRID: int

Plan regional híbrido (sub-banda) US915.

Clases de dispositivo

lora.CLASS_A: str

Dispositivo final LoRaWAN de Clase A.

lora.CLASS_B: str

Dispositivo final LoRaWAN de Clase B.

lora.CLASS_C: str

Dispositivo final LoRaWAN de Clase C.

Excepciones

exception lora.LoraError

Excepción base lanzada ante cualquier error devuelto por el módem o el controlador.

exception lora.LoraErrorTimeout

Se lanza cuando el módem no responde dentro del tiempo de espera configurado (el búfer de recepción está vacío).

exception lora.LoraErrorParam

Se lanza ante una respuesta +ERR_PARAM cuando se emitió un comando AT con un parámetro no válido.

exception lora.LoraErrorBusy

Se lanza ante una respuesta +ERR_BUSY cuando el módem está ocupado procesando un comando anterior.

exception lora.LoraErrorOverflow

Se lanza ante una respuesta +ERR_PARAM_OVERFLOW cuando un parámetro excede la longitud máxima permitida.

exception lora.LoraErrorNoNetwork

Se lanza ante una respuesta +ERR_NO_NETWORK cuando el módem no se ha unido a una red.

exception lora.LoraErrorRX

Se lanza ante una respuesta +ERR_RX cuando ocurre un error al recibir un enlace descendente.

exception lora.LoraErrorUnknown

Se lanza ante una respuesta +ERR_UNKNOWN o cuando el módem informa de un error no documentado.

Clases

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)

Construye un nuevo controlador de módem. El constructor inicializa (o crea automáticamente) la UART y los pines de reinicio/arranque, realiza un reinicio por hardware del módulo, ejecuta la sincronización autobaud, reinicia el módulo, consulta su versión de firmware y configura la band regional solicitada.

Parámetros:
  • uart – Instancia machine.UART preconfigurada que se usa para comunicarse con el módem. Si es None, el controlador abre UART(8, 19200) con tramas 8N2 (el valor predeterminado del Portenta Vision Shield).

  • rst_pinmachine.Pin que controla la línea de reinicio del módem. Si es None, se configura "PC6" como salida push-pull.

  • boot_pinmachine.Pin que controla la línea de selección de arranque del módem. Si es None, se configura "PG7" como salida push-pull con resistencia a nivel bajo.

  • band – Banda regional a configurar. Una de las constantes BAND_*.

  • poll_ms – Intervalo en milisegundos entre enlaces ascendentes vacíos automáticos disparados por poll() para mantener abierta la ventana de enlace descendente.

  • debug – Cuando es True, todo el tráfico de la UART se imprime mediante print().

LoraErrors: dict

Asignación de cadenas de respuesta de error del módem (p. ej. "+ERR_BUSY") a la clase de excepción correspondiente. Usada internamente por handle_error().

init_modem() None

Inicializa de forma diferida self.uart, self.rst_pin y self.boot_pin con sus valores predeterminados del Portenta Vision Shield si aún no están establecidos. Se llama desde el constructor; normalmente no la invoca el código del usuario.

debug_print(data: str) None

Imprime data si debug estaba habilitado en el momento de la construcción; de lo contrario, no hace nada.

is_arduino_firmware() bool

Devuelve True si el módem está ejecutando el firmware Arduino MKRWAN ARD-078 (detectado a partir de la cadena fw_version en caché).

configure_class(_class: str) None

Configura la clase de dispositivo LoRaWAN.

Parámetros:

_class – Una de CLASS_A, CLASS_B, CLASS_C.

configure_band(band: int) bool

Configura la banda regional y, en el firmware de Arduino con BAND_EU868, habilita el limitador de ciclo de trabajo ETSI. Devuelve True en caso de éxito.

Parámetros:

band – Una de las constantes BAND_*.

set_baudrate(baudrate: int) None

Cambia la velocidad en baudios de la UART del módem (AT+UART).

Parámetros:

baudrate – Nueva velocidad en baudios, en bits por segundo.

set_autobaud(timeout: int = 10000) bool

Envía comandos AT vacíos hasta que el módem responda con +OK o hasta que transcurran timeout milisegundos. Devuelve True si la sincronización tuvo éxito.

Parámetros:

timeout – Tiempo máximo a dedicar al intento, en milisegundos.

get_fw_version() str

Consulta la cadena del dispositivo del módem (AT+DEV?) y la versión de firmware (AT+VER?) y las devuelve como una única cadena separada por espacios.

get_device_eui() str

Devuelve el EUI de dispositivo de 64 bits del módem como una cadena hexadecimal.

factory_default() None

Restaura los valores de fábrica mediante AT+FACNEW.

restart() None

Vuelve a sincronizar la velocidad en baudios, reinicia el módem, vuelve a leer la versión de firmware y vuelve a aplicar la banda regional configurada. Lanza LoraError en caso de fallo.

set_rf_power(mode: int, power: int) None

Configura la etapa de salida de RF del módem (AT+RFPOWER).

Parámetros:
set_port(port: int) None

Configura el puerto de aplicación LoRaWAN (1..223) usado por las llamadas posteriores a send_data().

Parámetros:

port – FPort de LoRaWAN.

set_public_network(enable: bool) None

Habilita o deshabilita la palabra de sincronización de red pública.

Parámetros:

enableTrue para la palabra de sincronización pública de LoRaWAN, False para la privada.

sleep(enable: bool) None

Pone el módem en suspensión de baja potencia (True) o lo despierta (False).

format(hexMode: bool) None

Selecciona el formato de datos usado a través de la UART para los bytes de carga útil.

Parámetros:

hexModeTrue para el formato de carga útil ASCII-hex, False para binario sin procesar.

set_datarate(dr: int) None

Establece el índice de velocidad de datos de LoRaWAN (AT+DR).

Parámetros:

dr – Índice de velocidad de datos específico de la región.

get_datarate() int

Devuelve el índice de velocidad de datos actual de LoRaWAN.

set_adr(adr: bool) None

Habilita o deshabilita la velocidad de datos adaptativa (Adaptive Data Rate).

Parámetros:

adrTrue para habilitar ADR, False para deshabilitarla.

get_adr() int

Devuelve la configuración actual de ADR (1 si está habilitada, 0 en caso contrario).

get_devaddr() str

Devuelve el DevAddr de 32 bits actual como una cadena hexadecimal.

get_nwk_skey() str

Devuelve la clave de sesión de red (Network Session Key) actual como una cadena hexadecimal.

get_appskey() str

Devuelve la clave de sesión de aplicación (Application Session Key) actual como una cadena hexadecimal.

get_rx2dr() int

Devuelve el índice de velocidad de datos usado para la ventana de recepción RX2.

set_rx2dr(dr: int) None

Establece el índice de velocidad de datos usado para la ventana de recepción RX2.

Parámetros:

dr – Índice de velocidad de datos específico de la región.

get_ex2freq() int

Devuelve la frecuencia, en Hz, usada para la ventana de recepción RX2.

set_rx2freq(freq: int) None

Establece la frecuencia usada para la ventana de recepción RX2.

Parámetros:

freq – Frecuencia en Hz.

set_fcu(fcu: int) None

Establece el contador de tramas de enlace ascendente (AT+FCU).

Parámetros:

fcu – Nuevo valor del contador de tramas de enlace ascendente.

get_fcu() int

Devuelve el contador de tramas de enlace ascendente actual.

set_fcd(fcd: int) None

Establece el contador de tramas de enlace descendente (AT+FCD).

Parámetros:

fcd – Nuevo valor del contador de tramas de enlace descendente.

get_fcd() int

Devuelve el contador de tramas de enlace descendente actual.

change_mode(mode: int) None

Cambia el modo de activación.

Parámetros:

mode – Uno de MODE_ABP, MODE_OTAA.

join(timeout_ms: int) bool

Emite un AT+JOIN y espera el evento de aceptación de unión. Devuelve True si el módem informa de +EVENT=1,1 (unión exitosa) dentro de timeout_ms.

Parámetros:

timeout_ms – Tiempo máximo de espera tanto para el +ACK como para el evento de unión posterior, en milisegundos.

get_join_status() bool

Devuelve True si el módem está actualmente unido a una red.

get_max_size() int

Devuelve el tamaño máximo de carga útil de LoRaWAN, en bytes, para la velocidad de datos actual. En el firmware de Arduino esto es fijo en 64.

poll() None

Si han pasado más de poll_ms milisegundos desde la última llamada, envía un enlace ascendente confirmado vacío para vaciar los enlaces descendentes pendientes. Pensado para llamarse con frecuencia desde el bucle principal de la aplicación.

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

Transmite un enlace ascendente LoRaWAN. Lanza LoraError si buff es mayor que get_max_size().

Parámetros:
  • buff – Bytes de carga útil a transmitir.

  • confirmed – Cuando es True, envía un enlace ascendente confirmado (+CTX) y espera un +ACK del servidor de red. Cuando es False, envía un enlace ascendente no confirmado (+UTX).

Devuelve:

True si el módem aceptó el paquete (y, para enlaces ascendentes confirmados, la red lo confirmó), False en caso contrario.

receive_data(timeout: int = 1000) dict | None

Espera un enlace descendente. Devuelve None si no se recibió ningún evento +RECV dentro de timeout milisegundos; de lo contrario, un diccionario {"port": str, "data": str} que contiene el FPort y los bytes de carga útil.

Parámetros:

timeout – Tiempo máximo de espera, en milisegundos.

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

Lectura UART de bajo nivel. Lee caracteres del módem hasta que se encuentra un delimitador, se han leído max_bytes caracteres o transcurren timeout milisegundos, y luego devuelve la cadena acumulada con cualquier \r final eliminado.

Parámetros:
  • delimiter – Un único carácter para coincidir al final del búfer, una cadena de varios caracteres para comparar con el búfer recortado completo, o una lista de tales cadenas.

  • max_bytes – Si se establece, devuelve en cuanto se hayan leído exactamente esta cantidad de bytes.

  • timeout – Tiempo de espera total de lectura, en milisegundos.

available() int

Devuelve el número de bytes actualmente disponibles en el búfer de recepción de la UART del módem.

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

Cambia el módem al modo OTAA, programa las claves y los EUI suministrados, y luego intenta unirse a la red. Devuelve True si la unión tuvo éxito.

Parámetros:
  • appEui – EUI de aplicación/unión de 64 bits como cadena hexadecimal.

  • appKey – Clave de aplicación de 128 bits como cadena hexadecimal.

  • devEui – EUI de dispositivo de 64 bits opcional como cadena hexadecimal. Si es None, se usa el EUI de dispositivo programado de fábrica.

  • timeout – Tiempo de espera de unión, en milisegundos.

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

Cambia el módem al modo ABP, programa las direcciones y claves suministradas, y luego intenta unirse. Devuelve el resultado de get_join_status().

Parámetros:
  • nwkId – Identificador de red (actualmente ignorado por el firmware).

  • devAddr – Dirección de dispositivo de 32 bits como cadena hexadecimal.

  • nwkSKey – Clave de sesión de red de 128 bits como cadena hexadecimal.

  • appSKey – Clave de sesión de aplicación de 128 bits como cadena hexadecimal.

  • timeout – Tiempo de espera de unión, en milisegundos.

handle_error(command: str, data: str) None

Inspecciona una respuesta del módem y lanza la subclase LoraError correspondiente si representa un error. No hace nada para respuestas que no sean de error.

Parámetros:
  • command – El comando AT (sin el prefijo AT) que produjo data.

  • data – La cadena de respuesta devuelta por el módem.

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

Construye un comando AT a partir de cmd y args, opcionalmente añade una carga útil data sin procesar, lo transmite y devuelve la respuesta del módem. Para los comandos de consulta que terminan en ?, solo se devuelve la parte del valor (la subcadena después de =).

Parámetros:
  • cmd – Sufijo del comando AT (p. ej. "+JOIN", "+DR="); el prefijo "AT" y el \r final se añaden automáticamente.

  • args – Argumentos adicionales concatenados a cmd tras su conversión a cadena.

  • delimiter – Delimitador reenviado a receive().

  • data – Bytes sin procesar opcionales escritos inmediatamente después del comando AT (usados para cargas útiles binarias de enlace ascendente).

  • timeout – Tiempo de espera de respuesta, en milisegundos.

  • raise_error – Cuando es True, las respuestas de error se convierten en excepciones LoraError; cuando es False, la respuesta sin procesar se devuelve al llamador.