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)

קבועים

מצבי הפעלה

lora.MODE_ABP: int

מצב הפעלה באמצעות התאמה אישית (Activation By Personalization).

lora.MODE_OTAA: int

מצב הפעלה אלחוטית (Over-The-Air Activation).

מצבי פלט RF

lora.RF_MODE_RFO: int

שימוש בפלט ה-RF מסוג RFO (הספק נמוך) של המודם.

lora.RF_MODE_PABOOST: int

שימוש בפלט ה-RF מסוג PA_BOOST (הספק גבוה) של המודם.

תחומים (Bands)

lora.BAND_AS923: int

תחום אזורי AS923 (אסיה 923 MHz).

lora.BAND_AU915: int

תחום אזורי AU915 (אוסטרליה 915 MHz).

lora.BAND_EU868: int

תחום אזורי EU868 (אירופה 868 MHz).

lora.BAND_KR920: int

תחום אזורי KR920 (קוריאה 920 MHz).

lora.BAND_IN865: int

תחום אזורי IN865 (הודו 865 MHz).

lora.BAND_US915: int

תחום אזורי US915 (ארצות הברית 915 MHz).

lora.BAND_US915_HYBRID: int

תוכנית אזורית US915 היברידית (תת-תחום).

מחלקות התקן

lora.CLASS_A: str

התקן קצה מסוג LoRaWAN Class A.

lora.CLASS_B: str

התקן קצה מסוג LoRaWAN Class B.

lora.CLASS_C: str

התקן קצה מסוג LoRaWAN Class C.

חריגות

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) עם מסגור 8N2 (ברירת המחדל של ה-Portenta Vision Shield).

  • rst_pin – מופע machine.Pin המניע את קו האיפוס של המודם. אם None, "PC6" מוגדר כפלט דחיפה-משיכה (push-pull).

  • boot_pin – מופע machine.Pin המניע את קו בחירת האתחול (boot-select) של המודם. אם None, "PG7" מוגדר כפלט דחיפה-משיכה (push-pull) המושך כלפי מטה.

  • band – התחום האזורי שיוגדר. אחד מהקבועים BAND_*.

  • poll_ms – מרווח במילישניות בין קישורי-עולה (uplinks) ריקים אוטומטיים המופעלים על ידי poll() כדי לשמור את חלון הקישור-יורד פתוח.

  • debug – כאשר True, כל תעבורת ה-UART מודפסת באמצעות print().

LoraErrors: dict

מיפוי ממחרוזות תגובת שגיאה של המודם (לדוגמה "+ERR_BUSY") למחלקת החריגה המתאימה. משמש באופן פנימי על ידי handle_error().

init_modem() None

מאתחל באופן עצל (lazy) את self.uart, self.rst_pin ו-self.boot_pin לברירות המחדל של ה-Portenta Vision Shield אם הם עדיין לא הוגדרו. נקרא מהבנאי; בדרך כלל אינו מופעל על ידי קוד המשתמש.

debug_print(data: str) None

מדפיס את data אם debug הופעל בזמן הבנייה, אחרת אינו עושה דבר.

is_arduino_firmware() bool

מחזיר True אם המודם מריץ את קושחת ה-Arduino MKRWAN ARD-078 (מזוהה מתוך מחרוזת ה-fw_version שנשמרה במטמון).

configure_class(_class: str) None

מגדיר את מחלקת התקן ה-LoRaWAN.

פרמטרים:

_class – אחד מ-CLASS_A, CLASS_B, CLASS_C.

configure_band(band: int) bool

מגדיר את התחום האזורי, ובקושחת Arduino עם BAND_EU868, מפעיל את מגביל מחזור-העבודה (duty-cycle) של ETSI. מחזיר True בהצלחה.

פרמטרים:

band – אחד מהקבועים BAND_*.

set_baudrate(baudrate: int) None

משנה את קצב הבָּאוּד (baud rate) של ה-UART של המודם (AT+UART).

פרמטרים:

baudrate – קצב בָּאוּד (baud rate) חדש, בביטים לשנייה.

set_autobaud(timeout: int = 10000) bool

שולח פקודות AT ריקות עד שהמודם מגיב ב-+OK או עד שחולפות timeout מילישניות. מחזיר True אם הסנכרון הצליח.

פרמטרים:

timeout – הזמן המרבי להקדיש לניסיון, במילישניות.

get_fw_version() str

שואל את מחרוזת התקן המודם (AT+DEV?) ואת גרסת הקושחה (AT+VER?) ומחזיר אותן כמחרוזת יחידה מופרדת ברווחים.

get_device_eui() str

מחזיר את ה-Device EUI בן 64 הביטים של המודם כמחרוזת הקס.

factory_default() None

משחזר את ברירות המחדל של היצרן באמצעות AT+FACNEW.

restart() None

מסנכרן מחדש את קצב הבָּאוּד (baud rate), מאתחל מחדש את המודם, קורא מחדש את גרסת הקושחה, ומיישם מחדש את התחום האזורי שהוגדר. מעלה 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 – LoRaWAN FPort.

set_public_network(enable: bool) None

מפעיל או מבטל את מילת הסנכרון (sync word) של הרשת הציבורית.

פרמטרים:

enableTrue עבור מילת הסנכרון הציבורית של LoRaWAN, False עבור הפרטית.

sleep(enable: bool) None

מכניס את המודם למצב שינה בהספק נמוך (True) או מעיר אותו (False).

