lora — драйвер LoRa-модему¶
Модуль lora забезпечує драйвер для LoRa-модему Murata CMWX1ZZABZ на платі Arduino Portenta Vision Shield. Він надає високорівневий клас Lora, що є обгорткою над набором AT-команд мікропрограми модему (включаючи мікропрограму Arduino MKRWAN ARD-078), завдяки чому застосунок може приєднатися до мережі LoRaWAN та надсилати/отримувати пакети.
Приклад:
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)
Константи¶
Режими активації¶
Режими RF-виходу¶
Діапазони¶
Класи пристроїв¶
Винятки¶
- exception lora.LoraError¶
Базовий виняток, що виникає при будь-якій помилці, поверненій модемом або драйвером.
- exception lora.LoraErrorTimeout¶
Виникає, коли модем не відповідає протягом налаштованого таймауту (буфер прийому порожній).
- exception lora.LoraErrorParam¶
Виникає при відповіді
+ERR_PARAM, коли AT-команда надіслана з недійсним параметром.
- exception lora.LoraErrorBusy¶
Виникає при відповіді
+ERR_BUSY, коли модем зайнятий обробкою попередньої команди.
- exception lora.LoraErrorOverflow¶
Виникає при відповіді
+ERR_PARAM_OVERFLOW, коли параметр перевищує максимально допустиму довжину.
- exception lora.LoraErrorNoNetwork¶
Виникає при відповіді
+ERR_NO_NETWORK, коли модем не приєднаний до мережі.
- exception lora.LoraErrorRX¶
Виникає при відповіді
+ERR_RX, коли під час отримання низхідного каналу сталася помилка.
- exception lora.LoraErrorUnknown¶
Виникає при відповіді
+ERR_UNKNOWNабо коли модем повідомляє про незадокументовану помилку.
Класи¶
- 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)¶
Створити новий екземпляр драйвера модему. Конструктор ініціалізує (або автоматично створює) UART та виводи скидання/завантаження, апаратно скидає модуль, виконує автосинхронізацію швидкості передачі, перезавантажує модуль, запитує версію його мікропрограми та налаштовує запитаний регіональний
band.- Параметри:
uart – Попередньо налаштований екземпляр
machine.UARTдля зв’язку з модемом. ЯкщоNone, драйвер відкриваєUART(8, 19200)з кадруванням 8N2 (типово для Portenta Vision Shield).rst_pin –
machine.Pinдля керування лінією скидання модему. ЯкщоNone,"PC6"налаштовується як push-pull вихід.boot_pin –
machine.Pinдля керування лінією вибору режиму завантаження модему. ЯкщоNone,"PG7"налаштовується як push-pull вихід із підтяжкою до низького рівня.band – Регіональний діапазон для налаштування. Одна з констант
BAND_*.poll_ms – Інтервал у мілісекундах між автоматичними порожніми висхідними пакетами, що ініціюються
poll()для підтримки відкритого вікна низхідного каналу.debug – Якщо
True, весь трафік UART виводиться за допомогоюprint().
- LoraErrors: dict¶
Відображення рядків відповіді модему на помилки (наприклад,
"+ERR_BUSY") на відповідний клас винятку. Використовується внутрішньо методомhandle_error().
- init_modem() None¶
Ліниво ініціалізує
self.uart,self.rst_pinтаself.boot_pinдо їхніх типових значень для Portenta Vision Shield, якщо вони ще не встановлені. Викликається з конструктора; зазвичай не викликається кодом користувача.
- debug_print(data: str) None¶
Виводить
data, якщоdebugбуло увімкнено під час конструювання, інакше нічого не робить.
- is_arduino_firmware() bool¶
Повертає
True, якщо модем працює на мікропрограмі Arduino MKRWANARD-078(визначається за кешованим рядкомfw_version).
- configure_band(band: int) bool¶
Налаштувати регіональний діапазон і, для мікропрограми Arduino з
BAND_EU868, увімкнути обмежувач робочого циклу ETSI. ПовертаєTrueв разі успіху.- Параметри:
band – Одна з констант
BAND_*.
- set_baudrate(baudrate: int) None¶
Змінити швидкість передачі UART модему (
AT+UART).- Параметри:
baudrate – Нова швидкість передачі, у бітах за секунду.
- set_autobaud(timeout: int = 10000) bool¶
Надсилати порожні команди
ATдо отримання відповіді+OKвід модему або до закінченняtimeoutмілісекунд. ПовертаєTrueякщо синхронізація вдалася.- Параметри:
timeout – Максимальний час спроб, у мілісекундах.
- get_fw_version() str¶
Запитати рядок пристрою модему (
AT+DEV?) та версію мікропрограми (AT+VER?) і повернути їх як один рядок, розділений пробілом.
- restart() None¶
Повторно синхронізувати швидкість передачі, перезавантажити модем, повторно зчитати версію мікропрограми та повторно застосувати налаштований регіональний діапазон. Викидає
LoraErrorу разі невдачі.
- set_rf_power(mode: int, power: int) None¶
Налаштувати вихідний каскад RF модему (
AT+RFPOWER).- Параметри:
mode – Одне з
RF_MODE_RFO,RF_MODE_PABOOST.power – Індекс вихідної потужності, у специфічних для мікропрограми одиницях.
- set_port(port: int) None¶
Налаштувати порт застосунку LoRaWAN (1..223), який використовуватимуть наступні виклики
send_data().- Параметри:
port – FPort LoRaWAN.
- set_public_network(enable: bool) None¶
Увімкнути або вимкнути синхрослово публічної мережі.
- Параметри:
enable –
Trueдля публічного синхрослова LoRaWAN,Falseдля приватного.
- sleep(enable: bool) None¶
Переводить модем у режим низького споживання (
True) або виводить його з нього (False).
- format(hexMode: bool) None¶
Вибрати формат даних, що використовується через UART для байтів корисного навантаження.
- Параметри:
hexMode –
Trueдля формату корисного навантаження ASCII-hex,Falseдля бінарного.
- set_datarate(dr: int) None¶
Встановити індекс швидкості передачі даних LoRaWAN (
AT+DR).- Параметри:
dr – Індекс швидкості передачі даних, специфічний для регіону.
- set_adr(adr: bool) None¶
Увімкнути або вимкнути адаптивну швидкість передачі даних (ADR).
- Параметри:
adr –
Trueдля увімкнення ADR,Falseдля вимкнення.
- get_rx2dr() int¶
Повернути індекс швидкості передачі даних, що використовується для вікна прийому RX2.
- set_rx2dr(dr: int) None¶
Встановити індекс швидкості передачі даних для вікна прийому RX2.
- Параметри:
dr – Індекс швидкості передачі даних, специфічний для регіону.
- set_rx2freq(freq: int) None¶
Встановити частоту, що використовується для вікна прийому RX2.
- Параметри:
freq – Частота у Гц.
- set_fcu(fcu: int) None¶
Встановити лічильник висхідних кадрів (
AT+FCU).- Параметри:
fcu – Нове значення лічильника висхідних кадрів.
- set_fcd(fcd: int) None¶
Встановити лічильник низхідних кадрів (
AT+FCD).- Параметри:
fcd – Нове значення лічильника низхідних кадрів.
- join(timeout_ms: int) bool¶
Надіслати
AT+JOINта чекати на подію підтвердження приєднання. ПовертаєTrue, якщо модем повідомляє+EVENT=1,1(приєднання успішне) протягомtimeout_ms.- Параметри:
timeout_ms – Максимальний час очікування як
+ACK, так і наступної події приєднання, у мілісекундах.
- get_max_size() int¶
Повернути максимальний розмір корисного навантаження LoRaWAN, у байтах, для поточної швидкості передачі даних. Для мікропрограми Arduino це фіксоване значення
64.
- poll() None¶
Якщо з моменту останнього виклику пройшло більше
poll_msмілісекунд, надіслати порожній підтверджений висхідний пакет для очищення черги низхідних пакетів. Призначено для частого виклику з основного циклу застосунку.
- send_data(buff: bytes, confirmed: bool = True) bool¶
Передати висхідний пакет LoRaWAN. Викидає
LoraError, якщоbuffбільший заget_max_size().- Параметри:
buff – Байти корисного навантаження для передачі.
confirmed – Якщо
True, надіслати підтверджений висхідний пакет (+CTX) та чекати на+ACKвід мережевого сервера. ЯкщоFalse, надіслати непідтверджений висхідний пакет (+UTX).
- Повертає:
True, якщо модем прийняв пакет (і, для підтверджених висхідних пакетів, мережа підтвердила його),Falseв іншому випадку.
- receive_data(timeout: int = 1000) dict | None¶
Чекати на низхідний пакет. Повертає
None, якщо жодна подія+RECVне була отримана протягомtimeoutмілісекунд, інакше словник{"port": str, "data": str}з FPort та байтами корисного навантаження.- Параметри:
timeout – Максимальний час очікування, у мілісекундах.
- receive(delimiter: str | list | None = None, max_bytes: int | None = None, timeout: int = 1000) str¶
Низькорівневе читання UART. Читає символи від модему до збігу роздільника, прочитання
max_bytesсимволів або закінченняtimeoutмілісекунд, а потім повертає накопичений рядок із видаленим завершальним\r.- Параметри:
delimiter – Або один символ для збігу в кінці буфера, або багатосимвольний рядок для збігу з усім обрізаним буфером, або список таких рядків.
max_bytes – Якщо встановлено, повернутися одразу після читання точно такої кількості байтів.
timeout – Загальний таймаут читання, у мілісекундах.
- join_OTAA(appEui: str, appKey: str, devEui: str = None, timeout: int = 60000) bool¶
Перемкнути модем у режим OTAA, запрограмувати надані ключі та EUI, а потім спробувати приєднатися до мережі. Повертає
True, якщо приєднання вдалося.- Параметри:
appEui – 64-бітний EUI застосунку/приєднання у вигляді hex-рядка.
appKey – 128-бітний ключ застосунку у вигляді hex-рядка.
devEui – Необов’язковий 64-бітний EUI пристрою у вигляді hex-рядка. Якщо
None, використовується запрограмований на заводі EUI пристрою.timeout – Таймаут приєднання, у мілісекундах.
- join_ABP(nwkId: int, devAddr: str, nwkSKey: str, appSKey: str, timeout: int = 60000) bool¶
Перемкнути модем у режим ABP, запрограмувати надані адреси та ключі, а потім спробувати приєднатися. Повертає результат
get_join_status().- Параметри:
nwkId – Мережевий ідентифікатор (наразі ігнорується мікропрограмою).
devAddr – 32-бітна адреса пристрою у вигляді hex-рядка.
nwkSKey – 128-бітний мережевий сесійний ключ у вигляді hex-рядка.
appSKey – 128-бітний сесійний ключ застосунку у вигляді hex-рядка.
timeout – Таймаут приєднання, у мілісекундах.
- handle_error(command: str, data: str) None¶
Перевірити відповідь модему та викинути відповідний підклас
LoraError, якщо відповідь є помилкою. Нічого не робить для відповідей, що не є помилками.- Параметри:
command – AT-команда (без префіксу
AT), що породилаdata.data – Рядок відповіді, повернений модемом.
- send_command(cmd: str, *args, delimiter: str = '\\r', data: bytes = None, timeout: int = 1000, raise_error: bool = True) str¶
Побудувати AT-команду з
cmdтаargs, за потреби додати сире навантаженняdata, передати її та повернути відповідь модему. Для команд запиту, що закінчуються на?, повертається лише частина значення (підрядок після=).- Параметри:
cmd – Суфікс AT-команди (наприклад,
"+JOIN","+DR="); префікс"AT"та завершальний\rдодаються автоматично.args – Додаткові аргументи, що конкатенуються до
cmdпісля перетворення в рядок.delimiter – Роздільник, переданий до
receive().data – Необов’язкові сирі байти, що записуються безпосередньо після AT-команди (використовується для бінарних корисних навантажень висхідного каналу).
timeout – Таймаут відповіді, у мілісекундах.
raise_error – Якщо
True, відповіді з помилками перетворюються на виняткиLoraError; якщоFalse, сира відповідь повертається викликачу.