11.14. Özet¶
Bluetooth Low Energy’yi telsizden, onu sürmek için kullanılan Python API’sine kadar baştan sona gezdiniz:
Motivasyon – BLE, kameranın aralarında herhangi bir altyapı olmadan yakındaki bir şeyle konuşmak istediğinde verilen cevaptır. Aynı odadaki bir telefon, bir bilekteki giyilebilir cihaz, bir duvardaki beacon. Kısa menzil, katılınacak bir ağ yok, neredeyse hiç güç yok.
Telsiz – 2.4 GHz, 40 kanal: üçü reklam için, 37’si bağlantı verisi için, gürültülü kanalların uyarlanabilir şekilde önlenmesiyle sözde rastgele bir dizide atlanan. Kısa paketler, çoğunlukla uyuyan telsizler.
Bağlantı katmanı – paket çerçeveleme, adresleme, bağlantı zamanlaması, yeniden iletim ve bağlantı katmanı şifrelemesi. Bunların hiçbiri Python’dan yapılandırılmaz; hepsi bağlantı parametrelerinde ve MTU’da kendini gösterir.
Generic Access Profile (GAP) – keşif ve bağlantı yönetimi. Dört rol: peripheral ve broadcaster (reklam yapar), central ve observer (tarar). Reklam yükleri yerel adı, servis UUID’lerini, görünümü ve üreticiye özgü veriyi taşır – 31 bayt artı isteğe bağlı 31 baytlık bir tarama yanıtı. Bağlantı aralığı, peripheral gecikmesi ve denetim zaman aşımı, açık bir bağlantının nasıl hissettirdiğini belirler.
Generic Attribute Profile (GATT) – her biri karakteristikler tutan servislerden oluşan bir ağaç; her karakteristik isteğe bağlı olarak tanımlayıcılar tutar ve hepsi UUID’lerle tanımlanır (Bluetooth-SIG standartları için 16 bit, özel olanlar için 128 bit). Beş işlem: read ve write (çekme, istemci başlatır), notify ve indicate (itme, sunucu başlatır, Client Characteristic Configuration Descriptor aracılığıyla abone olunur). Yük boyutu, müzakere edilen MTU ile sınırlıdır.
Python API –
aioble, her BLE örüntüsünü bir asyncio coroutine’ine dönüştürür. Bir peripheral, bağlantılar üzerinde döngü yapanaioble.advertise()‘dir;Service/Characteristicnesneleri bir kez oluşturulur veaioble.register_services()ile teslim edilir. Bir central ise bir eş bulmak içinaioble.scan(), bağlantıyı açmak içinconnect(), uzak GATT ağacında gezinmek içinservice()vecharacteristic(), ardından gerçek veri içinread()/write()/subscribe()/notified()‘dir. Bağlantı kesintileri, bekleyen coroutine’in içindeaioble.DeviceDisconnectedErrorolarak ortaya çıkar.L2CAP kanalları – GATT’ın anahtar/değer modeline sığmayan toplu bayt akışları için kaçış kapağı.
aioble.DeviceConnection.l2cap_accept()/l2cap_connect(), GAP bağlantısının üzerine uygulama başına bir kanal açar; kredi akışı kontrollü gönderme / alma ve GATT’ın taşıyabileceğinden daha büyük bir MTU ile.Eşleştirme ve şifreleme – BLE bağlantıları varsayılan olarak geneldir.
aioble.DeviceConnection.pair(), şifrelenmiş bir bağlantı üreten bir anahtar alışverişi başlatır;bond=True(varsayılan) anahtarları kalıcı kılar, böylece sonraki bağlantılar el sıkışmayı atlar.mitm=Trueve kullanılabilir bir IO yeteneği olmadan, şifreleme pasif dinleyicilere karşı korur ancak orijinal eşleştirme sırasındaki aktif bir yeniden yönlendirmeye karşı korumaz.
Bu, durumu bir peripheral olarak yayınlayan, sensör verilerini bir central olarak okuyan, canlı değerleri BLE üzerinden bir telefona iten, bağlantıyı bir eşleştir-ve-bağla adımıyla güvenli hale getiren ve – nadir görülen toplu aktarım durumu için – GATT’tan bir L2CAP kanalına geçen kamera uygulamaları yazmak için yeterlidir.
11.14.1. Sorun giderme¶
BLE arızaları çoğunlukla iki tarafın beklediği şeyler arasındaki uyumsuzluklardır ve telefon tarafındaki bir inceleyici, kimin beklentilerinin yanlış olduğunu görmenin en hızlı yoludur. Standart araç nRF Connect for Mobile‘dır (Nordic Semiconductor, Android ve iOS’ta ücretsiz): tarar, bağlanır, GATT veritabanında gezinir, karakteristikleri okur ve yazar ve bildirimlere abone olur – böylece kamera tarafındaki davranış, hiç eşlik eden bir uygulama yazmadan tek başına test edilebilir.
Yaygın arıza türleri:
“Cihazım tarayıcıda görünüyor ama bağlanmıyor.” Çoğunlukla reklam paketinde
connectable=Falsevardır (broadcaster modu) veya önceki bir bağlantı hâlâ açıktır ve kamera zatenaioble.advertise()‘i geçmiştir. Bunu doğrulamak için advertise çağrısının etrafına print ifadeleri ekleyin.“exchange_mtu(512) çalıştı ama bildirimlerim hâlâ 20 baytla sınırlı.” Müzakere edilen MTU
min(local, peer)‘dir – telefon veya central kütüphanesi kendi tarafında daha büyük bir MTU istememiş olabilir, bu durumda bağlantı 23’te kalır.exchange_mtu()döndükten sonramtu‘yu inceleyin. Ayrıcaexchange_mtu()‘nun bağlantı başına yalnızca bir kez çalıştığına dikkat edin; ilk büyük işlemden önce çağırın.“Eşleştirme genel bir hatayla başarısız oluyor.” İki olağan sorumlu: IO yeteneği uyumsuzluğu (
io=3/ giriş yok çıkış yok bildiren bir kameradamitm=Trueistemek – sayısal kodu onaylamanın hiçbir yolu yoktur, bu nedenle eşleştirme motoru vazgeçer) ve eş gerektirdiğinde kameradaki çılgınca yanlış bir duvar saati zamanı. İlk eşleştirme denemesinden önce saatintptime.settime()ile ayarlayın.“Bildirimler istemciye hiç ulaşmıyor.” Sırayla kontrol edilecek iki şey: (a) karakteristik
notify=Trueile mi bildirildi? – özellik biti sunucu tarafında ayarlanmış olmalıdır; (b) istemcisubscribe()çağırdı mı? – Client Characteristic Configuration Descriptor (CCCD) yazılmadan, sunucuya hiçbir istemcinin bildirim istemediği söylenir ve onları sessizce düşürür.“Reklamı yapılan ad kesik veya eksik.” Reklam yükü 31 bayttır ve flags + service-UUID + appearance alanlarının her biri en üstten bayt alır. Uzun bir
name=artı birkaç servis UUID’si taşar. Ya adı kısaltın ya da tarama yanıtının (başka bir 31 bayt) taşmayı taşıması için aktif tarama kullanın. nRF Connect her iki yarıyı da ayrı ayrı gösterir, bu da ayrımı bariz hale getirir.“L2CAP bağlantısı hemen hata veriyor.” Genellikle bir PSM uyumsuzluğu – her iki tarafın da aynı PSM numarası üzerinde bant dışı olarak anlaşması gerekir. Bir
L2CAPConnectionError, ilk argümanı olarak Bluetooth durum kodunu taşır;2durumu (“PSM not supported”) açık göstergesidir.“Bağlı bağlantılar her yeniden bağlanışta hâlâ tam bir eşleştirme el sıkışmasını tetikliyor.”
aioble.security.load_secrets()başlangıçta çağrılmadı. Bu olmadan, kaydedilen anahtarlar flash bellektedir ancak hiçbir zaman belleğe yüklenmez, bu nedenle eşin kimliği bilinmez ve eşleştirme her seferinde sıfırdan çalışır.
Diğer her şey başarısız olduğunda, düşük seviyeli bluetooth modülü, her temel olay için tetiklenen bir IRQ geri çağırması açığa çıkarır; buna kısa bir süre abone olup olayları yazdırmak, kamera tarafı için bir Wireshark izinin eşdeğeridir.
11.14.2. Bu referansı daha sonra kullanma¶
Bluetooth bölümlerini referans materyali olarak değerlendirin; bir peripheral’ın reklam yükünün tam yerleşimi veya central’ın tarama-ve-abone-olma akışı için geri dönmek amaçlanan kullanımdır. aioble — Asenkron BLE ve bluetooth — düşük seviyeli Bluetooth referans sayfaları, soru sadece “bu çağrının tam adı nedir” olduğunda her yöntemi, bayrağı ve sabiti tek bir yerde listeler.