ubluepy — Bluetooth LE çevre birimi (peripheral) ve merkez (central)

ubluepy modülü, MicroPython nRF uyarlaması ile birlikte gelen eski Bluetooth LE API’sidir. Linux bluepy Python kütüphanesi temel alınarak gevşek bir şekilde modellenmiştir ve doğrudan Nordic SoftDevice üzerine oturur — taşınabilir bir arka uç yoktur, dolayısıyla modül yalnızca Nordic hedeflerinde (OpenMV ürün yelpazesinde Arduino Nano 33 BLE Sense) kullanılabilir. Daha yeni bluetooth / aioble API’leri bu derlemede etkinleştirilmemiştir, bu nedenle yonga üzerindeki radyoyu sürmenin tek yolu ubluepy modülüdür.

Kullanılabilir özellik kümesi, aygıt yazılımı (firmware) tarafından flash belleğe yazılan SoftDevice’a bağlıdır:

  • s140 (Nano 33 BLE Sense) — hem çevre birimi (peripheral) hem de merkez (tarayıcı) rolleri. OpenMV aygıt yazılımının (firmware) içerdiği budur.

  • s132 — hem çevre birimi hem de merkez.

  • s110 — yalnızca çevre birimi; tarayıcı / bağlanma metotları derleme dışı bırakılır.

Çevre birimi örneği

Tek bir çevresel algılama hizmetiyle Bluetooth LE çevre birimi olarak yayın yapın ve Client Characteristic Configuration Descriptor (CCCD) öğesine yapılan her yazma işleminde bir sıcaklık karakteristiğine bildirim gönderin:

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])

Merkez örneği

100 ms boyunca yakındaki yayın yapan cihazları tarayın ve her ScanEntry öğesinin reklam verisini çözün:

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))

Modül içeriği

Sınıflar

class ubluepy.UUID(value)

16 bitlik veya 128 bitlik bir Bluetooth UUID oluşturur.

value

Şunlardan biri:

  • int — 16 bitlik sayısal bir UUID (UUID(0x180A)).

  • 6 karakterlik "0xXXXX" dizesi — 16 bitlik bir UUID, örn. UUID("0x181A").

  • 36 karakterlik "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" dizesi — tam 128 bitlik bir UUID. Üreticiye özel kısım, oluşturma sırasında SoftDevice’a kaydedilir.

  • Başka bir UUID örneği — bir kopya gerçekleştirir.

Başka herhangi bir uzunluk ValueError("Invalid UUID string length") hatasını yükseltir.

binVal() int

UUID’nin düşük 16 bitini bir int olarak döndürür. 128 bitlik UUID’ler için yalnızca üreticiye özel UUID içine gömülü 16 bitlik alan döndürülür (tam 128 bitlik değere yalnızca SoftDevice’ın üreticiye özel dizini aracılığıyla erişilebilir).

class ubluepy.Service(uuid: UUID, type: int = Service.PRIMARY)

Bir Peripheral öğesine eklendiğinde SoftDevice’a kaydedilecek bir GATT hizmeti tanımlar.

uuid

Bir UUID örneği. UUID olmayan bir nesne geçirmek ValueError hatasını yükseltir.

type

Service.PRIMARY (varsayılan) veya Service.SECONDARY öğelerinden biri. Diğer değerler ValueError hatasını yükseltir.

uuid() UUID

Hizmetin UUID örneğini döndürür.

addCharacteristic(characteristic: Characteristic) None

Hizmete bir Characteristic kaydeder. Karakteristiğin GATT tutamacı (handle) bu çağrı sırasında atanır.

getCharacteristic(uuid: UUID) Characteristic | None

Daha önce eklenmiş bir Characteristic öğesini UUID’ye göre arar. Karakteristik örneğini, eşleşme bulunamazsa None döndürür.

getCharacteristics() list

Hizmete eklenen her karakteristiğin listesini döndürür.

PRIMARY: int

Birincil hizmetler için hizmet türü sabiti (1).

SECONDARY: int

İkincil hizmetler için hizmet türü sabiti (2).

