11.5. Koneksi

Setelah sebuah central memilih peripheral dari aliran iklan dan mengirimkan permintaan koneksi, kedua sisi keluar dari mode iklan / pemindaian dan masuk ke dalam sebuah koneksi. Radio kini menjadwalkan aktivitasnya pada saluran data di lapisan tautan, melompat secara pseudo-acak di antara saluran-saluran tersebut sesuai urutan yang disepakati pada saat koneksi dibuat. Semua lapisan di atas lapisan tautan -- GATT, keamanan, L2CAP -- berjalan di atas koneksi yang dibuat di sini.

11.5.1. Peristiwa koneksi

Dua perangkat dalam koneksi BLE tidak melakukan streaming secara terus-menerus. Keduanya menyepakati sebuah interval koneksi, dan pada setiap interval kedua sisi membangunkan radio, bertukar paket yang antri, mengakui apa yang diterima, lalu kembali tidur. Setiap pertukaran tersebut disebut peristiwa koneksi.

A timeline with the central on the top track and the peripheral on the bottom track. At each connection interval boundary both tracks show a short pulse labelled "TX/RX". The gap between pulses is labelled "connection interval"; the duration of each pulse is "connection event". The peripheral has a few skipped events labelled "peripheral latency: peripheral may skip if idle".

Radio di setiap sisi hanya aktif selama peristiwa koneksi yang singkat, sementara selebihnya dalam keadaan tidur. Peripheral dapat melewatkan peristiwa di bawah peripheral latency.

Angka-angka yang mengatur ini dinegosiasikan pada saat koneksi dan lapisan tautan memberlakukannya. Angka-angka tersebut terlihat oleh aplikasi baik sebagai tombol pengatur di sisi permintaan maupun sebagai nilai hasil yang dilaporkan kembali.

  • Interval koneksi. 7,5 ms hingga 4 detik, dalam langkah 1,25 ms. Central memilih nilai yang diminta peripheral kecuali permintaan tersebut tidak wajar. Interval yang lebih pendek mengirimkan data dengan latensi lebih rendah dengan biaya aktivitas radio yang lebih tinggi; interval yang lebih panjang menghemat daya tetapi membuat setiap perjalanan pulang-pergi lebih lambat.

  • Peripheral latency. Sebuah bilangan bulat non-negatif N. Peripheral diperbolehkan untuk melewatkan hingga N peristiwa koneksi ketika tidak ada yang dikirim, kembali tidur alih-alih membangunkan radio untuk pertukaran kosong. Berguna untuk sensor yang bangun untuk melaporkan sekali sedetik tetapi menginginkan interval koneksi yang responsif untuk pesan mendesak yang jarang terjadi.

  • Supervision timeout. 100 ms hingga 32 detik. Jika salah satu sisi tidak mendengar apa pun dari sisi lain selama durasi ini, tautan dinyatakan hilang dan kedua sisi kembali ke mode iklan / pemindaian. Timeout harus lebih panjang dari connection_interval * (1 + peripheral_latency) -- lapisan tautan menolak nilai yang melanggar ketentuan tersebut.

aioble.Device.connect() menerima min_conn_interval_us dan max_conn_interval_us agar central dapat meminta rentang tertentu; nilai aktual yang ditetapkan radio dapat dibaca kembali melalui konfigurasi lapisan tautan setelah koneksi aktif.

11.5.2. Arti "central" dan "peripheral" di dalam koneksi

Peran yang ditetapkan pada saat iklan tetap berlaku setelah koneksi terbentuk:

  • Central mengendalikan waktu -- ia memiliki sisi master dari urutan hopping dan peristiwa koneksi.

  • Peripheral bersifat reaktif. Ia dapat meminta perubahan pada parameter koneksi (misalnya interval yang lebih lambat untuk menghemat daya) tetapi central yang memutuskan apakah menerima atau menolak.

Peran-peran ini tidak bergantung pada siapa yang menjadi tuan rumah database GATT, yang merupakan sumbu terpisah. Secara konvensi, peripheral juga merupakan server GATT dan central merupakan client GATT, tetapi BLE memungkinkan salah satu sisi untuk menjadi tuan rumah layanan GATT. Kamera hampir selalu mengikuti konvensi ini: peripheral + server untuk aplikasi "kamera mempublikasikan data", central + client untuk aplikasi "kamera membaca dari sensor".

11.5.3. Unit transmisi maksimum (MTU)

Lapisan tautan membawa paket yang secara default pendek -- 27 byte payload, di mana hanya 23 yang tersedia untuk GATT. Itu cukup untuk pembacaan kecil atau perintah singkat, tetapi sangat kecil dibandingkan data multi-byte. Kedua sisi dapat menegosiasikan ini ke atas, hingga batas yang didukung firmware radio (biasanya beberapa ratus byte pada controller modern).

API aioble mengendalikan negosiasi melalui aioble.DeviceConnection.exchange_mtu() dan hasilnya tersedia pada atribut mtu. MTU yang lebih besar berarti lebih sedikit perjalanan pulang-pergi untuk nilai yang lebih besar dari ~20 byte, dengan biaya kecil pada memori buffer.

11.5.4. Masa hidup

Sebuah koneksi berlangsung hingga salah satu dari:

  • salah satu sisi memanggil disconnect(),

  • supervision timeout menyala (di luar jangkauan, radio mati, peer crash), atau

  • kegagalan lapisan tautan yang eksplisit (ketidakcocokan enkripsi, penolakan pairing).

Ketika koneksi terputus, setiap operasi GATT yang antri atau sedang berlangsung akan memunculkan aioble.DeviceDisconnectedError, dan semua blok async with connection yang sedang dijalankan aplikasi akan keluar dengan bersih. Peripheral biasanya merespons dengan kembali ke aioble.advertise() dan menunggu central berikutnya; central merespons dengan memindai lagi atau menampilkan pemutusan koneksi ke aplikasi.

Masa hidup adalah salah satu alasan mengapa aioble berguna. API BLE sinkron harus mengekspos callback pemutusan dan mask peristiwa; versi asyncio mengubah pemutusan koneksi menjadi pengecualian di dalam coroutine yang sedang menunggu operasi, yang merupakan tujuan utama pembersihan async with.