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.
valueSalah satu dari:
int--- UUID numerik 16-bit (UUID(0x180A)).String
"0xXXXX"6-karakter --- UUID 16-bit, misalnyaUUID("0x181A").String
"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"36-karakter --- UUID 128-bit penuh. Bagian vendor-spesifik didaftarkan ke SoftDevice saat konstruksi.Instance
UUIDlain --- melakukan salinan.
Panjang lain apa pun akan memunculkan
ValueError("Invalid UUID string length").
- class ubluepy.Service(uuid: UUID, type: int = Service.PRIMARY)¶
Definisikan layanan GATT yang akan didaftarkan ke SoftDevice saat ditambahkan ke
Peripheral.uuidInstance
UUID. Meneruskan objek non-UUID akan memunculkanValueError.typeSalah satu
Service.PRIMARY(default) atauService.SECONDARY. Nilai lain memunculkanValueError.
- addCharacteristic(characteristic: Characteristic) None¶
Daftarkan
Characteristicke layanan. Handle GATT karakteristik ditetapkan selama pemanggilan ini.
- getCharacteristic(uuid: UUID) Characteristic | None¶
Cari
Characteristicyang sebelumnya ditambahkan berdasarkan UUID. Mengembalikan instance karakteristik, atauNonejika tidak ditemukan.
- class ubluepy.Characteristic(uuid: UUID, *, props: int = PROP_READ | PROP_WRITE, attrs: int = 0)¶
Definisikan karakteristik GATT. Tambahkan ke
ServicedenganService.addCharacteristic()sebelumPeripheralinduk mulai beriklan.uuidInstance
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_CCCDuntuk melampirkan Client Characteristic Configuration Descriptor --- diperlukan agar karakteristikPROP_NOTIFY/PROP_INDICATEberfungsi.
- read() bytearray¶
Hanya peran central. Baca nilai karakteristik dari peer yang terhubung. Mengembalikan
bytearraydengan nilai terbaru. Pada peripheral ini adalah no-op dan mengembalikanNone.
- write(data, *, with_response: bool = False) None¶
Tulis ke karakteristik.
Pada peripheral, jika
PROP_NOTIFYdiatur 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=Trueuntuk mengeluarkan permintaan tulis dan menunggu pengakuan dari peer alih-alih perintah tulis.
dataadalah objek protokol buffer apa pun (bytes,bytearray,memoryview).
- PROP_INDICATE: int¶
Karakteristik dapat mendorong indikasi (notifikasi yang diakui) ke central yang berlangganan (
0x20).
- 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
Peripheralini.
- advertise(*, device_name: str | None = None, services: list | None = None, data: bytes | None = None, connectable: bool = True) None¶
Mulai beriklan dalam peran peripheral.
device_nameNama lokal lengkap yang diiklankan dalam payload GAP.
servicesDaftar instance
Serviceuntuk diiklankan. UUID setiap layanan disertakan dalam iklan.dataPayload iklan mentah opsional (
bytes/bytearray) yang ditambahkan ke header yang dibuat secara otomatis. Gunakan ini untuk payload vendor-spesifik atau beacon seperti Eddystone.connectableSaat
True(default), iklankan sebagai perangkat yang dapat dihubungkan dan daftarkan handler event GAP / GATTS sehingga callbacksetConnectionHandler()yang dikonfigurasi aktif saat connect, disconnect, dan penulisan CCCD. SaatFalse, iklankan sebagai beacon --- tidak ada handler yang dilampirkan dan perangkat tidak dapat dihubungkan.
- setConnectionHandler(func) None¶
Daftarkan callback yang dipanggil pada event GAP dan GATTS. Callback dipanggil sebagai
func(event_id, conn_handle, data)di manaevent_idadalah salah satu nilaiconstants.EVT_GAP_CONNECTED,constants.EVT_GAP_DISCONNECTED, atauconstants.EVT_GATTS_WRITE,conn_handleadalah handle koneksi SoftDevice (atau handle atribut untuk penulisan GATTS), dandataadalah payload event mentah sebagaibytearray(atauNoneuntuk connect / disconnect).
- setNotificationHandler(func) None¶
Daftarkan callback untuk event notifikasi yang diterima dalam peran central.
- withDelegate(delegate: DefaultDelegate) None¶
Lampirkan instance
DefaultDelegateuntuk menerima event GATT yang sudah didekode.
- 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().addrAlamat peer sebagai string
"xx:xx:xx:xx:xx:xx"17-karakter (misalnya diambil dariScanEntry.addr()).addr_type(hanya kata kunci)Salah satu
constants.ADDR_TYPE_PUBLIC(default) atauconstants.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).
- class ubluepy.ScanEntry¶
Satu laporan iklan yang ditangkap oleh
Scanner.scan(). Instance dikembalikan dari scanner --- tidak ada konstruktor publik.- addr_type() int¶
Kembalikan tipe alamat peer (
constants.ADDR_TYPE_PUBLICatauconstants.ADDR_TYPE_RANDOM_STATIC).
- getScanData() list¶
Dekode payload iklan menjadi daftar tuple
(ad_type, description, value).ad_typeadalah byte tipe AD numerik (lihatconstants.ad_types),descriptionadalah nama konstanta yang cocok sebagai string (atauNonejika tipe tidak dikenal), danvalueadalah badan rekaman AD sebagaibytearray.
- class ubluepy.DefaultDelegate¶
Kelas dasar untuk objek yang diteruskan ke
Peripheral.withDelegate(). Turunkan dan timpahandleConnection()/handleNotification()untuk bereaksi terhadap event GATT.
Konstanta¶
Atribut constants dari modul adalah namespace yang berisi pengidentifikasi event GAP/GATT, nilai tipe alamat, dan namespace ad_types yang bersarang.
- constants.EVT_GAP_DISCONNECTED: int¶
Nilai
event_idhandler koneksiPeripheraluntuk GAP disconnect (17).
- constants.EVT_GATTS_WRITE: int¶
Nilai
event_idhandler koneksiPeripheraluntuk 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.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_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