lora --- ไดรเวอร์โมเด็ม LoRa¶
โมดูล lora เป็นไดรเวอร์สำหรับโมเด็ม LoRa รุ่น Murata CMWX1ZZABZ บน Arduino Portenta Vision Shield โดยเปิดเผยคลาส Lora ระดับสูงที่ห่อหุ้มชุดคำสั่ง AT ที่โมเด็มเฟิร์มแวร์ใช้งาน (รวมถึงเฟิร์มแวร์ ARD-078 ของ Arduino MKRWAN) เพื่อให้แอปพลิเคชันสามารถเชื่อมต่อกับเครือข่าย 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เมื่อเกิดข้อผิดพลาดระหว่างรับ downlink
- 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 และพินรีเซ็ต/บูต รีเซ็ตฮาร์ดแวร์ของโมดูล ทำการซิงโครไนซ์ autobaud รีบูตโมดูล สอบถามเวอร์ชันเฟิร์มแวร์ และกำหนดค่า
bandตามภูมิภาคที่ระบุ- พารามิเตอร์:
uart -- อินสแตนซ์
machine.UARTที่กำหนดค่าไว้ล่วงหน้าสำหรับสื่อสารกับโมเด็ม หากNoneไดรเวอร์จะเปิดUART(8, 19200)พร้อม framing แบบ 8N2 (ค่าเริ่มต้นของ Portenta Vision Shield)rst_pin --
machine.Pinที่ขับเส้น reset ของโมเด็ม หากNoneจะกำหนดค่า"PC6"เป็นเอาต์พุต push-pullboot_pin --
machine.Pinที่ขับเส้น boot-select ของโมเด็ม หากNoneจะกำหนดค่า"PG7"เป็นเอาต์พุต push-pull แบบ pull-lowband -- แบนด์ความถี่ตามภูมิภาคที่ต้องการกำหนดค่า ระบุค่าคงที่
BAND_*ตัวใดตัวหนึ่งpoll_ms -- ช่วงเวลาเป็นมิลลิวินาทีระหว่าง uplink ว่างที่ส่งโดยอัตโนมัติซึ่งเรียกจาก
poll()เพื่อรักษาหน้าต่างรับ downlink ให้เปิดอยู่debug -- เมื่อเป็น
Trueทราฟฟิก UART ทั้งหมดจะถูกพิมพ์ผ่านprint()
- LoraErrors: dict¶
การแมปจากสตริงการตอบสนองข้อผิดพลาดของโมเด็ม (เช่น
"+ERR_BUSY") ไปยังคลาสข้อยกเว้นที่สอดคล้องกัน ใช้ภายในโดยhandle_error()
- init_modem() None¶
เริ่มต้น
self.uart,self.rst_pinและself.boot_pinแบบ lazy ให้เป็นค่าเริ่มต้นของ Portenta Vision Shield หากยังไม่ได้ตั้งค่า เรียกจากคอนสตรักเตอร์ โดยปกติไม่ควรเรียกจากโค้ดของผู้ใช้โดยตรง
- is_arduino_firmware() bool¶
คืนค่า
Trueหากโมเด็มกำลังรัน Arduino MKRWAN เฟิร์มแวร์ARD-078(ตรวจจับจากสตริงfw_versionที่แคชไว้)
- configure_band(band: int) bool¶
กำหนดค่าแบนด์ความถี่ตามภูมิภาค และสำหรับเฟิร์มแวร์ Arduino ที่ใช้
BAND_EU868จะเปิดใช้งาน ETSI duty-cycle limiter ด้วย คืนค่า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_PABOOSTpower -- ดัชนีกำลังส่ง ในหน่วยที่กำหนดโดยเฟิร์มแวร์
- set_port(port: int) None¶
กำหนดค่า LoRaWAN application port (1..223) ที่ใช้โดยการเรียก
send_data()ถัดไป- พารามิเตอร์:
port -- LoRaWAN FPort
- set_public_network(enable: bool) None¶
เปิดหรือปิดใช้งาน sync word สำหรับเครือข่ายสาธารณะ
- พารามิเตอร์:
enable --
Trueสำหรับ LoRaWAN sync word สาธารณะ,Falseสำหรับแบบส่วนตัว
- format(hexMode: bool) None¶
เลือกรูปแบบข้อมูลที่ใช้ผ่าน UART สำหรับไบต์เพย์โหลด
- พารามิเตอร์:
hexMode --
Trueสำหรับรูปแบบเพย์โหลด ASCII-hex,Falseสำหรับแบบ raw binary
- set_datarate(dr: int) None¶
ตั้งค่าดัชนีอัตราข้อมูล LoRaWAN (
AT+DR)- พารามิเตอร์:
dr -- ดัชนีอัตราข้อมูลตามภูมิภาค
- set_adr(adr: bool) None¶
เปิดหรือปิดใช้งาน Adaptive Data Rate
- พารามิเตอร์:
adr --
Trueเพื่อเปิด ADR,Falseเพื่อปิด
- set_rx2dr(dr: int) None¶
ตั้งค่าดัชนีอัตราข้อมูลที่ใช้สำหรับหน้าต่างรับ RX2
- พารามิเตอร์:
dr -- ดัชนีอัตราข้อมูลตามภูมิภาค
- set_rx2freq(freq: int) None¶
ตั้งค่าความถี่ที่ใช้สำหรับหน้าต่างรับ RX2
- พารามิเตอร์:
freq -- ความถี่ในหน่วย Hz
- set_fcu(fcu: int) None¶
ตั้งค่าตัวนับเฟรม uplink (
AT+FCU)- พารามิเตอร์:
fcu -- ค่าตัวนับเฟรม uplink ใหม่
- set_fcd(fcd: int) None¶
ตั้งค่าตัวนับเฟรม downlink (
AT+FCD)- พารามิเตอร์:
fcd -- ค่าตัวนับเฟรม downlink ใหม่
- join(timeout_ms: int) bool¶
ส่งคำสั่ง
AT+JOINและรอสัญญาณ join-accept คืนค่าTrueหากโมเด็มรายงาน+EVENT=1,1(เชื่อมต่อสำเร็จ) ภายในtimeout_ms- พารามิเตอร์:
timeout_ms -- เวลาสูงสุดในการรอทั้ง
+ACKและสัญญาณ join ที่ตามมา เป็นมิลลิวินาที
- get_max_size() int¶
คืนค่าขนาดเพย์โหลด LoRaWAN สูงสุดเป็นไบต์สำหรับอัตราข้อมูลปัจจุบัน บนเฟิร์มแวร์ Arduino ค่านี้กำหนดคงที่ที่
64
- poll() None¶
หากผ่านมาเกิน
poll_msมิลลิวินาทีนับตั้งแต่การเรียกครั้งล่าสุด ให้ส่ง confirmed uplink ว่างเพื่อล้าง downlink ที่ค้างอยู่ ควรเรียกบ่อยๆ จาก main loop ของแอปพลิเคชัน
- send_data(buff: bytes, confirmed: bool = True) bool¶
ส่ง LoRaWAN uplink ยก
LoraErrorหากbuffมีขนาดใหญ่กว่าที่get_max_size()ระบุ- พารามิเตอร์:
buff -- ไบต์เพย์โหลดที่จะส่ง
confirmed -- เมื่อเป็น
Trueส่ง confirmed uplink (+CTX) และรอ+ACKจาก network server เมื่อเป็นFalseส่ง unconfirmed uplink (+UTX)
- ค่าที่คืน:
Trueหากโมเด็มรับแพ็กเก็ตไว้ (และสำหรับ confirmed uplink เครือข่ายได้รับทราบแล้ว),Falseมิฉะนั้น
- receive_data(timeout: int = 1000) dict | None¶
รอรับ downlink คืนค่า
Noneหากไม่ได้รับสัญญาณ+RECVภายในtimeoutมิลลิวินาที หรือคืน dict{"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 ตั้งค่า keys และ EUI ที่ระบุ แล้วพยายามเชื่อมต่อเครือข่าย คืนค่า
Trueหากเชื่อมต่อสำเร็จ- พารามิเตอร์:
appEui -- Application/Join EUI 64 บิตเป็นสตริงฐานสิบหก
appKey -- Application Key 128 บิตเป็นสตริงฐานสิบหก
devEui -- Device EUI 64 บิตที่ไม่บังคับเป็นสตริงฐานสิบหก หาก
Noneจะใช้ Device EUI ที่โปรแกรมจากโรงงานtimeout -- ระยะเวลาหมดเวลาการเชื่อมต่อ เป็นมิลลิวินาที
- join_ABP(nwkId: int, devAddr: str, nwkSKey: str, appSKey: str, timeout: int = 60000) bool¶
สลับโมเด็มเป็นโหมด ABP ตั้งค่าที่อยู่และ keys ที่ระบุ แล้วพยายามเชื่อมต่อ คืนค่าผลลัพธ์ของ
get_join_status()- พารามิเตอร์:
nwkId -- ตัวระบุเครือข่าย (ปัจจุบันถูกเฟิร์มแวร์ละเว้น)
devAddr -- Device Address 32 บิตเป็นสตริงฐานสิบหก
nwkSKey -- Network Session Key 128 บิตเป็นสตริงฐานสิบหก
appSKey -- Application Session Key 128 บิตเป็นสตริงฐานสิบหก
timeout -- ระยะเวลาหมดเวลาการเชื่อมต่อ เป็นมิลลิวินาที
- handle_error(command: str, data: str) None¶
ตรวจสอบการตอบสนองของโมเด็มและยกคลาสย่อย
LoraErrorที่ตรงกันหากเป็นการตอบสนองข้อผิดพลาด ไม่ทำอะไรสำหรับการตอบสนองที่ไม่ใช่ข้อผิดพลาด- พารามิเตอร์:
command -- คำสั่ง AT (ไม่มีคำนำหน้า
AT) ที่ทำให้เกิดdatadata -- สตริงการตอบสนองที่โมเด็มส่งคืน
- send_command(cmd: str, *args, delimiter: str = '\\r', data: bytes = None, timeout: int = 1000, raise_error: bool = True) str¶
สร้างคำสั่ง AT จาก
cmdและargsเพิ่มdataเพย์โหลด raw ตามต้องการ ส่งคำสั่ง และคืนการตอบสนองของโมเด็ม สำหรับคำสั่งสอบถามที่ลงท้ายด้วย?จะคืนเฉพาะส่วนค่า (สตริงหลัง=)- พารามิเตอร์:
cmd -- คำต่อท้ายคำสั่ง AT (เช่น
"+JOIN","+DR="); คำนำหน้า"AT"และ\rท้ายจะถูกเพิ่มโดยอัตโนมัติargs -- อาร์กิวเมนต์เพิ่มเติมที่ต่อท้าย
cmdหลังจากแปลงเป็นสตริงdelimiter -- ตัวคั่นที่ส่งต่อไปยัง
receive()data -- ไบต์ raw ที่ไม่บังคับซึ่งเขียนทันทีหลังคำสั่ง AT (ใช้สำหรับเพย์โหลด uplink แบบ binary)
timeout -- ระยะเวลาหมดเวลาการตอบสนอง เป็นมิลลิวินาที
raise_error -- เมื่อเป็น
Trueการตอบสนองข้อผิดพลาดจะถูกแปลงเป็นข้อยกเว้นLoraError; เมื่อเป็นFalseจะคืนการตอบสนองดิบให้ผู้เรียก