ubluepy --- periferal dan central Bluetooth LE

Modul ubluepy adalah API Bluetooth LE lama yang dikirimkan dengan port nRF MicroPython. Modul ini dirancang secara longgar berdasarkan perpustakaan Python bluepy Linux dan berada langsung di atas Nordic SoftDevice --- tidak ada backend portabel, sehingga modul hanya tersedia pada target Nordic (Arduino Nano 33 BLE Sense dalam jajaran OpenMV). API bluetooth / aioble yang lebih baru tidak diaktifkan dalam build ini, sehingga ubluepy adalah satu-satunya cara untuk mengendalikan radio on-die.

Set fitur yang tersedia bergantung pada SoftDevice yang di-flash oleh firmware:

  • s140 (Nano 33 BLE Sense) --- peran peripheral dan central (scanner). Inilah yang dikirimkan oleh firmware OpenMV.

  • s132 --- periferal dan central.

  • s110 --- hanya peripheral; metode scanner / connect dikompilasi keluar.

Contoh Peripheral

Iklankan sebagai peripheral Bluetooth LE dengan satu layanan penginderaan lingkungan dan notifikasi karakteristik suhu pada setiap penulisan ke Client Characteristic Configuration Descriptor (CCCD)-nya:

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

Contoh Central

Pindai perangkat iklan terdekat selama 100 ms dan dekode data iklan setiap 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))

Isi modul

Kelas

class ubluepy.UUID(value)

Buat UUID Bluetooth 16- atau 128-bit.

value

Salah satu dari:

  • int --- UUID numerik 16-bit (UUID(0x180A)).

  • String "0xXXXX" 6-karakter --- UUID 16-bit, misalnya UUID("0x181A").

  • String "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" 36-karakter --- UUID 128-bit penuh. Bagian vendor-spesifik didaftarkan ke SoftDevice saat konstruksi.

  • Instance UUID lain --- melakukan salinan.

Panjang lain apa pun akan memunculkan ValueError("Invalid UUID string length").

binVal() int

Kembalikan 16 bit rendah UUID sebagai int. Untuk UUID 128-bit, hanya field 16-bit yang tertanam di dalam UUID vendor-spesifik yang dikembalikan (nilai 128-bit penuh hanya dapat diakses melalui indeks vendor-spesifik SoftDevice).

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

Definisikan layanan GATT yang akan didaftarkan ke SoftDevice saat ditambahkan ke Peripheral.

uuid

Instance UUID. Meneruskan objek non-UUID akan memunculkan ValueError.

type

Salah satu Service.PRIMARY (default) atau Service.SECONDARY. Nilai lain memunculkan ValueError.

uuid() UUID

Kembalikan instance UUID layanan.

addCharacteristic(characteristic: Characteristic) None

Daftarkan Characteristic ke layanan. Handle GATT karakteristik ditetapkan selama pemanggilan ini.

getCharacteristic(uuid: UUID) Characteristic | None

Cari Characteristic yang sebelumnya ditambahkan berdasarkan UUID. Mengembalikan instance karakteristik, atau None jika tidak ditemukan.

getCharacteristics() list

Kembalikan daftar semua karakteristik yang ditambahkan ke layanan.

PRIMARY: int

Konstanta tipe layanan untuk layanan primer (1).

SECONDARY: int

Konstanta tipe layanan untuk layanan sekunder (2).

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

Definisikan karakteristik GATT. Tambahkan ke Service dengan Service.addCharacteristic() sebelum Peripheral induk mulai beriklan.

uuid

Instance UUID.

props (hanya kata kunci)

Bitmask dari satu atau lebih nilai Characteristic.PROP_* yang mendeskripsikan operasi apa yang didukung oleh karakteristik.

attrs (hanya kata kunci)

Bitmask dari atribut GATT tambahan. Gunakan Characteristic.ATTR_CCCD untuk melampirkan Client Characteristic Configuration Descriptor --- diperlukan agar karakteristik PROP_NOTIFY / PROP_INDICATE berfungsi.

uuid() UUID

Kembalikan instance UUID karakteristik.

