lora --- Trình điều khiển modem LoRa

Mô-đun lora cung cấp trình điều khiển cho modem LoRa Murata CMWX1ZZABZ trên Arduino Portenta Vision Shield. Nó cung cấp một lớp Lora cấp cao bao bọc tập lệnh AT được sử dụng bởi firmware modem (bao gồm cả firmware Arduino MKRWAN ARD-078) để ứng dụng có thể tham gia mạng LoRaWAN và gửi/nhận các gói tin.

Ví dụ:

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)

Hằng số

Chế độ kích hoạt

lora.MODE_ABP: int

Chế độ Activation By Personalization.

lora.MODE_OTAA: int

Chế độ Over-The-Air Activation.

Chế độ đầu ra RF

lora.RF_MODE_RFO: int

Sử dụng đầu ra RF RFO (công suất thấp) của modem.

lora.RF_MODE_PABOOST: int

Sử dụng đầu ra RF PA_BOOST (công suất cao) của modem.

Dải tần

lora.BAND_AS923: int

Dải tần khu vực AS923 (Châu Á 923 MHz).

lora.BAND_AU915: int

Dải tần khu vực AU915 (Úc 915 MHz).

lora.BAND_EU868: int

Dải tần khu vực EU868 (Châu Âu 868 MHz).

lora.BAND_KR920: int

Dải tần khu vực KR920 (Hàn Quốc 920 MHz).

lora.BAND_IN865: int

Dải tần khu vực IN865 (Ấn Độ 865 MHz).

lora.BAND_US915: int

Dải tần khu vực US915 (Hoa Kỳ 915 MHz).

lora.BAND_US915_HYBRID: int

Kế hoạch khu vực US915 hybrid (dải con).

Lớp thiết bị

lora.CLASS_A: str

Thiết bị đầu cuối LoRaWAN Lớp A.

lora.CLASS_B: str

Thiết bị đầu cuối LoRaWAN Lớp B.

lora.CLASS_C: str

Thiết bị đầu cuối LoRaWAN Lớp C.

Ngoại lệ

exception lora.LoraError

Ngoại lệ cơ sở được ném ra cho bất kỳ lỗi nào được trả về bởi modem hoặc trình điều khiển.

exception lora.LoraErrorTimeout

Được ném ra khi modem không phản hồi trong thời gian chờ đã cấu hình (bộ đệm nhận trống).

exception lora.LoraErrorParam

Được ném ra khi nhận được phản hồi +ERR_PARAM khi một lệnh AT được phát ra với tham số không hợp lệ.

exception lora.LoraErrorBusy

Được ném ra khi nhận được phản hồi +ERR_BUSY khi modem đang bận xử lý lệnh trước đó.

exception lora.LoraErrorOverflow

Được ném ra khi nhận được phản hồi +ERR_PARAM_OVERFLOW khi một tham số vượt quá độ dài tối đa cho phép.

exception lora.LoraErrorNoNetwork

Được ném ra khi nhận được phản hồi +ERR_NO_NETWORK khi modem chưa tham gia mạng.

exception lora.LoraErrorRX

Được ném ra khi nhận được phản hồi +ERR_RX khi có lỗi xảy ra trong khi nhận downlink.

exception lora.LoraErrorUnknown

Được ném ra khi nhận được phản hồi +ERR_UNKNOWN hoặc khi modem báo cáo lỗi không có tài liệu.

Lớp

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)

Tạo trình điều khiển modem mới. Hàm tạo khởi tạo (hoặc tự động tạo) UART và các chân reset/boot, reset phần cứng mô-đun, thực hiện đồng bộ hóa autobaud, khởi động lại mô-đun, truy vấn phiên bản firmware, và cấu hình band khu vực được yêu cầu.