format(hexMode: bool) None

בוחר את תבנית הנתונים המשמשת על גבי ה-UART עבור בייטי המטען (payload).

פרמטרים:

hexModeTrue עבור תבנית מטען ASCII-hex, False עבור בינארי גולמי.

set_datarate(dr: int) None

מגדיר את אינדקס קצב הנתונים של LoRaWAN (AT+DR).

פרמטרים:

dr – אינדקס קצב נתונים ספציפי לאזור.

get_datarate() int

מחזיר את אינדקס קצב הנתונים הנוכחי של LoRaWAN.

set_adr(adr: bool) None

מפעיל או מבטל את Adaptive Data Rate.

פרמטרים:

adrTrue כדי להפעיל ADR, False כדי לבטלו.

get_adr() int

מחזיר את הגדרת ה-ADR הנוכחית (1 אם מופעל, 0 אחרת).

get_devaddr() str

מחזיר את ה-DevAddr הנוכחי בן 32 הביטים כמחרוזת הקס.

get_nwk_skey() str

מחזיר את מפתח סשן הרשת (Network Session Key) הנוכחי כמחרוזת הקס.

get_appskey() str

מחזיר את מפתח סשן היישום (Application Session Key) הנוכחי כמחרוזת הקס.

get_rx2dr() int

מחזיר את אינדקס קצב הנתונים המשמש את חלון הקבלה RX2.

set_rx2dr(dr: int) None

מגדיר את אינדקס קצב הנתונים המשמש את חלון הקבלה RX2.

פרמטרים:

dr – אינדקס קצב נתונים ספציפי לאזור.

get_ex2freq() int

מחזיר את התדר, ב-Hz, המשמש את חלון הקבלה RX2.

set_rx2freq(freq: int) None

מגדיר את התדר המשמש את חלון הקבלה RX2.

פרמטרים:

freq – תדר ב-Hz.

set_fcu(fcu: int) None

מגדיר את מונה מסגרות הקישור-עולה (uplink) (AT+FCU).

פרמטרים:

fcu – ערך מונה מסגרות הקישור-עולה (uplink) חדש.

get_fcu() int

מחזיר את מונה מסגרות הקישור-עולה (uplink) הנוכחי.

set_fcd(fcd: int) None

מגדיר את מונה מסגרות הקישור-יורד (downlink) (AT+FCD).

פרמטרים:

fcd – ערך מונה מסגרות הקישור-יורד (downlink) חדש.

get_fcd() int

מחזיר את מונה מסגרות הקישור-יורד (downlink) הנוכחי.

change_mode(mode: int) None

מחליף את מצב ההפעלה.

פרמטרים:

mode – אחד מ-MODE_ABP, MODE_OTAA.

join(timeout_ms: int) bool

מנפיק AT+JOIN וממתין לאירוע אישור-ההצטרפות (join-accept). מחזיר True אם המודם מדווח +EVENT=1,1 (ההצטרפות הצליחה) בתוך timeout_ms.

פרמטרים:

timeout_ms – הזמן המרבי להמתנה הן ל-+ACK והן לאירוע ההצטרפות שלאחריו, במילישניות.

get_join_status() bool

מחזיר True אם המודם מחובר כעת לרשת.

get_max_size() int

מחזיר את גודל המטען (payload) המרבי של LoRaWAN, בבייטים, עבור קצב הנתונים הנוכחי. בקושחת Arduino ערך זה קבוע על 64.

poll() None

אם חלפו יותר מ-poll_ms מילישניות מאז הקריאה האחרונה, שולח קישור-עולה (uplink) מאושר ריק כדי לרוקן קישורי-יורד (downlinks) ממתינים. מיועד להיקרא לעיתים תכופות מהלולאה הראשית של היישום.

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

משדר קישור-עולה (uplink) של LoRaWAN. מעלה LoraError אם buff גדול מ-get_max_size().

פרמטרים:
  • buff – בייטי המטען (payload) לשידור.

  • confirmed – כאשר True, שולח קישור-עולה (uplink) מאושר (+CTX) וממתין ל-+ACK משרת הרשת. כאשר False, שולח קישור-עולה (uplink) לא מאושר (+UTX).

מחזיר:

True אם המודם קיבל את המנה (ועבור קישורי-עולה (uplinks) מאושרים, הרשת אישרה אותה), False אחרת.

receive_data(timeout: int = 1000) dict | None

ממתין לקישור-יורד (downlink). מחזיר None אם לא התקבל אירוע +RECV בתוך timeout מילישניות, אחרת מילון {"port": str, "data": str} המכיל את ה-FPort ואת בייטי המטען (payload).

פרמטרים:

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 – פרק הזמן הקצוב הכולל לקריאה, במילישניות.

available() int

מחזיר את מספר הבייטים הזמינים כעת בחוצץ קבלת ה-UART של המודם.

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

מחליף את המודם למצב OTAA, מתכנת את המפתחות וה-EUIs שסופקו, ואז מנסה להצטרף לרשת. מחזיר 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, מתכנת את הכתובות והמפתחות שסופקו, ואז מנסה להצטרף. מחזיר את תוצאת 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) שהפיקה את 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 (משמשים למטעני קישור-עולה (uplink) בינאריים).

  • timeout – פרק הזמן הקצוב לתגובה, במילישניות.

  • raise_error – כאשר True, תגובות שגיאה מומרות לחריגות LoraError; כאשר False, התגובה הגולמית מוחזרת לקורא.