ubluepy — urządzenie peryferyjne i centralne Bluetooth LE¶
Moduł ubluepy to starsze API Bluetooth LE dostarczane z portem nRF MicroPython. Jest luźno wzorowany na linuksowej bibliotece Python bluepy i działa bezpośrednio na bazie Nordic SoftDevice — nie ma przenośnego back-endu, więc moduł jest dostępny wyłącznie na docelowych platformach Nordic (Arduino Nano 33 BLE Sense w ofercie OpenMV). Nowsze API bluetooth / aioble nie są włączone w tej kompilacji, więc ubluepy jest jedynym sposobem obsługi wbudowanego radia.
Dostępny zestaw funkcji zależy od SoftDevice zaprogramowanego przez oprogramowanie układowe:
s140 (Nano 33 BLE Sense) — zarówno rola urządzenia peryferyjnego, jak i centralnego (skanera). To właśnie jest dostarczane w oprogramowaniu układowym OpenMV.
s132 — zarówno urządzenie peryferyjne, jak i centralne.
s110 — tylko urządzenie peryferyjne; metody skanera / łączenia są wykluczone z kompilacji.
Przykład urządzenia peryferyjnego¶
Rozgłasza się jako urządzenie peryferyjne Bluetooth LE z pojedynczą usługą monitorowania środowiska i powiadamia o charakterystyce temperatury przy każdym zapisie do jego 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])
Przykład urządzenia centralnego¶
Skanuje w poszukiwaniu pobliskich rozgłaszających się urządzeń przez 100 ms i dekoduje dane rozgłoszeniowe każdego 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))
Zawartość modułu¶
Klasy¶
- class ubluepy.UUID(value)¶
Konstruuje 16- lub 128-bitowy identyfikator Bluetooth UUID.
valueJedno z:
int— 16-bitowy numeryczny UUID (UUID(0x180A)).6-znakowy ciąg
"0xXXXX"— 16-bitowy UUID, np.UUID("0x181A").36-znakowy ciąg
"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"— pełny 128-bitowy UUID. Część charakterystyczna dla dostawcy jest rejestrowana w SoftDevice podczas konstruowania.Inna instancja
UUID— wykonuje kopię.
Każda inna długość wywołuje
ValueError("Invalid UUID string length").
- class ubluepy.Service(uuid: UUID, type: int = Service.PRIMARY)¶
Definiuje usługę GATT, która zostanie zarejestrowana w SoftDevice po dodaniu do
Peripheral.uuidInstancja
UUID. Przekazanie obiektu niebędącego UUID wywołujeValueError.typeAlbo
Service.PRIMARY(domyślnie), alboService.SECONDARY. Inne wartości wywołująValueError.
- addCharacteristic(characteristic: Characteristic) None¶
Rejestruje
Characteristicw usłudze. Uchwyt GATT charakterystyki jest przypisywany podczas tego wywołania.
- getCharacteristic(uuid: UUID) Characteristic | None¶
Wyszukuje wcześniej dodaną
Characteristicpo UUID. Zwraca instancję charakterystyki lubNone, jeśli nie znaleziono dopasowania.
- class ubluepy.Characteristic(uuid: UUID, *, props: int = PROP_READ | PROP_WRITE, attrs: int = 0)¶
Definiuje charakterystykę GATT. Dodaj ją do
Serviceza pomocąService.addCharacteristic(), zanim nadrzędnePeripheralrozpocznie rozgłaszanie.uuidInstancja
UUID.props(tylko jako argument nazwany)Maska bitowa jednej lub więcej wartości
Characteristic.PROP_*opisująca, jakie operacje obsługuje charakterystyka.attrs(tylko jako argument nazwany)Maska bitowa dodatkowych atrybutów GATT. Użyj
Characteristic.ATTR_CCCD, aby dołączyć Client Characteristic Configuration Descriptor — wymagany, aby charakterystykiPROP_NOTIFY/PROP_INDICATEdziałały.
- read() bytearray¶
Tylko rola centralna. Odczytuje wartość charakterystyki od połączonego peera. Zwraca
bytearrayz najnowszą wartością. Na urządzeniu peryferyjnym jest to operacja pusta i zwracaNone.
- write(data, *, with_response: bool = False) None¶
Zapisuje do charakterystyki.
Na urządzeniu peryferyjnym, jeśli we właściwościach charakterystyki ustawiono
PROP_NOTIFY, wartość jest wysyłana jako powiadomienie GATT do połączonego urządzenia centralnego; w przeciwnym razie aktualizowana jest lokalna wartość atrybutu.Na urządzeniu centralnym wartość jest zapisywana na zdalnym peerze. Ustaw
with_response=True, aby wysłać żądanie zapisu i czekać na potwierdzenie peera zamiast polecenia zapisu.
datato dowolny obiekt protokołu bufora (bytes,bytearray,memoryview).
- PROP_NOTIFY: int¶
Charakterystyka może wysyłać powiadomienia do subskrybującego urządzenia centralnego (
0x10).
- class ubluepy.Descriptor(uuid: UUID)¶
Klasa-zaślepka reprezentująca deskryptory GATT. Bieżąca implementacja przechowuje jedynie UUID i nie udostępnia żadnych metod — jest dostarczana w celu zachowania zgodności z przyszłymi wersjami modułu.
- class ubluepy.Peripheral¶
Lokalne urządzenie Bluetooth LE. Ta sama klasa jest używana zarówno dla roli urządzenia peryferyjnego, jak i centralnego; rolę wybiera się przez to, które metody się wywołuje (
advertise()wybiera urządzenie peryferyjne,connect()wybiera urządzenie centralne).- addService(service: Service) None¶
Rejestruje
Service(i wszystkie jego wcześniej dodane charakterystyki) na lokalnym serwerze GATT.
- getServices() list¶
Zwraca listę usług aktualnie zarejestrowanych w tym
Peripheral.
- advertise(*, device_name: str | None = None, services: list | None = None, data: bytes | None = None, connectable: bool = True) None¶
Rozpoczyna rozgłaszanie w roli urządzenia peryferyjnego.
device_namePełna lokalna nazwa rozgłaszana w ładunku GAP.
servicesLista instancji
Servicedo rozgłaszania. UUID każdej usługi jest dołączany do rozgłoszenia.dataOpcjonalny surowy ładunek rozgłoszeniowy (
bytes/bytearray) dołączany do automatycznie generowanego nagłówka. Użyj go dla ładunków charakterystycznych dla dostawcy lub ładunków beacon, takich jak Eddystone.connectableGdy
True(domyślnie), rozgłasza się jako urządzenie umożliwiające połączenie i rejestruje obsługę zdarzeń GAP / GATTS, tak aby skonfigurowane wywołanie zwrotnesetConnectionHandler()uruchamiało się przy połączeniu, rozłączeniu i zapisach CCCD. GdyFalse, rozgłasza się jako beacon — żadna obsługa nie jest dołączana i nie można się połączyć z urządzeniem.
- setConnectionHandler(func) None¶
Rejestruje wywołanie zwrotne uruchamiane przy zdarzeniach GAP i GATTS. Wywołanie zwrotne jest wywoływane jako
func(event_id, conn_handle, data), gdzieevent_idjest jedną z wartościconstants.EVT_GAP_CONNECTED,constants.EVT_GAP_DISCONNECTEDlubconstants.EVT_GATTS_WRITE,conn_handlejest uchwytem połączenia SoftDevice (lub uchwytem atrybutu dla zapisów GATTS), adatajest surowym ładunkiem zdarzenia jakobytearray(lubNonedla połączenia / rozłączenia).
- setNotificationHandler(func) None¶
Rejestruje wywołanie zwrotne dla zdarzeń powiadomień odbieranych w roli centralnej.
- withDelegate(delegate: DefaultDelegate) None¶
Dołącza instancję
DefaultDelegatedo odbierania zdekodowanych zdarzeń GATT.
- connect(addr, *, addr_type: int = constants.ADDR_TYPE_PUBLIC) None¶
Tylko rola centralna. Łączy się z peerem o podanym adresie i synchronicznie wykrywa jego usługi podstawowe i charakterystyki. Blokuje, dopóki połączenie nie zostanie nawiązane i wykrywanie nie zostanie ukończone; wykryte usługi są następnie dostępne przez
getServices().addrAdres peera jako 17-znakowy ciąg
"xx:xx:xx:xx:xx:xx"(np. pobrany zScanEntry.addr()).addr_type(tylko jako argument nazwany)Albo
constants.ADDR_TYPE_PUBLIC(domyślnie), alboconstants.ADDR_TYPE_RANDOM_STATIC.
- class ubluepy.Scanner¶
Obserwator GAP do wykrywania pobliskich rozgłaszających się urządzeń. Dostępny tylko wtedy, gdy oprogramowanie układowe jest skompilowane z SoftDevice obsługującym rolę centralną (s132 / s140).
- class ubluepy.ScanEntry¶
Pojedynczy raport rozgłoszeniowy przechwycony przez
Scanner.scan(). Instancje są zwracane przez skaner — nie istnieje publiczny konstruktor.- addr_type() int¶
Zwraca typ adresu peera (
constants.ADDR_TYPE_PUBLIClubconstants.ADDR_TYPE_RANDOM_STATIC).
- getScanData() list¶
Dekoduje ładunek rozgłoszeniowy na listę krotek
(ad_type, description, value).ad_typeto numeryczny bajt typu AD (zobaczconstants.ad_types),descriptionto nazwa pasującej stałej jako ciąg znaków (lubNone, jeśli typ jest nieznany), avalueto treść rekordu AD jakobytearray.
- class ubluepy.DefaultDelegate¶
Klasa bazowa dla obiektów przekazywanych do
Peripheral.withDelegate(). Utwórz jej podklasę i nadpiszhandleConnection()/handleNotification(), aby reagować na zdarzenia GATT.
Stałe¶
Atrybut constants modułu to przestrzeń nazw zawierająca identyfikatory zdarzeń GAP/GATT, wartości typów adresów oraz zagnieżdżoną przestrzeń nazw ad_types.
- constants.EVT_GAP_CONNECTED: int¶
Wartość
event_idobsługi połączeńPeripheraldla połączenia GAP (16).
- constants.EVT_GAP_DISCONNECTED: int¶
Wartość
event_idobsługi połączeńPeripheraldla rozłączenia GAP (17).
- constants.EVT_GATTS_WRITE: int¶
Wartość
event_idobsługi połączeńPeripheraldla zapisu do lokalnego atrybutu GATT, w tym zapisów do CCCD włączających/wyłączających powiadomienia (80).
- constants.UUID_CCCD: int¶
Standardowy UUID Bluetooth dla Client Characteristic Configuration Descriptor (
0x2902).
- constants.ad_types: type¶
Przestrzeń nazw stałych typów AD danych rozgłoszeniowych z Bluetooth Core Specification Supplement. Każda nazwa odpowiada odpowiedniemu 1-bajtowemu typowi AD:
Nazwa
Wartość
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