ubluepy — периферійний пристрій та центральний вузол Bluetooth LE¶
Модуль ubluepy є застарілим API Bluetooth LE, що постачається з MicroPython nRF port. Він приблизно змодельований на основі Python-бібліотеки Linux bluepy та розташований безпосередньо поверх Nordic SoftDevice — немає портативного бекенду, тому модуль доступний лише на цільових платформах Nordic (Arduino Nano 33 BLE Sense у лінійці OpenMV). Новіші API 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)¶
Створити 16- або 128-бітний Bluetooth UUID.
valueОдне з:
int— 16-бітний числовий UUID (UUID(0x180A)).Рядок
"0xXXXX"з 6 символів — 16-бітний UUID, наприкладUUID("0x181A").Рядок
"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"з 36 символів — повний 128-бітний UUID. Специфічна для постачальника частина реєструється в 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()— центральну).- 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), яке додається до автоматично створеного заголовка. Використовуйте це для специфічних для постачальника або маякових корисних навантажень, таких як 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для підключення / відключення).
- setNotificationHandler(func) None¶
Реєструє зворотний виклик для подій сповіщень, отриманих у ролі центрального вузла.
- 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(). Екземпляри повертаються зі сканера — публічний конструктор відсутній.- 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_GAP_CONNECTED: int¶
Значення
event_idобробника підключенняPeripheralдля підключення GAP (16).
- constants.EVT_GAP_DISCONNECTED: int¶
Значення
event_idобробника підключенняPeripheralдля відключення GAP (17).
- constants.EVT_GATTS_WRITE: int¶
Значення
event_idобробника підключенняPeripheralдля запису до локального атрибута GATT, включаючи записи до CCCD, що вмикають/вимикають сповіщення (80).
- constants.UUID_CCCD: int¶
Стандартний Bluetooth UUID для Дескриптора конфігурації клієнтської характеристики (
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