ubluepy — התקן היקפי ומרכזי של Bluetooth LE¶
המודול ubluepy הוא ה-API הישן של Bluetooth LE המשולח עם הסבת nRF של MicroPython. הוא מעוצב באופן רופף על פי ספריית Python bluepy של Linux ויושב ישירות מעל ה-Nordic SoftDevice — אין לו מנגנון אחורי נייד, ולכן המודול זמין רק ביעדי Nordic (ה-Arduino Nano 33 BLE Sense בשורת המוצרים של OpenMV). ממשקי ה-API החדשים יותר bluetooth / aioble אינם מופעלים בבנייה זו, ולכן ubluepy הוא הדרך היחידה להפעיל את הרדיו שעל-גבי השבב.
מערך התכונות הזמין תלוי ב-SoftDevice שנצרב על ידי הקושחה:
s140 (Nano 33 BLE Sense) — תפקידי התקן היקפי וגם מרכזי (סורק). זהו מה שמשולח עם קושחת OpenMV.
s132 — גם התקן היקפי וגם מרכזי.
s110 — התקן היקפי בלבד; מתודות הסורק / החיבור מהודרות החוצה.
דוגמה להתקן היקפי¶
פרסום כהתקן היקפי של Bluetooth LE עם שירות יחיד לחישה סביבתית, ושליחת התראה על מאפיין טמפרטורה בכל כתיבה אל ה-Client Characteristic Configuration Descriptor (CCCD) שלו:
from ubluepy import Service, Characteristic, UUID, Peripheral, constants
from machine import LED
notif_enabled = False
def event_handler(event_id, handle, data):
global notif_enabled
if event_id == constants.EVT_GAP_CONNECTED:
LED("LED_GREEN").on()
elif event_id == constants.EVT_GAP_DISCONNECTED:
LED("LED_GREEN").off()
periph.advertise(device_name="Nano 33", services=[svc])
elif event_id == constants.EVT_GATTS_WRITE:
notif_enabled = bool(data[0])
svc = Service(UUID("181A")) # Environmental Sensing
char = Characteristic(UUID("2A6E"),
props=Characteristic.PROP_NOTIFY | Characteristic.PROP_READ,
attrs=Characteristic.ATTR_CCCD)
svc.addCharacteristic(char)
periph = Peripheral()
periph.addService(svc)
periph.setConnectionHandler(event_handler)
periph.advertise(device_name="Nano 33", services=[svc])
דוגמה להתקן מרכזי¶
סריקה לאיתור התקנים מפרסמים בקרבת מקום למשך 100 ms ופענוח נתוני הפרסום של כל ScanEntry
from ubluepy import Scanner, constants
s = Scanner()
for entry in s.scan(100):
print(entry.addr(), entry.rssi(), "dBm")
for ad_type, name, value in entry.getScanData():
print(" ", ad_type, name, bytes(value))
תוכן המודול¶
מחלקות¶
- class ubluepy.UUID(value)¶
בניית UUID של Bluetooth בן 16 או 128 ביט.
valueאחד מהבאים:
int— UUID מספרי בן 16 ביט (UUID(0x180A)).מחרוזת
"0xXXXX"בת 6 תווים — UUID בן 16 ביט, למשלUUID("0x181A").מחרוזת
"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"בת 36 תווים — UUID מלא בן 128 ביט. החלק הספציפי-ליצרן נרשם ב-SoftDevice בעת הבנייה.מופע
UUIDאחר — מבצע העתקה.
כל אורך אחר מעלה
ValueError("Invalid UUID string length").
- class ubluepy.Service(uuid: UUID, type: int = Service.PRIMARY)¶
הגדרת שירות GATT שיירשם ב-SoftDevice כאשר יתווסף ל-
Peripheral.uuidמופע
UUID. העברת אובייקט שאינו UUID מעלהValueError.typeאו
Service.PRIMARY(ברירת מחדל) אוService.SECONDARY. ערכים אחרים מעליםValueError.
- addCharacteristic(characteristic: Characteristic) None¶
רישום
Characteristicבשירות. ה-handle של GATT עבור המאפיין מוקצה במהלך קריאה זו.
- getCharacteristic(uuid: UUID) Characteristic | None¶
חיפוש
Characteristicשנוסף קודם לכן לפי UUID. מחזיר את מופע המאפיין, אוNoneאם לא נמצאה התאמה.
- class ubluepy.Characteristic(uuid: UUID, *, props: int = PROP_READ | PROP_WRITE, attrs: int = 0)¶
הגדרת מאפיין GATT. הוסיפו אותו ל-
ServiceבאמצעותService.addCharacteristic()לפני שה-Peripheralההורה מתחיל לפרסם.uuidמופע
UUID.props(מילת-מפתח בלבד)מסכת ביטים של ערך
Characteristic.PROP_*אחד או יותר המתארים אילו פעולות המאפיין תומך בהן.attrs(מילת-מפתח בלבד)מסכת ביטים של תכונות GATT נוספות. השתמשו ב-
Characteristic.ATTR_CCCDכדי לצרף Client Characteristic Configuration Descriptor — נדרש כדי לגרום למאפייניPROP_NOTIFY/PROP_INDICATEלעבוד.
- read() bytearray¶
תפקיד מרכזי בלבד. קריאת ערך המאפיין מן העמית המחובר. מחזיר
bytearrayעם הערך העדכני ביותר. בהתקן היקפי זוהי פעולת no-op והיא מחזירהNone.
- write(data, *, with_response: bool = False) None¶
כתיבה אל המאפיין.
בהתקן היקפי, אם
PROP_NOTIFYמוגדר במאפייני ה-characteristic, הערך נשלח כהתראת GATT אל ההתקן המרכזי המחובר; אחרת ערך התכונה המקומי מתעדכן.בהתקן מרכזי, הערך נכתב אל העמית המרוחק. הגדירו
with_response=Trueכדי להנפיק בקשת כתיבה ולהמתין לאישור של העמית במקום פקודת כתיבה.
dataהוא כל אובייקט התומך בפרוטוקול buffer (bytes,bytearray,memoryview).
- class ubluepy.Descriptor(uuid: UUID)¶
מחלקת stub לייצוג מתארי GATT. המימוש הנוכחי שומר אך ורק את ה-UUID ואינו חושף מתודות כלשהן — היא מסופקת לצורך תאימות עתידית עם גרסאות עתידיות של המודול.
- class ubluepy.Peripheral¶
התקן ה-Bluetooth LE המקומי. אותה מחלקה משמשת הן עבור תפקיד התקן היקפי והן עבור תפקיד התקן מרכזי; התפקיד נבחר לפי המתודות שאתם קוראים להן (
advertise()בוחרת התקן היקפי,connect()בוחרת התקן מרכזי).- addService(service: Service) None¶
רישום
Service(וכל המאפיינים שנוספו לו קודם לכן) בשרת ה-GATT המקומי.
- getServices() list¶
מחזיר את רשימת השירותים הרשומים כעת ב-
Peripheralזה.
- advertise(*, device_name: str | None = None, services: list | None = None, data: bytes | None = None, connectable: bool = True) None¶
התחלת פרסום בתפקיד התקן היקפי.
device_nameהשם המקומי המלא המפורסם במטען ה-GAP.
servicesרשימת מופעי
Serviceלפרסום. ה-UUID של כל שירות כלול בפרסום.dataמטען פרסום גולמי אופציונלי (
bytes/bytearray) המצורף לכותרת שנוצרה אוטומטית. השתמשו בזה עבור מטענים ספציפיים-ליצרן או מטעני beacon כגון Eddystone.connectableכאשר
True(ברירת מחדל), מתבצע פרסום כהתקן בר-חיבור ונרשמים מטפלי אירועי GAP / GATTS כך שפונקציית ה-callback המוגדרתsetConnectionHandler()מופעלת בעת חיבור, ניתוק וכתיבות CCCD. כאשרFalse, מתבצע פרסום כ-beacon — לא מצורפים מטפלים ולא ניתן להתחבר להתקן.
- setConnectionHandler(func) None¶
רישום פונקציית callback המופעלת באירועי GAP ו-GATTS. ה-callback נקרא כ-
func(event_id, conn_handle, data)כאשרevent_idהוא אחד מהערכיםconstants.EVT_GAP_CONNECTED,constants.EVT_GAP_DISCONNECTED, אוconstants.EVT_GATTS_WRITE,conn_handleהוא ה-handle של החיבור של ה-SoftDevice (או handle של תכונה עבור כתיבות GATTS), ו-dataהוא מטען האירוע הגולמי כ-bytearray(אוNoneעבור חיבור / ניתוק).
- setNotificationHandler(func) None¶
רישום פונקציית callback עבור אירועי התראה המתקבלים בתפקיד התקן מרכזי.
- withDelegate(delegate: DefaultDelegate) None¶
צירוף מופע
DefaultDelegateלקבלת אירועי GATT מפוענחים.
- connect(addr, *, addr_type: int = constants.ADDR_TYPE_PUBLIC) None¶
תפקיד מרכזי בלבד. התחברות אל העמית בעל הכתובת הנתונה וגילוי סינכרוני של השירותים והמאפיינים הראשיים שלו. חוסם עד שהחיבור נוצר והגילוי מסתיים; השירותים שהתגלו זמינים לאחר מכן דרך
getServices().addrכתובת העמית כמחרוזת
"xx:xx:xx:xx:xx:xx"בת 17 תווים (למשל זו שנלקחה מ-ScanEntry.addr()).addr_type(מילת-מפתח בלבד)או
constants.ADDR_TYPE_PUBLIC(ברירת מחדל) אוconstants.ADDR_TYPE_RANDOM_STATIC.
- class ubluepy.Scanner¶
צופה GAP לגילוי התקנים מפרסמים בקרבת מקום. זמין רק כאשר הקושחה נבנתה כנגד SoftDevice עם תמיכה במרכזי (s132 / s140).
- class ubluepy.ScanEntry¶
דוח פרסום בודד שנלכד על ידי
Scanner.scan(). המופעים מוחזרים מן הסורק — אין constructor ציבורי.- addr_type() int¶
מחזיר את סוג כתובת העמית (
constants.ADDR_TYPE_PUBLICאוconstants.ADDR_TYPE_RANDOM_STATIC).
- getScanData() list¶
פענוח מטען הפרסום לרשימה של tuple-ים
(ad_type, description, value).ad_typeהוא בית סוג ה-AD המספרי (ראוconstants.ad_types),descriptionהוא שם הקבוע התואם כמחרוזת (אוNoneאם הסוג אינו ידוע), ו-valueהוא גוף רשומת ה-AD כ-bytearray.
- class ubluepy.DefaultDelegate¶
מחלקת בסיס עבור אובייקטים המועברים אל
Peripheral.withDelegate(). צרו ממנה תת-מחלקה ועקפו אתhandleConnection()/handleNotification()כדי להגיב לאירועי GATT.
קבועים¶
התכונה constants של המודול היא מרחב שמות המכיל מזהי אירועי GAP/GATT, ערכי סוג-כתובת, ומרחב השמות המקונן ad_types.
- constants.EVT_GATTS_WRITE: int¶
ערך
event_idשל מטפל החיבור שלPeripheralעבור כתיבה לתכונת GATT מקומית, כולל כתיבות ל-CCCD המפעילות/מבטלות התראות (80).
- constants.UUID_CCCD: int¶
UUID סטנדרטי של Bluetooth עבור ה-Client Characteristic Configuration Descriptor (
0x2902).
- constants.ad_types: type¶
מרחב שמות של קבועי סוג-AD של נתוני פרסום מן ה-Bluetooth Core Specification Supplement. כל שם ממופה לסוג ה-AD בן הבית הבודד התואם:
שם
ערך
AD_TYPE_FLAGS0x01AD_TYPE_16BIT_SERVICE_UUID_MORE_AVAILABLE0x02AD_TYPE_16BIT_SERVICE_UUID_COMPLETE0x03AD_TYPE_32BIT_SERVICE_UUID_MORE_AVAILABLE0x04AD_TYPE_32BIT_SERVICE_UUID_COMPLETE0x05AD_TYPE_128BIT_SERVICE_UUID_MORE_AVAILABLE0x06AD_TYPE_128BIT_SERVICE_UUID_COMPLETE0x07AD_TYPE_SHORT_LOCAL_NAME0x08AD_TYPE_COMPLETE_LOCAL_NAME0x09AD_TYPE_TX_POWER_LEVEL0x0AAD_TYPE_CLASS_OF_DEVICE0x0DAD_TYPE_SIMPLE_PAIRING_HASH_C0x0EAD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R0x0FAD_TYPE_SECURITY_MANAGER_TK_VALUE0x10AD_TYPE_SECURITY_MANAGER_OOB_FLAGS0x11AD_TYPE_SLAVE_CONNECTION_INTERVAL_RANGE0x12AD_TYPE_SOLICITED_SERVICE_UUIDS_16BIT0x14AD_TYPE_SOLICITED_SERVICE_UUIDS_128BIT0x15AD_TYPE_SERVICE_DATA0x16AD_TYPE_PUBLIC_TARGET_ADDRESS0x17AD_TYPE_RANDOM_TARGET_ADDRESS0x18AD_TYPE_APPEARANCE0x19AD_TYPE_ADVERTISING_INTERVAL0x1AAD_TYPE_LE_BLUETOOTH_DEVICE_ADDRESS0x1BAD_TYPE_LE_ROLE0x1CAD_TYPE_SIMPLE_PAIRING_HASH_C2560x1DAD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R2560x1EAD_TYPE_SERVICE_DATA_32BIT_UUID0x20AD_TYPE_SERVICE_DATA_128BIT_UUID0x21AD_TYPE_URI0x24AD_TYPE_3D_INFORMATION_DATA0x3DAD_TYPE_MANUFACTURER_SPECIFIC_DATA0xFF