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 與 reset/boot 接腳、對模組進行硬體重設、執行自動鮑率同步、重新啟動模組、查詢其韌體版本,並設定所要求的區域
band。- 參數:
uart -- 用於與數據機通訊的預先設定
machine.UART實例。若為None,驅動程式會以 8N2 框架開啟UART(8, 19200)(Portenta Vision Shield 的預設值)。rst_pin -- 驅動數據機 reset 線路的
machine.Pin。若為None,則將"PC6"設定為推挽式輸出。boot_pin -- 驅動數據機 boot-select 線路的
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並等待 join-accept 事件。若數據機在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 位元的 Application/Join 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 -- 數據機回傳的回應字串。