properties() int

Kembalikan bitmask props yang ditetapkan pada saat konstruksi.

read() bytearray

Hanya peran central. Baca nilai karakteristik dari peer yang terhubung. Mengembalikan bytearray dengan nilai terbaru. Pada peripheral ini adalah no-op dan mengembalikan None.

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

Tulis ke karakteristik.

  • Pada peripheral, jika PROP_NOTIFY diatur dalam properti karakteristik, nilai dikirimkan sebagai notifikasi GATT ke central yang terhubung; jika tidak, nilai atribut lokal diperbarui.

  • Pada central, nilai ditulis ke peer jarak jauh. Atur with_response=True untuk mengeluarkan permintaan tulis dan menunggu pengakuan dari peer alih-alih perintah tulis.

data adalah objek protokol buffer apa pun (bytes, bytearray, memoryview).

PROP_BROADCAST: int

Karakteristik dapat menyiarkan nilainya (0x01).

PROP_READ: int

Karakteristik mendukung pembacaan (0x02).

PROP_WRITE_WO_RESP: int

Karakteristik mendukung penulisan tanpa respons (0x04).

PROP_WRITE: int

Karakteristik mendukung penulisan dengan respons (0x08).

PROP_NOTIFY: int

Karakteristik dapat mendorong notifikasi ke central yang berlangganan (0x10).

PROP_INDICATE: int

Karakteristik dapat mendorong indikasi (notifikasi yang diakui) ke central yang berlangganan (0x20).

PROP_AUTH_SIGNED_WR: int

Karakteristik mendukung penulisan bertanda tangan yang diautentikasi (0x40).

ATTR_CCCD: int

Tambahkan Client Characteristic Configuration Descriptor ke karakteristik (0x01). Diperlukan agar klien dapat berlangganan notifikasi/indikasi.

class ubluepy.Descriptor(uuid: UUID)

Kelas stub untuk merepresentasikan deskriptor GATT. Implementasi saat ini hanya menyimpan UUID dan tidak mengekspos metode --- disediakan untuk kompatibilitas ke depan dengan revisi modul di masa mendatang.

class ubluepy.Peripheral

Perangkat Bluetooth LE lokal. Kelas yang sama digunakan untuk peran peripheral dan central; peran dipilih berdasarkan metode yang Anda panggil (advertise() memilih peripheral, connect() memilih central).

addService(service: Service) None

Daftarkan Service (dan semua karakteristiknya yang sebelumnya ditambahkan) ke server GATT lokal.

getServices() list

Kembalikan daftar layanan yang saat ini terdaftar pada Peripheral ini.

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

Mulai beriklan dalam peran peripheral.

device_name

Nama lokal lengkap yang diiklankan dalam payload GAP.

services

Daftar instance Service untuk diiklankan. UUID setiap layanan disertakan dalam iklan.

data

Payload iklan mentah opsional (bytes / bytearray) yang ditambahkan ke header yang dibuat secara otomatis. Gunakan ini untuk payload vendor-spesifik atau beacon seperti Eddystone.

connectable

Saat True (default), iklankan sebagai perangkat yang dapat dihubungkan dan daftarkan handler event GAP / GATTS sehingga callback setConnectionHandler() yang dikonfigurasi aktif saat connect, disconnect, dan penulisan CCCD. Saat False, iklankan sebagai beacon --- tidak ada handler yang dilampirkan dan perangkat tidak dapat dihubungkan.

advertise_stop() None

Hentikan iklan yang sedang berlangsung.

setConnectionHandler(func) None

Daftarkan callback yang dipanggil pada event GAP dan GATTS. Callback dipanggil sebagai func(event_id, conn_handle, data) di mana event_id adalah salah satu nilai constants.EVT_GAP_CONNECTED, constants.EVT_GAP_DISCONNECTED, atau constants.EVT_GATTS_WRITE, conn_handle adalah handle koneksi SoftDevice (atau handle atribut untuk penulisan GATTS), dan data adalah payload event mentah sebagai bytearray (atau None untuk connect / disconnect).