Tham số:
  • uart -- Phiên bản machine.UART đã cấu hình sẵn dùng để giao tiếp với modem. Nếu là None, trình điều khiển sẽ mở UART(8, 19200) với khung 8N2 (mặc định của Portenta Vision Shield).

  • rst_pin -- machine.Pin điều khiển đường reset của modem. Nếu là None, "PC6" được cấu hình như một đầu ra push-pull.

  • boot_pin -- machine.Pin điều khiển đường chọn boot của modem. Nếu là None, "PG7" được cấu hình như một đầu ra push-pull kéo xuống thấp.

  • band -- Dải tần khu vực để cấu hình. Một trong các hằng số BAND_*.

  • poll_ms -- Khoảng thời gian tính bằng mili giây giữa các uplink trống tự động được kích hoạt bởi poll() để giữ cửa sổ downlink mở.

  • debug -- Khi là True, tất cả lưu lượng UART được in thông qua print().

LoraErrors: dict

Ánh xạ từ các chuỗi phản hồi lỗi của modem (ví dụ: "+ERR_BUSY") đến lớp ngoại lệ tương ứng. Được sử dụng nội bộ bởi handle_error().

init_modem() None

Khởi tạo chậm self.uart, self.rst_pinself.boot_pin về các giá trị mặc định của Portenta Vision Shield nếu chúng chưa được đặt. Được gọi từ hàm tạo; thường không được gọi trực tiếp bởi mã người dùng.

debug_print(data: str) None

In data nếu debug được bật lúc khởi tạo, ngược lại không làm gì.

is_arduino_firmware() bool

Trả về True nếu modem đang chạy firmware Arduino MKRWAN ARD-078 (được phát hiện từ chuỗi fw_version đã lưu trong bộ nhớ cache).

configure_class(_class: str) None

Cấu hình lớp thiết bị LoRaWAN.

Tham số:

_class -- Một trong các giá trị CLASS_A, CLASS_B, CLASS_C.

configure_band(band: int) bool

Cấu hình dải tần khu vực và, trên firmware Arduino với BAND_EU868, bật bộ giới hạn chu kỳ nhiệm vụ ETSI. Trả về True khi thành công.

Tham số:

band -- Một trong các hằng số BAND_*.

set_baudrate(baudrate: int) None

Thay đổi tốc độ baud UART của modem (AT+UART).

Tham số:

baudrate -- Tốc độ baud mới, tính bằng bit trên giây.

set_autobaud(timeout: int = 10000) bool

Gửi các lệnh AT trống cho đến khi modem phản hồi bằng +OK hoặc cho đến khi timeout mili giây trôi qua. Trả về True nếu đồng bộ hóa thành công.

Tham số:

timeout -- Thời gian tối đa để thử, tính bằng mili giây.

get_fw_version() str

Truy vấn chuỗi thiết bị modem (AT+DEV?) và phiên bản firmware (AT+VER?) và trả về chúng dưới dạng một chuỗi phân cách bằng khoảng trắng.

get_device_eui() str

Trả về EUI thiết bị 64-bit của modem dưới dạng chuỗi hex.

factory_default() None

Khôi phục cài đặt gốc thông qua AT+FACNEW.

restart() None

Đồng bộ hóa lại tốc độ baud, khởi động lại modem, đọc lại phiên bản firmware, và áp dụng lại dải tần khu vực đã cấu hình. Ném ra LoraError khi thất bại.

set_rf_power(mode: int, power: int) None

Cấu hình giai đoạn đầu ra RF của modem (AT+RFPOWER).

Tham số:
  • mode -- Một trong các giá trị RF_MODE_RFO, RF_MODE_PABOOST.

  • power -- Chỉ số công suất đầu ra, theo đơn vị dành riêng cho firmware.

set_port(port: int) None

Cấu hình cổng ứng dụng LoRaWAN (1..223) được sử dụng bởi các lệnh gọi send_data() tiếp theo.

Tham số:

port -- FPort của LoRaWAN.

set_public_network(enable: bool) None

Bật hoặc tắt từ đồng bộ hóa mạng công cộng.

Tham số:

enable -- True cho từ đồng bộ LoRaWAN công cộng, False cho từ đồng bộ riêng tư.