class ubluepy.Characteristic(uuid: UUID, *, props: int = PROP_READ | PROP_WRITE, attrs: int = 0)

Bir GATT karakteristiği tanımlar. Üst Peripheral öğesi yayına başlamadan önce Service.addCharacteristic() ile bir Service öğesine ekleyin.

uuid

Bir UUID örneği.

props (yalnızca anahtar sözcük)

Karakteristiğin hangi işlemleri desteklediğini açıklayan bir veya daha fazla Characteristic.PROP_* değerinden oluşan bit maskesi.

attrs (yalnızca anahtar sözcük)

Ek GATT özniteliklerinin bit maskesi. Bir Client Characteristic Configuration Descriptor eklemek için Characteristic.ATTR_CCCD kullanın — PROP_NOTIFY / PROP_INDICATE karakteristiklerinin çalışması için gereklidir.

uuid() UUID

Karakteristiğin UUID örneğini döndürür.

properties() int

Oluşturma sırasında ayarlanan props bit maskesini döndürür.

read() bytearray

Yalnızca merkez rolü. Karakteristiğin değerini bağlı eşten okur. En son değeri içeren bir bytearray döndürür. Bir çevre biriminde bu işlemsizdir (no-op) ve None döndürür.

write(data, *, with_response: bool = False) None

Karakteristiğe yazar.

  • Bir çevre biriminde, karakteristiğin özelliklerinde PROP_NOTIFY ayarlanmışsa değer, bağlı merkeze bir GATT bildirimi olarak gönderilir; aksi takdirde yerel öznitelik değeri güncellenir.

  • Bir merkezde, değer uzaktaki eşe yazılır. Bir yazma komutu yerine bir yazma isteği göndermek ve eşin onayını beklemek için with_response=True ayarlayın.

data, herhangi bir arabellek protokolü nesnesidir (bytes, bytearray, memoryview).

PROP_BROADCAST: int

Karakteristik değerini yayınlayabilir (0x01).

PROP_READ: int

Karakteristik okumaları destekler (0x02).

PROP_WRITE_WO_RESP: int

Karakteristik yanıtsız yazmaları destekler (0x04).

PROP_WRITE: int

Karakteristik yanıtlı yazmaları destekler (0x08).

PROP_NOTIFY: int

Karakteristik, abone olan bir merkeze bildirim gönderebilir (0x10).

PROP_INDICATE: int

Karakteristik, abone olan bir merkeze gösterimler (onaylanmış bildirimler) gönderebilir (0x20).

PROP_AUTH_SIGNED_WR: int

Karakteristik, kimliği doğrulanmış imzalı yazmaları destekler (0x40).

ATTR_CCCD: int

Karakteristiğe bir Client Characteristic Configuration Descriptor ekler (0x01). İstemcilerin bildirimlere/gösterimlere abone olabilmesi için gereklidir.

class ubluepy.Descriptor(uuid: UUID)

GATT tanımlayıcılarını temsil etmek için iskelet sınıfı. Mevcut uygulama yalnızca UUID’yi saklar ve hiçbir metot sunmaz — modülün gelecekteki sürümleriyle ileriye dönük uyumluluk için sağlanmıştır.

class ubluepy.Peripheral

Yerel Bluetooth LE cihazı. Hem çevre birimi hem de merkez rolleri için aynı sınıf kullanılır; rol, çağırdığınız metotlara göre seçilir (advertise() çevre birimini, connect() merkezi seçer).

addService(service: Service) None

Yerel GATT sunucusuna bir Service (ve daha önce eklenmiş tüm karakteristikleri) kaydeder.

getServices() list

Bu Peripheral öğesine şu anda kayıtlı olan hizmetlerin listesini döndürür.

advertise(*, device_name: str | None = None, services: list | None = None, data: bytes | None = None, connectable: bool = True) None

Çevre birimi rolünde yayına başlar.

device_name

GAP yükünde yayınlanan tam yerel ad.

services

Yayınlanacak Service örneklerinin listesi. Her hizmetin UUID’si reklama dahil edilir.

data

Otomatik oluşturulan başlığa eklenen isteğe bağlı ham reklam yükü (bytes / bytearray). Bunu Eddystone gibi üreticiye özel veya işaret (beacon) yükleri için kullanın.

