bluetooth --- Bluetooth tingkat rendah¶
Modul ini menyediakan antarmuka ke kontroler Bluetooth yang terpasang. Modul ini mendukung Bluetooth Low Energy (BLE) dalam peran Central, Peripheral, Broadcaster, dan Observer, serta GATT Server dan Client serta kanal berorientasi koneksi L2CAP. Sebuah perangkat dapat beroperasi dalam beberapa peran secara bersamaan. Pairing dan bonding juga didukung.
API ini dimaksudkan untuk mengikuti protokol Bluetooth tingkat rendah dan menyediakan blok pembangun untuk abstraksi tingkat yang lebih tinggi seperti jenis perangkat tertentu.
Tip
Untuk sebagian besar aplikasi, lebih baik gunakan pustaka tingkat tinggi aioble, yang menyediakan pembungkus berbasis asyncio di sekitar modul ini. Lihat aioble --- Async BLE.
class BLE¶
- class bluetooth.BLE¶
Mengembalikan objek BLE singleton.
Konfigurasi
- active(active: bool | None = None, /) bool¶
Secara opsional mengubah status aktif radio BLE, dan mengembalikan status saat ini.
Radio harus diaktifkan sebelum menggunakan metode lain pada kelas ini.
- config(param: str, /) Any¶
- config(*, **kwargs: Any) None
Mendapatkan atau mengatur nilai konfigurasi antarmuka BLE. Untuk mendapatkan nilai, nama parameter harus dikutip sebagai string, dan hanya satu parameter yang dapat dikueri pada satu waktu. Untuk mengatur nilai, gunakan sintaks kata kunci, dan satu atau lebih parameter dapat diatur sekaligus.
Nilai yang saat ini didukung adalah:
'mac': Alamat yang sedang digunakan saat ini, tergantung pada mode alamat yang aktif. Ini mengembalikan tuple berupa(addr_type, addr).Lihat
gap_scanuntuk detail tentang jenis alamat.Ini hanya dapat dikueri saat antarmuka sedang aktif.
'addr_mode': Mengatur mode alamat. Nilai-nilainya adalah:Nilai
Nama
Perilaku
0x00PUBLIC
Gunakan alamat publik kontroler.
0x01RANDOM
Gunakan alamat statis yang dihasilkan.
0x02RPA
Gunakan alamat privat yang dapat di-resolve.
0x03NRPA
Gunakan alamat privat yang tidak dapat di-resolve.
Secara default, antarmuka akan menggunakan alamat PUBLIC jika tersedia, jika tidak akan menggunakan alamat RANDOM.
'gap_name': Mendapatkan/mengatur nama perangkat GAP yang digunakan oleh layanan Generic Access (UUID0x1800), karakteristik Device Name (UUID0x2a00). Ini dapat diatur kapan saja dan diubah berkali-kali.'rxbuf': Mendapatkan/mengatur ukuran dalam byte dari buffer internal yang digunakan untuk menyimpan event yang masuk. Buffer ini bersifat global untuk seluruh driver BLE sehingga menangani data masuk untuk semua event, termasuk semua karakteristik. Meningkatkan ini memungkinkan penanganan data masuk yang bersifat burst dengan lebih baik (misalnya hasil scan) dan kemampuan untuk menerima nilai karakteristik yang lebih besar.'mtu': Mendapatkan/mengatur MTU yang akan digunakan selama pertukaran ATT MTU. MTU yang dihasilkan akan menjadi nilai minimum antara ini dan MTU perangkat remote. Pertukaran ATT MTU tidak akan terjadi secara otomatis (kecuali perangkat remote yang memulainya), dan harus dimulai secara manual dengangattc_exchange_mtu. Gunakan event_IRQ_MTU_EXCHANGEDuntuk mengetahui MTU untuk koneksi tertentu.'bond': Mengatur apakah bonding akan diaktifkan selama pairing. Ketika diaktifkan, permintaan pairing akan mengatur flag "bond" dan kunci akan disimpan oleh kedua perangkat.'mitm': Mengatur apakah perlindungan MITM diperlukan untuk pairing.'io': Mengatur kemampuan I/O perangkat ini.Opsi yang tersedia adalah:
Konstanta
Nilai
Kemampuan
_IO_CAPABILITY_DISPLAY_ONLY0
Hanya tampilan
_IO_CAPABILITY_DISPLAY_YESNO1
Tampilan dengan input ya/tidak
_IO_CAPABILITY_KEYBOARD_ONLY2
Hanya keyboard
_IO_CAPABILITY_NO_INPUT_OUTPUT3
Tanpa input atau output
_IO_CAPABILITY_KEYBOARD_DISPLAY4
Keyboard dan tampilan
'le_secure': Mengatur apakah pairing "LE Secure" diperlukan. Defaultnya adalah false (yaitu mengizinkan "Legacy Pairing").
Penanganan Event
- irq(handler: Callable[[int, Tuple], Any | None], /) None¶
Mendaftarkan callback untuk event dari stack BLE. handler mengambil dua argumen,
event(yang akan menjadi salah satu kode di bawah) dandata(yang merupakan tuple nilai spesifik event).Catatan: Sebagai optimisasi untuk mencegah alokasi yang tidak perlu, entri
addr,adv_data,char_data,notify_data, danuuiddalam tuple adalah instance memoryview hanya-baca yang menunjuk ke ringbuffer internalbluetooth, dan hanya valid selama pemanggilan fungsi handler IRQ. Jika program Anda perlu menyimpan salah satu nilai ini untuk diakses setelah handler IRQ kembali (misalnya dengan menyimpannya dalam instance kelas atau variabel global), maka perlu membuat salinan data, baik dengan menggunakanbytes()ataubluetooth.UUID(), seperti ini:connected_addr = bytes(addr) # equivalently: adv_data, char_data, or notify_data matched_uuid = bluetooth.UUID(uuid)
Misalnya, handler IRQ untuk hasil scan mungkin memeriksa
adv_datauntuk memutuskan apakah itu perangkat yang tepat, dan baru kemudian menyalin data alamat untuk digunakan di tempat lain dalam program. Dan untuk mencetak data dari dalam handler IRQ,print(bytes(addr))akan diperlukan.Handler biasanya men-dispatch pada kode event dan membongkar tuple payload spesifik event:
def bt_irq(event, data): if event == _IRQ_CENTRAL_CONNECT: conn_handle, addr_type, addr = data ... elif event == _IRQ_SCAN_RESULT: addr_type, addr, adv_type, rssi, adv_data = data ...
Setiap kode event, payload yang dikirimkannya, dan deskripsi singkat tercantum di bawah ini. Untuk event yang field
status-nya disebutkan,statusadalah0pada keberhasilan dan nilai non-nol spesifik implementasi pada kegagalan.Konstanta
Nilai
Event
Tuple payload
_IRQ_CENTRAL_CONNECT1
Sebuah central telah terhubung ke peripheral ini.
(conn_handle, addr_type, addr)_IRQ_CENTRAL_DISCONNECT2
Sebuah central telah terputus dari peripheral ini.
(conn_handle, addr_type, addr)_IRQ_GATTS_WRITE3
Klien yang terhubung telah menulis ke karakteristik atau deskriptor lokal. Gunakan
gatts_readuntuk mengambil nilai baru.(conn_handle, attr_handle)_IRQ_GATTS_READ_REQUEST4
Klien yang terhubung telah mengeluarkan permintaan baca. Kembalikan kode error non-nol dari tabel di bawah untuk menolak baca, atau
0/Noneuntuk menerimanya.(conn_handle, attr_handle)_IRQ_SCAN_RESULT5
Satu paket iklan diterima selama scan aktif.
(addr_type, addr, adv_type, rssi, adv_data)_IRQ_SCAN_DONE6
Scan saat ini telah berakhir, baik karena durasi yang dikonfigurasi telah berlalu atau karena
gap_scan(None)dipanggil.()_IRQ_PERIPHERAL_CONNECT7
Sebuah
gap_connectyang sebelumnya diterbitkan telah berhasil.(conn_handle, addr_type, addr)_IRQ_PERIPHERAL_DISCONNECT8
Sebuah peripheral yang terhubung telah terputus.
(conn_handle, addr_type, addr)_IRQ_GATTC_SERVICE_RESULT9
Satu layanan ditemukan oleh
gattc_discover_services.(conn_handle, start_handle, end_handle, uuid)_IRQ_GATTC_SERVICE_DONE10
Penemuan layanan telah selesai.
(conn_handle, status)_IRQ_GATTC_CHARACTERISTIC_RESULT11
Satu karakteristik ditemukan oleh
gattc_discover_characteristics.(conn_handle, end_handle, value_handle, properties, uuid)_IRQ_GATTC_CHARACTERISTIC_DONE12
Penemuan karakteristik telah selesai.
(conn_handle, status)_IRQ_GATTC_DESCRIPTOR_RESULT13
Satu deskriptor ditemukan oleh
gattc_discover_descriptors.(conn_handle, dsc_handle, uuid)_IRQ_GATTC_DESCRIPTOR_DONE14
Penemuan deskriptor telah selesai.
(conn_handle, status)_IRQ_GATTC_READ_RESULT15
Sebuah
gattc_readyang sebelumnya diterbitkan telah mengembalikan data.(conn_handle, value_handle, char_data)_IRQ_GATTC_READ_DONE16
Sebuah
gattc_readyang sebelumnya diterbitkan telah selesai.(conn_handle, value_handle, status)_IRQ_GATTC_WRITE_DONE17
Sebuah
gattc_writeyang sebelumnya diterbitkan telah diakui.(conn_handle, value_handle, status)_IRQ_GATTC_NOTIFY18
Server remote telah mengirim notifikasi (tanpa pengakuan).
(conn_handle, value_handle, notify_data)_IRQ_GATTC_INDICATE19
Server remote telah mengirim indikasi (dengan pengakuan).
(conn_handle, value_handle, notify_data)_IRQ_GATTS_INDICATE_DONE20
Sebuah indikasi yang sebelumnya dikirim telah diakui oleh klien (atau telah habis waktu).
(conn_handle, value_handle, status)_IRQ_MTU_EXCHANGED21
Pertukaran ATT MTU telah selesai (dimulai oleh salah satu pihak).
(conn_handle, mtu)_IRQ_L2CAP_ACCEPT22
Perangkat remote telah meminta koneksi L2CAP pada PSM yang sedang didengarkan perangkat ini. Kembalikan bilangan bulat non-nol untuk menolak, atau
0/Noneuntuk menerima.(conn_handle, cid, psm, our_mtu, peer_mtu)_IRQ_L2CAP_CONNECT23
Kanal L2CAP sekarang telah terbentuk, baik dengan menerima permintaan masuk atau dengan menyelesaikan
l2cap_connectkeluar.(conn_handle, cid, psm, our_mtu, peer_mtu)_IRQ_L2CAP_DISCONNECT24
Kanal L2CAP telah terputus.
statusadalah0untuk pemutusan yang bersih, atau non-nol jika upaya koneksi keluar gagal.(conn_handle, cid, psm, status)_IRQ_L2CAP_RECV25
Data telah tiba di kanal L2CAP. Panggil
l2cap_recvintountuk membacanya.(conn_handle, cid)_IRQ_L2CAP_SEND_READY26
Sebuah
l2cap_sendsebelumnya yang mengembalikanFalsetelah dikuras dan kanal siap kembali. Status non-nolstatusberarti buffer pengiriman meluap dan aplikasi harus mengirim ulang data.(conn_handle, cid, status)_IRQ_CONNECTION_UPDATE27
Perangkat remote telah memperbarui parameter koneksi (interval, latensi, supervision timeout).
(conn_handle, conn_interval, conn_latency, supervision_timeout, status)_IRQ_ENCRYPTION_UPDATE28
Status enkripsi koneksi telah berubah, biasanya setelah pairing atau bonding selesai.
(conn_handle, encrypted, authenticated, bonded, key_size)_IRQ_GET_SECRET29
Stack sedang meminta rahasia bonding yang tersimpan. Jika
keyadalahNone, kembalikan nilai tersimpan ke-indexdarisec_type; jika tidak kembalikan nilai yang terkait dengan(sec_type, key)yang diberikan. KembalikanNonejika tidak ada yang tersimpan.(sec_type, index, key)_IRQ_SET_SECRET30
Stack meminta aplikasi untuk menyimpan rahasia bonding. Kembalikan
Truesetelah tersimpan.(sec_type, key, value)_IRQ_PASSKEY_ACTION31
Tindakan passkey diperlukan sebagai bagian dari pairing. Tanggapi menggunakan
gap_passkey; lihat tabel passkey-action di bawah untuk tindakan yang mungkin.(conn_handle, action, passkey)Untuk event
_IRQ_GATTS_READ_REQUEST, kode kembalian yang tersedia adalah:Konstanta
Nilai
Makna
_GATTS_NO_ERROR0x00Terima baca.
_GATTS_ERROR_READ_NOT_PERMITTED0x02Baca tidak diizinkan.
_GATTS_ERROR_WRITE_NOT_PERMITTED0x03Tulis tidak diizinkan.
_GATTS_ERROR_INSUFFICIENT_AUTHENTICATION0x05Klien tidak terautentikasi.
_GATTS_ERROR_INSUFFICIENT_AUTHORIZATION0x08Klien tidak terautorisasi.
_GATTS_ERROR_INSUFFICIENT_ENCRYPTION0x0fTautan tidak terenkripsi.
Untuk event
_IRQ_PASSKEY_ACTION, tindakan yang tersedia adalah:Konstanta
Nilai
Makna
_PASSKEY_ACTION_NONE0
Tidak ada tindakan yang diperlukan.
_PASSKEY_ACTION_INPUT2
Minta pengguna untuk memasukkan passkey yang ditampilkan di perangkat remote.
_PASSKEY_ACTION_DISPLAY3
Tampilkan passkey 6 digit untuk dimasukkan oleh perangkat remote.
_PASSKEY_ACTION_NUMERIC_COMPARISON4
Konfirmasikan bahwa passkey cocok dengan yang ditampilkan di perangkat remote.
Untuk menghemat ruang dalam firmware, konstanta-konstanta ini tidak disertakan dalam modul
bluetooth. Tambahkan yang Anda butuhkan dari daftar di atas ke program Anda.
Peran Broadcaster (Pengiklan)
- gap_advertise(interval_us: int | None, adv_data: bytes | None = None, *, resp_data: bytes | None = None, connectable: bool = True) None¶
Memulai pengiklanan pada interval yang ditentukan (dalam mikrodetik). Interval ini akan dibulatkan ke bawah ke kelipatan 625us terdekat. Untuk menghentikan pengiklanan, atur interval_us ke
None.adv_data dan resp_data dapat berupa jenis apa pun yang mengimplementasikan protokol buffer (misalnya
bytes,bytearray,str). adv_data disertakan dalam semua siaran, dan resp_data dikirim sebagai balasan terhadap scan aktif.Catatan: jika adv_data (atau resp_data) adalah
None, maka data yang diteruskan ke panggilan sebelumnya kegap_advertiseakan digunakan kembali. Hal ini memungkinkan broadcaster untuk melanjutkan pengiklanan hanya dengangap_advertise(interval_us). Untuk menghapus payload pengiklanan, berikanbyteskosong, yaitub''.
Peran Observer (Scanner)
- gap_scan(duration_ms: int | None, interval_us: int = 1280000, window_us: int = 11250, active: bool = False, /) None¶
Jalankan operasi scan yang berlangsung selama durasi yang ditentukan (dalam milidetik).
Untuk scan tanpa batas, atur duration_ms ke
0.Untuk menghentikan scanning, atur duration_ms ke
None.Gunakan interval_us dan window_us untuk mengonfigurasi siklus kerja secara opsional. Scanner akan berjalan selama window_us mikrodetik setiap interval_us mikrodetik selama total duration_ms milidetik. Interval dan jendela default masing-masing adalah 1,28 detik dan 11,25 milidetik (scanning latar belakang).
Untuk setiap hasil scan, event
_IRQ_SCAN_RESULTakan dimunculkan, dengan data event(addr_type, addr, adv_type, rssi, adv_data).Nilai
addr_typemenunjukkan alamat publik atau acak:Nilai
Nama
Makna
0x00PUBLIC
Alamat perangkat publik.
0x01RANDOM
Alamat acak (baik statis, RPA, atau NRPA; jenisnya dikodekan dalam alamat itu sendiri).
Nilai
adv_typesesuai dengan Spesifikasi Bluetooth:Nilai
Nama
Makna
0x00ADV_IND
Pengiklanan undirected yang dapat dihubungkan dan dapat di-scan.
0x01ADV_DIRECT_IND
Pengiklanan directed yang dapat dihubungkan.
0x02ADV_SCAN_IND
Pengiklanan undirected yang dapat di-scan.
0x03ADV_NONCONN_IND
Pengiklanan undirected yang tidak dapat dihubungkan.
0x04SCAN_RSP
Respons scan.
activedapat diatur keTruejika Anda ingin menerima respons scan dalam hasil.Ketika scanning dihentikan (baik karena durasi selesai atau ketika dihentikan secara eksplisit), event
_IRQ_SCAN_DONEakan dimunculkan.
Peran Central
Perangkat central dapat terhubung ke peripheral yang telah ditemukannya menggunakan peran observer (lihat
gap_scan) atau dengan alamat yang diketahui.- gap_connect(addr_type: int | None, addr: bytes | None = None, scan_duration_ms: int = 2000, min_conn_interval_us: int | None = None, max_conn_interval_us: int | None = None, /) None¶
Terhubung ke peripheral.
Lihat
gap_scanuntuk detail tentang jenis alamat.Untuk membatalkan upaya koneksi yang sedang berjalan lebih awal, panggil
gap_connect(None).Pada keberhasilan, event
_IRQ_PERIPHERAL_CONNECTakan dimunculkan. Jika membatalkan upaya koneksi, event_IRQ_PERIPHERAL_DISCONNECTakan dimunculkan.Perangkat akan menunggu hingga scan_duration_ms untuk menerima payload pengiklanan dari perangkat.
Interval koneksi dapat dikonfigurasi dalam mikrodetik menggunakan salah satu atau keduanya dari min_conn_interval_us dan max_conn_interval_us. Jika tidak, interval default akan dipilih, biasanya antara 30000 dan 50000 mikrodetik. Interval yang lebih pendek akan meningkatkan throughput, dengan mengorbankan penggunaan daya.
Peran Peripheral
Perangkat peripheral diharapkan mengirim iklan yang dapat dihubungkan (lihat
gap_advertise). Biasanya akan bertindak sebagai server GATT, setelah terlebih dahulu mendaftarkan layanan dan karakteristik menggunakangatts_register_services.Ketika central terhubung, event
_IRQ_CENTRAL_CONNECTakan dimunculkan.Peran Central & Peripheral
- gap_disconnect(conn_handle: int, /) bool¶
Putuskan handle koneksi yang ditentukan. Ini bisa berupa central yang telah terhubung ke perangkat ini (jika bertindak sebagai peripheral) atau peripheral yang sebelumnya terhubung ke perangkat ini (jika bertindak sebagai central).
Pada keberhasilan, event
_IRQ_PERIPHERAL_DISCONNECTatau_IRQ_CENTRAL_DISCONNECTakan dimunculkan.Mengembalikan
Falsejika handle koneksi tidak terhubung, danTruejika sebaliknya.
GATT Server
Server GATT memiliki sekumpulan layanan yang terdaftar. Setiap layanan dapat berisi karakteristik, yang masing-masing memiliki nilai. Karakteristik juga dapat berisi deskriptor, yang sendirinya memiliki nilai.
Nilai-nilai ini disimpan secara lokal, dan diakses melalui "value handle" yang dihasilkan selama pendaftaran layanan. Mereka juga dapat dibaca dari atau ditulis oleh perangkat klien remote. Selain itu, server dapat "memberitahu" karakteristik ke klien yang terhubung melalui handle koneksi.
Perangkat dalam peran central atau peripheral dapat berfungsi sebagai server GATT, namun dalam kebanyakan kasus lebih umum bagi perangkat peripheral untuk bertindak sebagai server.
Karakteristik dan deskriptor memiliki ukuran maksimum default 20 byte (ATT MTU default 23 byte dikurangi header ATT 3 byte; MTU yang dinegosiasikan lebih besar tidak dengan sendirinya meningkatkan batas ini). Apa pun yang ditulis ke mereka oleh klien akan dipotong hingga panjang ini. Namun, penulisan lokal apa pun akan meningkatkan ukuran maksimum, jadi jika Anda ingin mengizinkan penulisan yang lebih besar dari klien ke karakteristik tertentu, gunakan
gatts_writesetelah pendaftaran. misalnyagatts_write(char_handle, bytes(100)).- gatts_register_services(services_definition: Sequence[Sequence], /) Sequence[Sequence[int]]¶
Mengonfigurasi server dengan layanan yang ditentukan, menggantikan layanan yang ada.
services_definition adalah daftar layanan, di mana setiap layanan adalah tuple dua elemen yang berisi UUID dan daftar karakteristik.
Setiap karakteristik adalah tuple dua atau tiga elemen yang berisi UUID, nilai flags, dan secara opsional daftar deskriptor.
Setiap deskriptor adalah tuple dua elemen yang berisi UUID dan nilai flags.
flags adalah kombinasi bitwise-OR dari flag yang didefinisikan di bawah ini. Ini mengatur perilaku karakteristik (atau deskriptor) serta persyaratan keamanan dan privasi.
Nilai kembalian adalah daftar (satu elemen per layanan) dari tuple (setiap elemen adalah value handle). Handle karakteristik dan deskriptor diratakan ke dalam tuple yang sama, dalam urutan yang didefinisikan.
Contoh berikut mendaftarkan dua layanan (Heart Rate, dan Nordic UART):
bt = bluetooth.BLE() bt.active(True) # Heart Rate service: one Heart Rate Measurement characteristic. HR_SERVICE = ( bluetooth.UUID(0x180D), ( (bluetooth.UUID(0x2A37), bluetooth.FLAG_READ | bluetooth.FLAG_NOTIFY), ), ) # Nordic UART service: a TX characteristic the client subscribes # to for notifications, and an RX characteristic it writes to. UART_SERVICE = ( bluetooth.UUID('6E400001-B5A3-F393-E0A9-E50E24DCCA9E'), ( (bluetooth.UUID('6E400003-B5A3-F393-E0A9-E50E24DCCA9E'), bluetooth.FLAG_READ | bluetooth.FLAG_NOTIFY), (bluetooth.UUID('6E400002-B5A3-F393-E0A9-E50E24DCCA9E'), bluetooth.FLAG_WRITE), ), ) ((hr,), (tx, rx)) = bt.gatts_register_services( (HR_SERVICE, UART_SERVICE), )
Tiga value handle (
hr,tx,rx) dapat digunakan dengangatts_read,gatts_write,gatts_notify, dangatts_indicate.Catatan: Pengiklanan harus dihentikan sebelum mendaftarkan layanan.
Flag yang tersedia untuk karakteristik dan deskriptor adalah:
Konstanta
Nilai
Makna
_FLAG_BROADCAST0x0001Karakteristik dapat di-broadcast.
_FLAG_READ0x0002Klien dapat membaca nilai.
_FLAG_WRITE_NO_RESPONSE0x0004Klien dapat menulis tanpa mengharapkan respons.
_FLAG_WRITE0x0008Klien dapat menulis dengan respons yang diakui.
_FLAG_NOTIFY0x0010Server dapat mengirim notifikasi (tanpa pengakuan).
_FLAG_INDICATE0x0020Server dapat mengirim indikasi (dengan pengakuan).
_FLAG_AUTHENTICATED_SIGNED_WRITE0x0040Klien dapat mengeluarkan penulisan bertanda tangan.
_FLAG_AUX_WRITE0x0100Properti tambahan: penulisan antrian/andal diizinkan.
_FLAG_READ_ENCRYPTED0x0200Baca memerlukan tautan terenkripsi.
_FLAG_READ_AUTHENTICATED0x0400Baca memerlukan tautan yang terautentikasi (dilindungi MITM).
_FLAG_READ_AUTHORIZED0x0800Baca memerlukan otorisasi tingkat aplikasi.
_FLAG_WRITE_ENCRYPTED0x1000Tulis memerlukan tautan terenkripsi.
_FLAG_WRITE_AUTHENTICATED0x2000Tulis memerlukan tautan yang terautentikasi (dilindungi MITM).
_FLAG_WRITE_AUTHORIZED0x4000Tulis memerlukan otorisasi tingkat aplikasi.
Seperti konstanta event di atas, flag ini tidak disediakan oleh modul
bluetooth; salin yang Anda butuhkan ke dalam program Anda.
- gatts_read(value_handle: int, /) bytes¶
Membaca nilai lokal untuk handle ini (yang telah ditulis oleh
gatts_writeatau oleh klien remote).
- gatts_write(value_handle: int, data: bytes, send_update: bool = False, /) None¶
Menulis nilai lokal untuk handle ini, yang dapat dibaca oleh klien.
Jika send_update adalah
True, maka klien yang berlangganan akan diberitahu (atau diindikasikan, tergantung pada apa yang mereka langgani dan operasi mana yang didukung karakteristik) tentang penulisan ini.
- gatts_notify(conn_handle: int, value_handle: int, data: bytes | None = None, /) None¶
Mengirim permintaan notifikasi ke klien yang terhubung.
Jika data adalah
None(default), maka nilai lokal saat ini (sebagaimana diatur dengangatts_write) akan dikirim.Jika tidak, jika data bukan
None, maka nilai tersebut dikirim ke klien sebagai bagian dari notifikasi. Nilai lokal tidak akan dimodifikasi.Catatan: Notifikasi akan dikirim terlepas dari status langganan klien terhadap karakteristik ini.
- gatts_indicate(conn_handle: int, value_handle: int, data: bytes | None = None, /) None¶
Mengirim permintaan indikasi ke klien yang terhubung.
Jika data adalah
None(default), maka nilai lokal saat ini (sebagaimana diatur dengangatts_write) akan dikirim.Jika tidak, jika data bukan
None, maka nilai tersebut dikirim ke klien sebagai bagian dari indikasi. Nilai lokal tidak akan dimodifikasi.Saat pengakuan (atau kegagalan, misalnya timeout), event
_IRQ_GATTS_INDICATE_DONEakan dimunculkan.Catatan: Indikasi akan dikirim terlepas dari status langganan klien terhadap karakteristik ini.
- gatts_set_buffer(value_handle: int, len: int, append: bool = False, /) None¶
Mengatur ukuran buffer internal untuk nilai dalam byte. Ini akan membatasi kemungkinan penulisan terbesar yang dapat diterima. Defaultnya adalah 20 byte (ATT MTU default 23 dikurangi header ATT 3 byte).
Mengatur append ke
Trueakan membuat semua penulisan remote ditambahkan ke, bukan menggantikan, nilai saat ini. Paling banyak len byte dapat di-buffer dengan cara ini. Ketika Anda menggunakangatts_read, nilai akan dihapus setelah dibaca. Fitur ini berguna saat mengimplementasikan sesuatu seperti Nordic UART Service.
GATT Client
Klien GATT dapat menemukan dan membaca/menulis karakteristik di server GATT remote.
Lebih umum bagi perangkat peran central untuk bertindak sebagai klien GATT, namun peripheral juga dapat bertindak sebagai klien untuk menemukan informasi tentang central yang telah terhubung ke sana (misalnya untuk membaca nama perangkat dari layanan informasi perangkat).
- gattc_discover_services(conn_handle: int, uuid: UUID | None = None, /) None¶
Kueri server yang terhubung untuk layanannya.
Secara opsional tentukan uuid layanan untuk hanya mengkueri layanan tersebut.
Untuk setiap layanan yang ditemukan, event
_IRQ_GATTC_SERVICE_RESULTakan dimunculkan, diikuti oleh_IRQ_GATTC_SERVICE_DONEsaat selesai.
- gattc_discover_characteristics(conn_handle: int, start_handle: int, end_handle: int, uuid: UUID | None = None, /) None¶
Kueri server yang terhubung untuk karakteristik dalam rentang yang ditentukan.
Secara opsional tentukan uuid karakteristik untuk hanya mengkueri karakteristik tersebut.
Meneruskan
start_handle=1danend_handle=0xffffmencakup rentang handle atribut GATT penuh, sehingga kombinasi ini secara efektif mencari setiap layanan di perangkat remote.Untuk setiap karakteristik yang ditemukan, event
_IRQ_GATTC_CHARACTERISTIC_RESULTakan dimunculkan, diikuti oleh_IRQ_GATTC_CHARACTERISTIC_DONEsaat selesai.
- gattc_discover_descriptors(conn_handle: int, start_handle: int, end_handle: int, /) None¶
Kueri server yang terhubung untuk deskriptor dalam rentang yang ditentukan.
Untuk setiap deskriptor yang ditemukan, event
_IRQ_GATTC_DESCRIPTOR_RESULTakan dimunculkan, diikuti oleh_IRQ_GATTC_DESCRIPTOR_DONEsaat selesai.
- gattc_read(conn_handle: int, value_handle: int, /) None¶
Keluarkan baca remote ke server yang terhubung untuk handle karakteristik atau deskriptor yang ditentukan.
Ketika nilai tersedia, event
_IRQ_GATTC_READ_RESULTakan dimunculkan, diikuti oleh_IRQ_GATTC_READ_DONEsaat selesai.
- gattc_write(conn_handle: int, value_handle: int, data: bytes, mode: int = 0, /) None¶
Keluarkan penulisan remote ke server yang terhubung untuk handle karakteristik atau deskriptor yang ditentukan.
Argumen mode menentukan perilaku penulisan, dengan nilai yang saat ini didukung adalah:
mode=0(default) adalah write-without-response: penulisan akan dikirim ke server remote tetapi tidak ada konfirmasi yang akan dikembalikan, dan tidak ada event yang akan dimunculkan.mode=1adalah write-with-response: server remote diminta untuk mengirim respons/pengakuan bahwa ia menerima data.
Jika respons diterima dari server remote, event
_IRQ_GATTC_WRITE_DONEakan dimunculkan.
- gattc_exchange_mtu(conn_handle: int, /) None¶
Inisiasi pertukaran MTU dengan server yang terhubung, menggunakan MTU yang disukai yang diatur menggunakan
BLE.config(mtu=value).Event
_IRQ_MTU_EXCHANGEDakan dimunculkan ketika pertukaran MTU selesai.Pertukaran MTU biasanya dimulai oleh central; NimBLE mendukung kedua peran.
Kanal Berorientasi Koneksi L2CAP
Fitur ini memungkinkan pertukaran data seperti socket antara dua perangkat BLE. Setelah perangkat terhubung melalui GAP, salah satu perangkat dapat mendengarkan perangkat lain untuk terhubung pada PSM (Protocol/Service Multiplexer) numerik.
Hanya satu kanal L2CAP yang dapat aktif pada waktu tertentu (yaitu Anda tidak dapat terhubung saat mendengarkan).
Kanal L2CAP aktif diidentifikasi oleh handle koneksi tempat mereka dibentuk dan CID (channel ID).
Kanal berorientasi koneksi memiliki kontrol aliran berbasis kredit bawaan. Tidak seperti ATT, di mana perangkat menegosiasikan MTU bersama, perangkat yang mendengarkan dan terhubung masing-masing mengatur MTU independen yang membatasi jumlah maksimum data yang belum diproses yang dapat dikirim oleh perangkat remote sebelum sepenuhnya dikonsumsi dalam
l2cap_recvinto.- l2cap_listen(psm: int, mtu: int, /) None¶
Mulai mendengarkan permintaan kanal L2CAP yang masuk pada psm yang ditentukan dengan MTU lokal diatur ke mtu.
Ketika perangkat remote memulai koneksi, event
_IRQ_L2CAP_ACCEPTakan dimunculkan, yang memberi server yang mendengarkan kesempatan untuk menolak koneksi yang masuk (dengan mengembalikan bilangan bulat non-nol).Setelah koneksi diterima, event
_IRQ_L2CAP_CONNECTakan dimunculkan, memungkinkan server untuk mendapatkan ID kanal (CID) serta MTU lokal dan remote.Catatan: Saat ini tidak memungkinkan untuk menghentikan pendengar.
- l2cap_connect(conn_handle: int, psm: int, mtu: int, /) None¶
Terhubung ke peer yang mendengarkan pada psm yang ditentukan dengan MTU lokal diatur ke mtu.
Saat koneksi berhasil, event
_IRQ_L2CAP_CONNECTakan dimunculkan, memungkinkan klien mendapatkan CID serta MTU lokal dan remote (peer).Koneksi yang tidak berhasil akan memunculkan event
_IRQ_L2CAP_DISCONNECTdengan status non-nol.
- l2cap_disconnect(conn_handle: int, cid: int, /) None¶
Putuskan kanal L2CAP aktif dengan conn_handle dan cid yang ditentukan.
- l2cap_send(conn_handle: int, cid: int, buf: bytes, /) bool¶
Kirim buf yang ditentukan (yang harus mendukung protokol buffer) pada kanal L2CAP yang diidentifikasi oleh conn_handle dan cid.
Buffer harus memenuhi kedua batas: tidak boleh melebihi MTU remote (peer), dan tidak boleh melebihi dua kali MTU lokal.
Ini akan mengembalikan
Falsejika kanal sekarang "terhenti", yang berartil2cap_sendtidak boleh dipanggil lagi sampai event_IRQ_L2CAP_SEND_READYditerima (yang akan terjadi ketika perangkat remote memberikan lebih banyak kredit, biasanya setelah menerima dan memproses data).
- l2cap_recvinto(conn_handle: int, cid: int, buf: Any | None, /) int¶
Terima data dari conn_handle dan cid yang ditentukan ke dalam buf yang disediakan (yang harus mendukung protokol buffer, misalnya bytearray atau memoryview).
Mengembalikan jumlah byte yang dibaca dari kanal.
Jika buf adalah
None, maka mengembalikan jumlah byte yang tersedia.Catatan: Setelah menerima event
_IRQ_L2CAP_RECV, aplikasi harus terus memanggill2cap_recvintosampai tidak ada lagi byte yang tersedia dalam buffer penerimaan (biasanya hingga ukuran MTU remote (peer)).Sampai buffer penerimaan kosong, perangkat remote tidak akan diberikan lebih banyak kredit kanal dan tidak akan dapat mengirim data lebih lanjut.
Pairing dan Bonding
Pairing memungkinkan koneksi dienkripsi dan diautentikasi melalui pertukaran rahasia (dengan perlindungan MITM opsional melalui autentikasi passkey).
Bonding adalah proses menyimpan rahasia-rahasia tersebut ke penyimpanan non-volatil. Ketika melakukan bonding, perangkat mampu me-resolve alamat privat yang dapat di-resolve (RPA) dari perangkat lain berdasarkan kunci resolving identitas (IRK) yang tersimpan. Untuk mendukung bonding, aplikasi harus mengimplementasikan event
_IRQ_GET_SECRETdan_IRQ_SET_SECRET.- gap_pair(conn_handle: int, /) None¶
Inisiasi pairing dengan perangkat remote.
Sebelum memanggil ini, pastikan bahwa opsi konfigurasi
io,mitm,le_secure, danbondtelah diatur (melaluiconfig).Saat pairing berhasil, event
_IRQ_ENCRYPTION_UPDATEakan dimunculkan.
- gap_passkey(conn_handle: int, action: int, passkey: int, /) None¶
Tanggapi event
_IRQ_PASSKEY_ACTIONuntuk conn_handle dan action yang ditentukan. Makna dari passkey tergantung pada action (yang pada gilirannya tergantung pada kemampuan I/O yang dikonfigurasi):Tindakan
Respons passkey yang diperlukan
_PASSKEY_ACTION_INPUTPasskey yang dibaca pengguna dari perangkat remote.
_PASSKEY_ACTION_DISPLAYPasskey 6 digit acak yang dihasilkan secara lokal ditampilkan kepada pengguna.
_PASSKEY_ACTION_NUMERIC_COMPARISON1untuk menerima passkey yang ditampilkan dalam event_IRQ_PASSKEY_ACTION, atau0untuk membatalkan pairing.
class UUID¶
- class bluetooth.UUID(value: int | bytes | str, /)¶
Membuat instance UUID dengan
valueyang ditentukan. Bluetooth menggunakan tiga lebar UUID;UUIDmenerima ketiganya:Lebar UUID
Jenis
valueyang diterimaContoh
16-bit
intatau buffer 2-byte (little-endian)UUID(0x2908)atauUUID(b'\x08\x29')32-bit
Buffer 4-byte (little-endian)
UUID(b'\x08\x29\x00\x00')128-bit
Buffer 16-byte atau string dengan tanda hubung
UUID('6E400001-B5A3-F393-E0A9-E50E24DCCA9E')UUID 16- dan 32-bit biasanya merupakan identifkator yang dialokasikan SIG (lihat nomor yang ditetapkan Bluetooth); UUID 128-bit biasanya didefinisikan oleh vendor.