sleep(enable: bool) None

Đặt modem vào chế độ ngủ tiêu thụ điện thấp (True) hoặc đánh thức nó dậy (False).

format(hexMode: bool) None

Chọn định dạng dữ liệu được sử dụng qua UART cho các byte payload.

Tham số:

hexMode -- True cho định dạng payload ASCII-hex, False cho dạng nhị phân thô.

set_datarate(dr: int) None

Đặt chỉ số tốc độ dữ liệu LoRaWAN (AT+DR).

Tham số:

dr -- Chỉ số tốc độ dữ liệu theo từng khu vực.

get_datarate() int

Trả về chỉ số tốc độ dữ liệu LoRaWAN hiện tại.

set_adr(adr: bool) None

Bật hoặc tắt Adaptive Data Rate.

Tham số:

adr -- True để bật ADR, False để tắt.

get_adr() int

Trả về cài đặt ADR hiện tại (1 nếu được bật, 0 nếu không).

get_devaddr() str

Trả về DevAddr 32-bit hiện tại dưới dạng chuỗi hex.

get_nwk_skey() str

Trả về Network Session Key hiện tại dưới dạng chuỗi hex.

get_appskey() str

Trả về Application Session Key hiện tại dưới dạng chuỗi hex.

get_rx2dr() int

Trả về chỉ số tốc độ dữ liệu được sử dụng cho cửa sổ nhận RX2.

set_rx2dr(dr: int) None

Đặt chỉ số tốc độ dữ liệu được sử dụng cho cửa sổ nhận RX2.

Tham số:

dr -- Chỉ số tốc độ dữ liệu theo từng khu vực.

get_ex2freq() int

Trả về tần số, tính bằng Hz, được sử dụng cho cửa sổ nhận RX2.

set_rx2freq(freq: int) None

Đặt tần số được sử dụng cho cửa sổ nhận RX2.

Tham số:

freq -- Tần số tính bằng Hz.

set_fcu(fcu: int) None

Đặt bộ đếm khung hình uplink (AT+FCU).

Tham số:

fcu -- Giá trị bộ đếm khung hình uplink mới.

get_fcu() int

Trả về bộ đếm khung hình uplink hiện tại.

set_fcd(fcd: int) None

Đặt bộ đếm khung hình downlink (AT+FCD).

Tham số:

fcd -- Giá trị bộ đếm khung hình downlink mới.

get_fcd() int

Trả về bộ đếm khung hình downlink hiện tại.

change_mode(mode: int) None

Chuyển đổi chế độ kích hoạt.

Tham số:

mode -- Một trong các giá trị MODE_ABP, MODE_OTAA.

join(timeout_ms: int) bool

Phát lệnh AT+JOIN và chờ sự kiện join-accept. Trả về True nếu modem báo cáo +EVENT=1,1 (tham gia thành công) trong vòng timeout_ms.

Tham số:

timeout_ms -- Thời gian tối đa để chờ cả +ACK và sự kiện tham gia tiếp theo, tính bằng mili giây.

get_join_status() bool

Trả về True nếu modem hiện đang tham gia mạng.

get_max_size() int

Trả về kích thước payload LoRaWAN tối đa, tính bằng byte, cho tốc độ dữ liệu hiện tại. Trên firmware Arduino, giá trị này cố định là 64.

poll() None

Nếu hơn poll_ms mili giây đã trôi qua kể từ lần gọi cuối, gửi một uplink đã xác nhận trống để xả các downlink đang chờ. Dự kiến được gọi thường xuyên từ vòng lặp chính của ứng dụng.

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

Truyền một uplink LoRaWAN. Ném ra LoraError nếu buff lớn hơn get_max_size().

Tham số:
  • buff -- Các byte payload để truyền.

  • confirmed -- Khi là True, gửi một uplink đã xác nhận (+CTX) và chờ +ACK từ máy chủ mạng. Khi là False, gửi một uplink chưa xác nhận (+UTX).

Trả về:

True nếu modem chấp nhận gói tin (và, đối với uplink đã xác nhận, mạng đã xác nhận nó), False trong trường hợp khác.

receive_data(timeout: int = 1000) dict | None

Chờ một downlink. Trả về None nếu không có sự kiện +RECV nào được nhận trong vòng timeout mili giây, ngược lại trả về một dict {"port": str, "data": str} chứa FPort và các byte payload.

Tham số:

timeout -- Thời gian tối đa để chờ, tính bằng mili giây.

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

Đọc UART cấp thấp. Đọc các ký tự từ modem cho đến khi một dấu phân cách khớp, đã đọc đủ max_bytes ký tự, hoặc timeout mili giây trôi qua, sau đó trả về chuỗi đã tích lũy với bất kỳ ký tự \r ở cuối nào bị xóa bỏ.

Tham số:
  • delimiter -- Một ký tự đơn để khớp ở cuối bộ đệm, một chuỗi nhiều ký tự để khớp với toàn bộ bộ đệm đã được cắt xén, hoặc một danh sách các chuỗi như vậy.

  • max_bytes -- Nếu được đặt, trả về ngay khi đã đọc đúng bằng này số byte.

  • timeout -- Thời gian chờ đọc tổng thể, tính bằng mili giây.

available() int

Trả về số byte hiện có trong bộ đệm nhận UART của modem.

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

Chuyển modem sang chế độ OTAA, lập trình các khóa và EUI được cung cấp, sau đó cố gắng tham gia mạng. Trả về True nếu tham gia thành công.

Tham số:
  • appEui -- Application/Join EUI 64-bit dưới dạng chuỗi hex.

  • appKey -- Application Key 128-bit dưới dạng chuỗi hex.

  • devEui -- Device EUI 64-bit tùy chọn dưới dạng chuỗi hex. Nếu là None, Device EUI được lập trình tại nhà máy sẽ được sử dụng.

  • timeout -- Thời gian chờ tham gia, tính bằng mili giây.

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

Chuyển modem sang chế độ ABP, lập trình các địa chỉ và khóa được cung cấp, sau đó cố gắng tham gia. Trả về kết quả của get_join_status().

Tham số:
  • nwkId -- Định danh mạng (hiện tại bị firmware bỏ qua).

  • devAddr -- Device Address 32-bit dưới dạng chuỗi hex.

  • nwkSKey -- Network Session Key 128-bit dưới dạng chuỗi hex.

  • appSKey -- Application Session Key 128-bit dưới dạng chuỗi hex.

  • timeout -- Thời gian chờ tham gia, tính bằng mili giây.

handle_error(command: str, data: str) None

Kiểm tra phản hồi của modem và ném ra lớp con LoraError phù hợp nếu nó đại diện cho một lỗi. Không làm gì với các phản hồi không phải lỗi.

Tham số:
  • command -- Lệnh AT (không có tiền tố AT) đã tạo ra data.

  • data -- Chuỗi phản hồi được trả về bởi modem.

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

Xây dựng một lệnh AT từ cmdargs, tùy chọn thêm payload data thô, truyền nó, và trả về phản hồi của modem. Đối với các lệnh truy vấn kết thúc bằng ?, chỉ phần giá trị (chuỗi con sau =) được trả về.

Tham số:
  • cmd -- Hậu tố lệnh AT (ví dụ: "+JOIN", "+DR="); tiền tố "AT"\r ở cuối được thêm tự động.

  • args -- Các đối số bổ sung được nối vào cmd sau khi chuyển đổi chuỗi.

  • delimiter -- Dấu phân cách được chuyển tiếp đến receive().

  • data -- Các byte thô tùy chọn được ghi ngay sau lệnh AT (được sử dụng cho payload uplink nhị phân).

  • timeout -- Thời gian chờ phản hồi, tính bằng mili giây.

  • raise_error -- Khi là True, các phản hồi lỗi được chuyển đổi thành ngoại lệ LoraError; khi là False, phản hồi thô được trả về cho người gọi.