connectable

True (varsayılan) olduğunda, bağlanılabilir bir cihaz olarak yayın yapar ve GAP / GATTS olay işleyicilerini kaydeder; böylece yapılandırılmış setConnectionHandler() geri çağırması (callback) bağlantı, bağlantı kesme ve CCCD yazma işlemlerinde tetiklenir. False olduğunda, bir işaret (beacon) olarak yayın yapar — hiçbir işleyici eklenmez ve cihaza bağlanılamaz.

advertise_stop() None

Devam eden tüm reklamları durdurur.

setConnectionHandler(func) None

GAP ve GATTS olaylarında çağrılan bir geri çağırma (callback) kaydeder. Geri çağırma func(event_id, conn_handle, data) olarak çağrılır; burada event_id, constants.EVT_GAP_CONNECTED, constants.EVT_GAP_DISCONNECTED veya constants.EVT_GATTS_WRITE değerlerinden biridir, conn_handle, SoftDevice bağlantı tutamacıdır (veya GATTS yazmaları için öznitelik tutamacı) ve data, ham olay yükünün bir bytearray halidir (veya bağlantı / bağlantı kesme için None).

setNotificationHandler(func) None

Merkez rolünde alınan bildirim olayları için bir geri çağırma (callback) kaydeder.

withDelegate(delegate: DefaultDelegate) None

Çözülmüş GATT olaylarını almak için bir DefaultDelegate örneği ekler.

disconnect() None

Etkin bağlantıyı keser (bu derlemede şu anda işlemsiz bir iskelettir).

connect(addr, *, addr_type: int = constants.ADDR_TYPE_PUBLIC) None

Yalnızca merkez rolü. Verilen adrese sahip eşe bağlanır ve birincil hizmetlerini ve karakteristiklerini eşzamanlı olarak keşfeder. Bağlantı kurulana ve keşif tamamlanana kadar bloke eder; keşfedilen hizmetler daha sonra getServices() aracılığıyla kullanılabilir.

addr

17 karakterlik "xx:xx:xx:xx:xx:xx" dizesi olarak eş adresi (örn. ScanEntry.addr() öğesinden alınan).

addr_type (yalnızca anahtar sözcük)

constants.ADDR_TYPE_PUBLIC (varsayılan) veya constants.ADDR_TYPE_RANDOM_STATIC öğelerinden biri.

class ubluepy.Scanner

Yakındaki yayın yapan cihazları keşfetmek için GAP gözlemcisi. Yalnızca aygıt yazılımı (firmware) merkez desteği olan bir SoftDevice’a (s132 / s140) karşı derlendiğinde kullanılabilir.

scan(timeout: int) list

timeout milisaniye boyunca pasif bir tarama çalıştırır ve bir ScanEntry örnekleri listesi döndürür — pencere boyunca alınan her reklam raporu için bir tane.

class ubluepy.ScanEntry

Scanner.scan() tarafından yakalanan tek bir reklam raporu. Örnekler tarayıcıdan döndürülür — genel bir oluşturucu (constructor) yoktur.

addr() str

Eş adresini 17 karakterlik "xx:xx:xx:xx:xx:xx" dizesi olarak döndürür.

addr_type() int

Eş adresi türünü döndürür (constants.ADDR_TYPE_PUBLIC veya constants.ADDR_TYPE_RANDOM_STATIC).

rssi() int

dBm cinsinden sinyal gücü göstergesini döndürür.

getScanData() list

Reklam yükünü bir (ad_type, description, value) demetleri listesine çözer. ad_type, sayısal AD türü baytıdır (bkz. constants.ad_types), description, eşleşen sabitin adını bir dize olarak verir (veya tür bilinmiyorsa None) ve value, AD kaydının gövdesini bir bytearray olarak verir.

class ubluepy.DefaultDelegate

Peripheral.withDelegate() öğesine geçirilen nesneler için temel sınıf. GATT olaylarına tepki vermek için bu sınıftan türetin ve handleConnection() / handleNotification() metotlarını geçersiz kılın.

