11.5. Bağlantılar¶
Bir merkez (central) cihaz, reklam akışından bir çevre birimi (peripheral) seçip ona bir bağlantı isteği (connect request) gönderdiğinde, her iki taraf da reklam / tarama modundan çıkıp bir bağlantıya (connection) geçer. Radyo artık etkinliğini bağlantı katmanının veri kanalları üzerinde zamanlar ve bunlar arasında bağlantı zamanında üzerinde anlaşılan diziye göre sözde rastgele biçimde atlama yapar. Bağlantı katmanının üzerindeki her şey – GATT, güvenlik, L2CAP – burada kurulan bağlantı üzerinde çalışır.
11.5.1. Bağlantı olayı¶
Bir BLE bağlantısındaki iki cihaz sürekli akış yapmaz. Bir bağlantı aralığı (connection interval) üzerinde anlaşırlar ve her aralıkta her iki taraf da radyoyu uyandırır, sıraya alınmış paketleri değiş tokuş eder, aldıklarını onaylar ve tekrar uyku moduna geçer. Bu değiş tokuşların her birine bağlantı olayı (connection event) denir.
Her taraftaki radyo yalnızca kısa bağlantı olayları sırasında uyanıktır, geri kalan her şey uyku halindedir. Çevre birimi, çevre birimi gecikmesi (peripheral latency) altında olayları atlayabilir.¶
Bunu yöneten sayılar bağlanma anında müzakere edilir ve bağlantı katmanı bunları uygular. Bunlar uygulamaya hem istek tarafı ayar düğmeleri olarak hem de geri raporlanan sonuç değerleri olarak görünür.
Bağlantı aralığı. 1,25 ms’lik adımlarla 7,5 ms ile 4 s arası. Merkez, istek mantıksız olmadığı sürece çevre biriminin talep ettiği değeri seçer. Daha kısa aralıklar veriyi daha düşük gecikmeyle teslim eder ancak bunun bedeli daha fazla radyo etkinliğidir; daha uzun aralıklar güç tasarrufu sağlar ama her gidiş-dönüşü yavaşlatır.
Çevre birimi gecikmesi. Negatif olmayan bir N tam sayısı. Çevre biriminin gönderecek bir şeyi olmadığında, boş bir değiş tokuş için radyoyu uyandırmak yerine tekrar uykuya geçerek en fazla N bağlantı olayını atlamasına izin verilir. Saniyede bir rapor vermek için uyanan ancak nadir bir anlık mesaj için düşük yanıt veren bir bağlantı aralığı isteyen sensörler için kullanışlıdır.
Denetim zaman aşımı (supervision timeout). 100 ms ile 32 s arası. Taraflardan biri bu süre boyunca diğerinden hiçbir şey duymazsa, bağlantı kaybedilmiş ilan edilir ve her iki taraf da reklam / tarama moduna geri döner. Zaman aşımı
connection_interval * (1 + peripheral_latency)değerinden daha uzun olmalıdır – bağlantı katmanı bunu ihlal eden değerleri reddeder.
aioble.Device.connect() yöntemi min_conn_interval_us ve max_conn_interval_us parametrelerini alır; böylece merkez belirli bir aralık talep edebilir; radyonun üzerinde karar kıldığı gerçek değer ise bağlantı kurulduktan sonra bağlantı katmanı yapılandırması aracılığıyla geri okunabilir.
11.5.2. Bir bağlantı içinde “merkez (central)” ve “çevre birimi (peripheral)” ne anlama gelir¶
Reklam zamanında atanan roller, bağlantı kurulduktan sonra da geçerliliğini korur:
Merkez (central) zamanlamayı yönetir – atlama dizisinin ve bağlantı olaylarının ana (master) tarafına sahiptir.
Çevre birimi (peripheral) tepkiseldir. Bağlantı parametrelerinde bir değişiklik talep edebilir (örneğin güç tasarrufu için daha yavaş bir aralık) ancak kabul edilip edilmeyeceğine merkez karar verir.
Roller, GATT veritabanını kimin barındırdığından bağımsızdır; bu ayrı bir eksendir. Yaygın olarak çevre birimi aynı zamanda GATT sunucusudur (server) ve merkez GATT istemcisidir (client), ancak BLE her iki tarafın da GATT hizmetlerini barındırmasına izin verir. Kameralar neredeyse her zaman bu geleneği izler: “kamera veri yayınlar” uygulamaları için çevre birimi + sunucu, “kamera bir sensörden okur” uygulamaları için merkez + istemci.
11.5.3. Maksimum aktarım birimi (MTU)¶
Bağlantı katmanı varsayılan olarak kısa paketler taşır – 27 baytlık yük (payload), bunun yalnızca 23 baytı GATT’a açıktır. Bu, küçük bir okuma veya kısa bir komut için yeterlidir ama çok baytlı herhangi bir şeyin yanında oldukça küçüktür. Her iki taraf da bunu, radyo aygıt yazılımının (firmware) desteklediği sınıra kadar (modern denetleyicilerde tipik olarak birkaç yüz bayt) yukarı doğru müzakere edebilir.
aioble API’si müzakereyi aioble.DeviceConnection.exchange_mtu() aracılığıyla yönetir ve sonuç mtu özniteliğinde kullanılabilir hale gelir. Daha büyük MTU değerleri, ~20 bayttan büyük herhangi bir değer için daha az gidiş-dönüş anlamına gelir; bunun bedeli ise küçük miktarda arabellek belleğidir.
11.5.4. Yaşam süresi¶
Bir bağlantı şunlardan biri olana kadar sürer:
taraflardan biri
disconnect()çağrısı yapana kadar,denetim zaman aşımı tetiklenene (menzil dışı, radyo kapalı, eş çökmesi) kadar veya
açık bir bağlantı katmanı hatası (şifreleme uyumsuzluğu, eşleştirme reddi) olana kadar.
Bağlantı koptuğunda, üzerinde sıraya alınmış veya devam etmekte olan her GATT işlemi aioble.DeviceDisconnectedError istisnasını yükseltir ve uygulamanın içinde bulunduğu tüm async with connection blokları temiz biçimde çıkış yapar. Bir çevre birimi tipik olarak aioble.advertise() çağrısına geri dönerek ve bir sonraki merkezi bekleyerek yanıt verir; bir merkez ise ya tekrar tarama yaparak ya da bağlantı kesilmesini uygulamaya bildirerek yanıt verir.
Yaşam süresi, aioble modülünün kullanışlı olmasının nedenlerinden biridir. Eşzamanlı (synchronous) bir BLE API’sinin bağlantı kesilme geri çağırmalarını (callback) ve olay maskelerini açığa çıkarması gerekirdi; asyncio sürümü ise bağlantı kesilmelerini, işlemi bekleyen eşyordamın (coroutine) içindeki istisnalara dönüştürür ki async with temizliği tam da bunun için oluşturulmuştur.