lora — pilote de modem LoRa#

Le module lora fournit un pilote pour le modem LoRa Murata CMWX1ZZABZ présent sur l’Arduino Portenta Vision Shield. Il expose une classe haut niveau Lora qui encapsule le jeu de commandes AT utilisé par le micrologiciel du modem (y compris le micrologiciel Arduino MKRWAN ARD-078), permettant ainsi à une application de rejoindre un réseau LoRaWAN et d’envoyer/recevoir des paquets.

Exemple

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#

Modes d’activation#

lora.MODE_ABP: int#

Mode Activation By Personalization.

lora.MODE_OTAA: int#

Mode Over-The-Air Activation.

Modes de sortie RF#

lora.RF_MODE_RFO: int#

Utiliser la sortie RF RFO (basse puissance) du modem.

lora.RF_MODE_PABOOST: int#

Utiliser la sortie RF PA_BOOST (haute puissance) du modem.

Bandes#

lora.BAND_AS923: int#

Bande régionale AS923 (Asie 923 MHz).

lora.BAND_AU915: int#

Bande régionale AU915 (Australie 915 MHz).

lora.BAND_EU868: int#

Bande régionale EU868 (Europe 868 MHz).

lora.BAND_KR920: int#

Bande régionale KR920 (Corée 920 MHz).

lora.BAND_IN865: int#

Bande régionale IN865 (Inde 865 MHz).

lora.BAND_US915: int#

Bande régionale US915 (États-Unis 915 MHz).

lora.BAND_US915_HYBRID: int#

Plan régional hybride US915 (sous-bande).

Classes de périphériques#

lora.CLASS_A: str#

Périphérique terminal LoRaWAN de classe A.

lora.CLASS_B: str#

Périphérique terminal LoRaWAN de classe B.

lora.CLASS_C: str#

Périphérique terminal LoRaWAN de classe C.

Exceptions#

exception lora.LoraError#

Exception de base levée pour toute erreur renvoyée par le modem ou le pilote.

exception lora.LoraErrorTimeout#

Levée lorsque le modem ne répond pas dans le délai configuré (le tampon de réception est vide).

exception lora.LoraErrorParam#

Levée lors d’une réponse +ERR_PARAM lorsqu’une commande AT a été émise avec un paramètre invalide.

exception lora.LoraErrorBusy#

Levée lors d’une réponse +ERR_BUSY lorsque le modem est occupé à traiter une commande précédente.

exception lora.LoraErrorOverflow#

Levée lors d’une réponse +ERR_PARAM_OVERFLOW lorsqu’un paramètre dépasse la longueur maximale autorisée.

exception lora.LoraErrorNoNetwork#

Levée lors d’une réponse +ERR_NO_NETWORK lorsque le modem n’a pas rejoint de réseau.

exception lora.LoraErrorRX#

Levée lors d’une réponse +ERR_RX lorsqu’une erreur survient pendant la réception d’une liaison descendante.

exception lora.LoraErrorUnknown#

Levée lors d’une réponse +ERR_UNKNOWN ou lorsque le modem signale une erreur non documentée.

Classes#

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

Construit un nouveau pilote de modem. Le constructeur initialise (ou crée automatiquement) l’UART et les broches de réinitialisation/démarrage, effectue une réinitialisation matérielle du module, réalise une synchronisation autobaud, redémarre le module, interroge sa version de micrologiciel et configure la band régionale demandée.

Paramètres:
  • uart – Instance machine.UART préconfigurée utilisée pour communiquer avec le modem. Si None, le pilote ouvre UART(8, 19200) avec un cadrage 8N2 (la valeur par défaut du Portenta Vision Shield).

  • rst_pinmachine.Pin pilotant la ligne de réinitialisation du modem. Si None, "PC6" est configurée comme sortie push-pull.

  • boot_pinmachine.Pin pilotant la ligne de sélection de démarrage du modem. Si None, "PG7" est configurée comme sortie push-pull tirée à l’état bas.

  • band – Bande régionale à configurer. L’une des constantes BAND_*.

  • poll_ms – Intervalle en millisecondes entre les liaisons montantes vides automatiques déclenchées par poll() afin de maintenir ouverte la fenêtre de liaison descendante.

  • debug – Lorsque True, tout le trafic UART est affiché via print().

LoraErrors: dict#

Correspondance entre les chaînes de réponse d’erreur du modem (par ex. "+ERR_BUSY") et la classe d’exception correspondante. Utilisée en interne par handle_error().

init_modem() None#

Initialise paresseusement self.uart, self.rst_pin et self.boot_pin avec leurs valeurs par défaut du Portenta Vision Shield si elles ne sont pas déjà définies. Appelée depuis le constructeur ; n’est normalement pas invoquée par le code utilisateur.

debug_print(data: str) None#

Affiche data si debug a été activé lors de la construction, sinon ne fait rien.