handleConnection() None

GAP bağlantı / bağlantı kesme olaylarında çağrılır. Varsayılan uygulama boştur.

handleNotification() None

Gelen GATT bildirimlerinde çağrılır. Varsayılan uygulama boştur.

Sabitler

Modülün constants özniteliği, GAP/GATT olay tanımlayıcıları, adres türü değerleri ve iç içe geçmiş ad_types ad alanını içeren bir ad alanıdır.

ubluepy.constants: type

Aşağıdaki sabitleri sunan kapsayıcı.

constants.EVT_GAP_CONNECTED: int

GAP bağlantısı için Peripheral bağlantı işleyicisi event_id değeri (16).

constants.EVT_GAP_DISCONNECTED: int

GAP bağlantı kesilmesi için Peripheral bağlantı işleyicisi event_id değeri (17).

constants.EVT_GATTS_WRITE: int

Bildirimleri etkinleştiren/devre dışı bırakan bir CCCD’ye yapılan yazmalar dahil olmak üzere, yerel bir GATT özniteliğine yapılan bir yazma için Peripheral bağlantı işleyicisi event_id değeri (80).

constants.UUID_CCCD: int

Client Characteristic Configuration Descriptor için standart Bluetooth UUID’si (0x2902).

constants.ADDR_TYPE_PUBLIC: int

Genel (Public) Bluetooth Cihaz Adresi (0).

constants.ADDR_TYPE_RANDOM_STATIC: int

Statik rastgele Bluetooth Cihaz Adresi (1).

constants.ad_types: type

Bluetooth Core Specification Supplement kaynağından gelen reklam verisi AD türü sabitlerinin ad alanı. Her ad, karşılık gelen 1 baytlık AD türüyle eşleşir:

Ad

Değer

AD_TYPE_FLAGS

0x01

AD_TYPE_16BIT_SERVICE_UUID_MORE_AVAILABLE

0x02

AD_TYPE_16BIT_SERVICE_UUID_COMPLETE

0x03

AD_TYPE_32BIT_SERVICE_UUID_MORE_AVAILABLE

0x04

AD_TYPE_32BIT_SERVICE_UUID_COMPLETE

0x05

AD_TYPE_128BIT_SERVICE_UUID_MORE_AVAILABLE

0x06

AD_TYPE_128BIT_SERVICE_UUID_COMPLETE

0x07

AD_TYPE_SHORT_LOCAL_NAME

0x08

AD_TYPE_COMPLETE_LOCAL_NAME

0x09

AD_TYPE_TX_POWER_LEVEL

0x0A

AD_TYPE_CLASS_OF_DEVICE

0x0D

AD_TYPE_SIMPLE_PAIRING_HASH_C

0x0E

AD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R

0x0F

AD_TYPE_SECURITY_MANAGER_TK_VALUE

0x10

AD_TYPE_SECURITY_MANAGER_OOB_FLAGS

0x11

AD_TYPE_SLAVE_CONNECTION_INTERVAL_RANGE

0x12

AD_TYPE_SOLICITED_SERVICE_UUIDS_16BIT

0x14

AD_TYPE_SOLICITED_SERVICE_UUIDS_128BIT

0x15

AD_TYPE_SERVICE_DATA

0x16

AD_TYPE_PUBLIC_TARGET_ADDRESS

0x17

AD_TYPE_RANDOM_TARGET_ADDRESS

0x18

AD_TYPE_APPEARANCE

0x19

AD_TYPE_ADVERTISING_INTERVAL

0x1A

AD_TYPE_LE_BLUETOOTH_DEVICE_ADDRESS

0x1B

AD_TYPE_LE_ROLE

0x1C

AD_TYPE_SIMPLE_PAIRING_HASH_C256

0x1D

AD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R256

0x1E

AD_TYPE_SERVICE_DATA_32BIT_UUID

0x20

AD_TYPE_SERVICE_DATA_128BIT_UUID

0x21

AD_TYPE_URI

0x24

AD_TYPE_3D_INFORMATION_DATA

0x3D

AD_TYPE_MANUFACTURER_SPECIFIC_DATA

0xFF