setNotificationHandler(func) None

Daftarkan callback untuk event notifikasi yang diterima dalam peran central.

withDelegate(delegate: DefaultDelegate) None

Lampirkan instance DefaultDelegate untuk menerima event GATT yang sudah didekode.

disconnect() None

Putuskan koneksi aktif (saat ini berupa stub no-op dalam build ini).

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

Hanya peran central. Hubungkan ke peer dengan alamat yang diberikan dan temukan layanan primer serta karakteristiknya secara sinkron. Memblokir hingga koneksi terbentuk dan penemuan selesai; layanan yang ditemukan kemudian tersedia melalui getServices().

addr

Alamat peer sebagai string "xx:xx:xx:xx:xx:xx" 17-karakter (misalnya diambil dari ScanEntry.addr()).

addr_type (hanya kata kunci)

Salah satu constants.ADDR_TYPE_PUBLIC (default) atau constants.ADDR_TYPE_RANDOM_STATIC.

class ubluepy.Scanner

Observer GAP untuk menemukan perangkat iklan terdekat. Hanya tersedia saat firmware dibangun dengan SoftDevice yang memiliki dukungan central (s132 / s140).

scan(timeout: int) list

Jalankan pemindaian pasif selama timeout milidetik dan kembalikan daftar instance ScanEntry --- satu per laporan iklan yang diterima selama jendela waktu.

class ubluepy.ScanEntry

Satu laporan iklan yang ditangkap oleh Scanner.scan(). Instance dikembalikan dari scanner --- tidak ada konstruktor publik.

addr() str

Kembalikan alamat peer sebagai string "xx:xx:xx:xx:xx:xx" 17-karakter.

addr_type() int

Kembalikan tipe alamat peer (constants.ADDR_TYPE_PUBLIC atau constants.ADDR_TYPE_RANDOM_STATIC).

rssi() int

Kembalikan indikator kekuatan sinyal dalam dBm.

getScanData() list

Dekode payload iklan menjadi daftar tuple (ad_type, description, value). ad_type adalah byte tipe AD numerik (lihat constants.ad_types), description adalah nama konstanta yang cocok sebagai string (atau None jika tipe tidak dikenal), dan value adalah badan rekaman AD sebagai bytearray.

class ubluepy.DefaultDelegate

Kelas dasar untuk objek yang diteruskan ke Peripheral.withDelegate(). Turunkan dan timpa handleConnection() / handleNotification() untuk bereaksi terhadap event GATT.

handleConnection() None

Dipanggil pada event GAP connect / disconnect. Implementasi default tidak melakukan apa-apa.

handleNotification() None

Dipanggil pada notifikasi GATT yang masuk. Implementasi default tidak melakukan apa-apa.

Konstanta

Atribut constants dari modul adalah namespace yang berisi pengidentifikasi event GAP/GATT, nilai tipe alamat, dan namespace ad_types yang bersarang.

ubluepy.constants: type

Kontainer yang mengekspos konstanta-konstanta di bawah ini.

constants.EVT_GAP_CONNECTED: int

Nilai event_id handler koneksi Peripheral untuk GAP connect (16).

constants.EVT_GAP_DISCONNECTED: int

Nilai event_id handler koneksi Peripheral untuk GAP disconnect (17).

constants.EVT_GATTS_WRITE: int

Nilai event_id handler koneksi Peripheral untuk penulisan ke atribut GATT lokal, termasuk penulisan ke CCCD yang mengaktifkan/menonaktifkan notifikasi (80).

constants.UUID_CCCD: int

UUID Bluetooth standar untuk Client Characteristic Configuration Descriptor (0x2902).

constants.ADDR_TYPE_PUBLIC: int

Alamat Perangkat Bluetooth Publik (0).

constants.ADDR_TYPE_RANDOM_STATIC: int

Alamat Perangkat Bluetooth acak statis (1).

constants.ad_types: type

Namespace konstanta tipe AD data-iklan dari Bluetooth Core Specification Supplement. Setiap nama memetakan ke tipe AD 1-byte yang sesuai:

Nama

Nilai

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