is_arduino_firmware() bool#

Renvoie True si le modem exécute le micrologiciel Arduino MKRWAN ARD-078 (détecté à partir de la chaîne fw_version mise en cache).

configure_class(_class: str) None#

Configure la classe de périphérique LoRaWAN.

Paramètres:

_class – L’une des valeurs CLASS_A, CLASS_B, CLASS_C.

configure_band(band: int) bool#

Configure la bande régionale et, sur micrologiciel Arduino avec BAND_EU868, active le limiteur de rapport cyclique ETSI. Renvoie True en cas de succès.

Paramètres:

band – L’une des constantes BAND_*.

set_baudrate(baudrate: int) None#

Modifie le débit en bauds de l’UART du modem (AT+UART).

Paramètres:

baudrate – Nouveau débit en bauds, en bits par seconde.

set_autobaud(timeout: int = 10000) bool#

Envoie des commandes AT vides jusqu’à ce que le modem réponde par +OK ou jusqu’à ce que timeout millisecondes s’écoulent. Renvoie True si la synchronisation a réussi.

Paramètres:

timeout – Temps maximal à consacrer à la tentative, en millisecondes.

get_fw_version() str#

Interroge la chaîne de périphérique du modem (AT+DEV?) et la version du micrologiciel (AT+VER?) et les renvoie sous la forme d’une seule chaîne séparée par des espaces.

get_device_eui() str#

Renvoie le Device EUI 64 bits du modem sous forme de chaîne hexadécimale.

factory_default() None#

Restaure les valeurs d’usine par défaut via AT+FACNEW.

restart() None#

Resynchronise le débit en bauds, redémarre le modem, relit la version du micrologiciel et réapplique la bande régionale configurée. Lève LoraError en cas d’échec.

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

Configure l’étage de sortie RF du modem (AT+RFPOWER).

Paramètres:
  • mode – L’une des valeurs RF_MODE_RFO, RF_MODE_PABOOST.

  • power – Indice de puissance de sortie, en unités spécifiques au micrologiciel.

set_port(port: int) None#

Configure le port applicatif LoRaWAN (1..223) utilisé par les appels send_data() ultérieurs.

Paramètres:

port – FPort LoRaWAN.

set_public_network(enable: bool) None#

Active ou désactive le mot de synchronisation du réseau public.

Paramètres:

enableTrue pour le mot de synchronisation LoRaWAN public, False pour le mot privé.

sleep(enable: bool) None#

Met le modem en veille basse consommation (True) ou le réveille (False).

format(hexMode: bool) None#

Sélectionne le format de données utilisé sur l’UART pour les octets de charge utile.

Paramètres:

hexModeTrue pour un format de charge utile ASCII-hex, False pour du binaire brut.

set_datarate(dr: int) None#

Définit l’indice de débit de données LoRaWAN (AT+DR).

Paramètres:

dr – Indice de débit de données spécifique à la région.

get_datarate() int#

Renvoie l’indice de débit de données LoRaWAN actuel.

set_adr(adr: bool) None#

Active ou désactive l’Adaptive Data Rate.

Paramètres:

adrTrue pour activer l’ADR, False pour le désactiver.

get_adr() int#

Renvoie le réglage ADR actuel (1 si activé, 0 sinon).

get_devaddr() str#

Renvoie le DevAddr 32 bits actuel sous forme de chaîne hexadécimale.

get_nwk_skey() str#

Renvoie la clé de session réseau (Network Session Key) actuelle sous forme de chaîne hexadécimale.

get_appskey() str#

Renvoie la clé de session applicative (Application Session Key) actuelle sous forme de chaîne hexadécimale.

get_rx2dr() int#

Renvoie l’indice de débit de données utilisé pour la fenêtre de réception RX2.

set_rx2dr(dr: int) None#

Définit l’indice de débit de données utilisé pour la fenêtre de réception RX2.

Paramètres:

dr – Indice de débit de données spécifique à la région.

get_ex2freq() int#

Renvoie la fréquence, en Hz, utilisée pour la fenêtre de réception RX2.

set_rx2freq(freq: int) None#

Définit la fréquence utilisée pour la fenêtre de réception RX2.

Paramètres:

freq – Fréquence en Hz.

set_fcu(fcu: int) None#

Définit le compteur de trames de liaison montante (AT+FCU).

Paramètres:

fcu – Nouvelle valeur du compteur de trames de liaison montante.

get_fcu() int#

Renvoie le compteur de trames de liaison montante actuel.

set_fcd(fcd: int) None#

Définit le compteur de trames de liaison descendante (AT+FCD).

Paramètres:

fcd – Nouvelle valeur du compteur de trames de liaison descendante.

get_fcd() int#

Renvoie le compteur de trames de liaison descendante actuel.

change_mode(mode: int) None#

Change le mode d’activation.

Paramètres:

