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