ubluepy --- طرفية ومركز Bluetooth LE¶
وحدة ubluepy هي واجهة برمجة Bluetooth LE القديمة المرفقة مع منفذ nRF من MicroPython. وهي مصممة بشكل فضفاض على غرار مكتبة Python المسماة bluepy وتعمل مباشرة فوق Nordic SoftDevice --- لا يوجد خلفية قابلة للنقل، لذا فإن الوحدة متاحة فقط على أهداف Nordic (وهي Arduino Nano 33 BLE Sense ضمن تشكيلة OpenMV). أما واجهات bluetooth / aioble الأحدث فهي غير مفعّلة في هذا الإصدار، لذا فإن ubluepy هي الطريقة الوحيدة لتشغيل الراديو المدمج في الشريحة.
تعتمد مجموعة الميزات المتاحة على SoftDevice المُبرمج في الذاكرة بواسطة البرنامج الثابت:
s140 (Nano 33 BLE Sense) --- دورا الطرفية والمركز (الماسح) معًا. هذا ما يأتي به برنامج OpenMV الثابت.
s132 --- دورا الطرفية والمركز معًا.
s110 --- الطرفية فقط؛ طرائق الماسح / الاتصال مستبعدة من التجميع.
مثال على الطرفية¶
الإعلان كطرفية Bluetooth LE بخدمة استشعار بيئي واحدة وإرسال إشعار بخاصية درجة الحرارة عند كل كتابة إلى واصف تكوين خاصية العميل (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 مللي ثانية وفك ترميز بيانات الإعلان لكل 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 لبلوتوث بطول 16 أو 128 بت.
valueأحد القيم التالية:
int--- معرّف UUID رقمي بطول 16 بت (UUID(0x180A)).سلسلة نصية من 6 أحرف بصيغة
"0xXXXX"--- معرّف UUID بطول 16 بت، مثلUUID("0x181A").سلسلة نصية من 36 حرفًا بصيغة
"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"--- معرّف 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مع الخدمة. يُسنَد مقبض 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لإرفاق واصف تكوين خاصية العميل --- وهو مطلوب لتشغيل خصائصPROP_NOTIFY/PROP_INDICATE.
- read() bytearray¶
دور المركز فقط. قراءة قيمة الخاصية من النظير المتصل. يعيد
bytearrayيحتوي على آخر قيمة. على الطرفية لا تُجري أي عملية وتعيدNone.
- write(data, *, with_response: bool = False) None¶
الكتابة إلى الخاصية.
على الطرفية، إذا كانت
PROP_NOTIFYمضبوطة في خصائص الخاصية فإن القيمة تُرسَل كإشعار GATT إلى المركز المتصل؛ وإلا تُحدَّث قيمة السمة المحلية.على المركز، تُكتب القيمة إلى النظير البعيد. اضبط
with_response=Trueلإصدار طلب كتابة وانتظار إقرار النظير بدلًا من أمر كتابة.
dataهو أي كائن يدعم بروتوكول المخزن المؤقت (bytesأوbytearrayأوmemoryview).
- class ubluepy.Descriptor(uuid: UUID)¶
صنف هيكلي لتمثيل واصفات GATT. لا يخزّن التنفيذ الحالي سوى UUID ولا يعرض أي طرائق --- وهو موفّر للتوافق المستقبلي مع المراجعات اللاحقة للوحدة.
- class ubluepy.Peripheral¶
جهاز Bluetooth LE المحلي. يُستخدم الصنف ذاته لدوري الطرفية والمركز معًا؛ ويُحدَّد الدور بحسب الطرائق التي تستدعيها (
advertise()تختار الطرفية، وconnect()تختار المركز).- 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 بحيث تُطلَق دالة رد النداء المُهيّأة عبرsetConnectionHandler()عند الاتصال وقطع الاتصال وكتابات CCCD. وعند ضبطها علىFalse، يُعلَن عن الجهاز كمنارة --- لا تُرفَق أي معالِجات ولا يمكن الاتصال بالجهاز.
- setConnectionHandler(func) None¶
تسجيل دالة رد نداء تُستدعى عند أحداث GAP وGATTS. تُستدعى دالة رد النداء بالصيغة
func(event_id, conn_handle, data)حيث يكونevent_idإحدى قيمconstants.EVT_GAP_CONNECTEDأوconstants.EVT_GAP_DISCONNECTEDأوconstants.EVT_GATTS_WRITE، ويكونconn_handleمقبض اتصال SoftDevice (أو مقبض السمة لكتابات GATTS)، ويكونdataحمولة الحدث الخام بصيغةbytearray(أوNoneللاتصال / قطع الاتصال).
- withDelegate(delegate: DefaultDelegate) None¶
إرفاق نسخة
DefaultDelegateلاستقبال أحداث GATT المفكوكة الترميز.
- connect(addr, *, addr_type: int = constants.ADDR_TYPE_PUBLIC) None¶
دور المركز فقط. الاتصال بالنظير ذي العنوان المعطى واكتشاف خدماته الأساسية وخصائصه بشكل متزامن. يحجب التنفيذ حتى يُنشأ الاتصال ويكتمل الاكتشاف؛ وعندها تصبح الخدمات المكتشفة متاحة عبر
getServices().addrعنوان النظير كسلسلة نصية من 17 حرفًا بصيغة
"xx:xx:xx:xx:xx:xx"(مثلًا مأخوذ من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(). تُعاد النسخ من الماسح --- لا يوجد بانٍ عام.- addr_type() int¶
يعيد نوع عنوان النظير (
constants.ADDR_TYPE_PUBLICأوconstants.ADDR_TYPE_RANDOM_STATIC).
- getScanData() list¶
فك ترميز حمولة الإعلان إلى قائمة من الصفوف
(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.ad_types: type¶
نطاق أسماء لثوابت أنواع AD لبيانات الإعلان من ملحق مواصفات بلوتوث الأساسية. يرتبط كل اسم بنوع 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