mode – L’une des valeurs MODE_ABP, MODE_OTAA.

join(timeout_ms: int) bool#

Émet un AT+JOIN et attend l’événement d’acceptation de la jonction. Renvoie True si le modem signale +EVENT=1,1 (jonction réussie) dans le délai timeout_ms.

Paramètres:

timeout_ms – Temps maximal d’attente à la fois pour le +ACK et l’événement de jonction subséquent, en millisecondes.

get_join_status() bool#

Renvoie True si le modem est actuellement rattaché à un réseau.

get_max_size() int#

Renvoie la taille maximale de charge utile LoRaWAN, en octets, pour le débit de données actuel. Sur le micrologiciel Arduino, elle est fixée à 64.

poll() None#

Si plus de poll_ms millisecondes se sont écoulées depuis le dernier appel, envoie une liaison montante confirmée vide pour vider les liaisons descendantes en attente. Destinée à être appelée fréquemment depuis la boucle principale de l’application.

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

Transmet une liaison montante LoRaWAN. Lève LoraError si buff est plus grand que get_max_size().

Paramètres:
  • buff – Octets de charge utile à transmettre.

  • confirmed – Lorsque True, envoie une liaison montante confirmée (+CTX) et attend un +ACK du serveur réseau. Lorsque False, envoie une liaison montante non confirmée (+UTX).

Renvoie:

True si le modem a accepté le paquet (et, pour les liaisons montantes confirmées, si le réseau l’a acquitté), False sinon.

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

Attend une liaison descendante. Renvoie None si aucun événement +RECV n’a été reçu dans le délai timeout millisecondes, sinon un dictionnaire {"port": str, "data": str} contenant le FPort et les octets de charge utile.

Paramètres:

timeout – Temps maximal d’attente, en millisecondes.

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

Lecture UART bas niveau. Lit des caractères depuis le modem jusqu’à ce qu’un délimiteur soit trouvé, que max_bytes caractères aient été lus, ou que timeout millisecondes s’écoulent, puis renvoie la chaîne accumulée avec tout \r final supprimé.

Paramètres:
  • delimiter – Soit un caractère unique à faire correspondre à la fin du tampon, soit une chaîne multi-caractères à comparer à l’ensemble du tampon nettoyé, soit une liste de telles chaînes.

  • max_bytes – Si défini, renvoie dès qu’exactement ce nombre d’octets a été lu.

  • timeout – Délai global de lecture, en millisecondes.

available() int#

Renvoie le nombre d’octets actuellement disponibles dans le tampon de réception UART du modem.

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

Bascule le modem en mode OTAA, programme les clés et EUI fournis, puis tente de rejoindre le réseau. Renvoie True si la jonction a réussi.

Paramètres:
  • appEui – Application/Join EUI 64 bits sous forme de chaîne hexadécimale.

  • appKey – Application Key 128 bits sous forme de chaîne hexadécimale.

  • devEui – Device EUI 64 bits optionnel sous forme de chaîne hexadécimale. Si None, le Device EUI programmé en usine est utilisé.

  • timeout – Délai de jonction, en millisecondes.

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

Bascule le modem en mode ABP, programme les adresses et clés fournies, puis tente de rejoindre. Renvoie le résultat de get_join_status().

Paramètres:
  • nwkId – Identifiant réseau (actuellement ignoré par le micrologiciel).

  • devAddr – Device Address 32 bits sous forme de chaîne hexadécimale.

  • nwkSKey – Network Session Key 128 bits sous forme de chaîne hexadécimale.

  • appSKey – Application Session Key 128 bits sous forme de chaîne hexadécimale.

  • timeout – Délai de jonction, en millisecondes.

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

Inspecte une réponse du modem et lève la sous-classe LoraError correspondante si elle représente une erreur. Ne fait rien pour les réponses sans erreur.

Paramètres:
  • command – La commande AT (sans le préfixe AT) qui a produit data.

  • data – La chaîne de réponse renvoyée par le modem.

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

Construit une commande AT à partir de cmd et args, ajoute éventuellement une charge utile data brute, la transmet et renvoie la réponse du modem. Pour les commandes d’interrogation se terminant par ?, seule la partie valeur (la sous-chaîne après =) est renvoyée.

Paramètres:
  • cmd – Suffixe de commande AT (par ex. "+JOIN", "+DR=") ; le préfixe "AT" et le \r final sont ajoutés automatiquement.

  • args – Arguments supplémentaires concaténés à cmd après conversion en chaîne.

  • delimiter – Délimiteur transmis à receive().

  • data – Octets bruts optionnels écrits immédiatement après la commande AT (utilisés pour les charges utiles de liaison montante binaires).

  • timeout – Délai de réponse, en millisecondes.

  • raise_error – Lorsque True, les réponses d’erreur sont converties en exceptions LoraError ; lorsque False, la réponse brute est renvoyée à l’appelant.