ubluepy — периферийное и центральное устройство Bluetooth LE¶
Модуль ubluepy — это устаревший API Bluetooth LE, поставляемый с портом nRF MicroPython. Он нестрого смоделирован по образцу Python-библиотеки bluepy для Linux и располагается непосредственно поверх Nordic SoftDevice — переносимого бэкенда нет, поэтому модуль доступен только на платформах Nordic (в линейке OpenMV — это Arduino Nano 33 BLE Sense). Более новые 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 мс и декодировать рекламные данные каждой записи 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-битный UUID Bluetooth.
valueОдин из:
int— 16-битный числовой UUID (UUID(0x180A)).Строка из 6 символов
"0xXXXX"— 16-битный UUID, напримерUUID("0x181A").Строка из 36 символов
"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"— полный 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, чтобы прикрепить Client Characteristic Configuration Descriptor — это необходимо для работы характеристик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).
- PROP_NOTIFY: int¶
Характеристика может отправлять уведомления подписанному центральному устройству (
0x10).
- PROP_INDICATE: int¶
Характеристика может отправлять индикации (подтверждаемые уведомления) подписанному центральному устройству (
0x20).
- 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Адрес узла в виде строки из 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_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¶
Стандартный UUID Bluetooth для Client Characteristic Configuration Descriptor (
0x2902).
- constants.ad_types: type¶
Пространство имён констант типов AD рекламных данных из Bluetooth Core Specification Supplement. Каждое имя соответствует своему 1-байтовому типу 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