lora --- LoRa 调制解调器驱动¶
lora 模块为 Arduino Portenta Vision Shield 上的 Murata CMWX1ZZABZ LoRa 调制解调器提供了驱动。它公开了一个高级 Lora 类,该类封装了调制解调器固件(包括 Arduino MKRWAN ARD-078 固件)所使用的 AT 命令集,使应用程序能够加入 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¶
当 AT 命令带有无效参数而收到
+ERR_PARAM响应时引发。
- 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,驱动将以 8N2 帧格式打开UART(8, 19200)(Portenta Vision Shield 默认值)。rst_pin -- 驱动调制解调器复位线的
machine.Pin。如果为None,"PC6"将配置为推挽输出。boot_pin -- 驱动调制解调器启动选择线的
machine.Pin。如果为None,"PG7"将配置为拉低的推挽输出。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 默认值。由构造函数调用;通常不由用户代码调用。
- configure_band(band: int) bool¶
配置区域频段,并在使用
BAND_EU868的 Arduino 固件上启用 ETSI 占空比限制器。成功时返回True。- 参数:
band --
BAND_*常量之一。
- set_autobaud(timeout: int = 10000) bool¶
发送空
AT命令,直到调制解调器以+OK响应或经过timeout毫秒为止。如果同步成功,则返回True。- 参数:
timeout -- 尝试的最长时间,以毫秒为单位。
- set_rf_power(mode: int, power: int) None¶
配置调制解调器 RF 输出级(
AT+RFPOWER)。- 参数:
mode --
RF_MODE_RFO、RF_MODE_PABOOST之一。power -- 输出功率索引,以固件特定的单位表示。
- set_port(port: int) None¶
配置后续
send_data()调用所使用的 LoRaWAN 应用端口(1..223)。- 参数:
port -- LoRaWAN FPort。
- set_public_network(enable: bool) None¶
启用或禁用公共网络同步字。
- 参数:
enable --
True表示公共 LoRaWAN 同步字,False表示私有同步字。
- format(hexMode: bool) None¶
选择 UART 上用于载荷字节的数据格式。
- 参数:
hexMode --
True表示 ASCII 十六进制载荷格式,False表示原始二进制。
- join(timeout_ms: int) bool¶
发出
AT+JOIN并等待入网接受事件。如果调制解调器在timeout_ms内报告+EVENT=1,1(入网成功),则返回True。- 参数:
timeout_ms -- 等待
+ACK及随后的入网事件的最长时间,以毫秒为单位。
- send_data(buff: bytes, confirmed: bool = True) bool¶
发送一个 LoRaWAN 上行链路。如果
buff大于get_max_size(),则引发LoraError。- 参数:
buff -- 要发送的载荷字节。
confirmed -- 当为
True时,发送确认上行链路(+CTX)并等待网络服务器的+ACK。当为False时,发送非确认上行链路(+UTX)。
- 返回:
如果调制解调器接受了该数据包(对于确认上行链路,且网络已确认它),则返回
True,否则返回False。
- receive_data(timeout: int = 1000) dict | None¶
等待下行链路。如果在
timeout毫秒内未收到+RECV事件,则返回None,否则返回一个包含 FPort 和载荷字节的字典{"port": str, "data": str}。- 参数:
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,以十六进制字符串表示。
appKey -- 128 位应用密钥(Application Key),以十六进制字符串表示。
devEui -- 可选的 64 位 Device EUI,以十六进制字符串表示。如果为
None,则使用出厂编程的 Device EUI。timeout -- 入网超时,以毫秒为单位。
- join_ABP(nwkId: int, devAddr: str, nwkSKey: str, appSKey: str, timeout: int = 60000) bool¶
将调制解调器切换到 ABP 模式,编程所提供的地址和密钥,然后尝试加入。返回
get_join_status()的结果。- 参数:
nwkId -- 网络标识符(当前被固件忽略)。
devAddr -- 32 位设备地址(Device Address),以十六进制字符串表示。
nwkSKey -- 128 位网络会话密钥(Network Session Key),以十六进制字符串表示。
appSKey -- 128 位应用会话密钥(Application Session Key),以十六进制字符串表示。
timeout -- 入网超时,以毫秒为单位。
- handle_error(command: str, data: str) None¶
检查调制解调器响应,如果它表示错误,则引发匹配的
LoraError子类。对于非错误响应不执行任何操作。- 参数:
command -- 产生
data的 AT 命令(不带AT前缀)。data -- 调制解调器返回的响应字符串。