Bluetooth Low Energy (BLE) (Bluetooth Düşük Enerji), yakın cihazlar arasında küçük miktardaki verilerin klasik Bluetooth’a göre hem daha hızlı transfer edilmesini sağlayan hem de daha az enerji gerektiren bir teknolojidir. Bu sayede BLE, nesnelerin interneti alanında oldukça fazla kullanılmaktadır.
Çalıştığımız bir projede Android üzerinde BLE kullanmamız gerekti ve her ne kadar BLE’nin Android üzerinde uygulanışı biraz sancılı olsa da en azından verinin karşıdaki cihaza aktarımını gerçekleştirebildik.
Öncelikle gerekli izinlerin AndroidManifest.xml dosyasına eklenmesi gerek.
Yukarıdaki izinleri kullanıcının kendisi açması gerekir. Bu yüzden her izin için kullanıcıya bir arayüz ile erişim yetkisi istemelisiniz. Bu yazının sade olması ve uzun olmaması için bu adımlar atlıyoruz.
mConnectedGatt, BLE cihazlarının GATT profilini tanımlar. Bu profilde BLE servislerini taramak, bağlantının yönetilmesi, MTU(Maksimum transfer kotası) belirlenmesi ve BLE cihazlarının servis ve karakteristik özelliklerine erişim gibi özellikler bulunur.
characteristic, cihazın pil seviyesini, seri numarasını veya cihaza gönderilecek verileri tutan bir veri taşıyıcısıdır yani anlamlı verilerin tutulduğu değişkendir.
bluetoothAdapter, direkt olarak bluetooth donanımını temsil eder. Bluetooth’u açıp/kapatmak ve BLE cihazlarını taramak için kullanılır.
BLE cihazları tarandığında scanCallback() çalışacaktır. onScanResult() metodu içerisinde taranan cihazlar görülecektir. if() kısmında ise şartınıza uyan cihaz hangisi ise result.let{} ile o cihaza BLE bağlantısı kurulmaya çalışılacak.
Bağlanılmak istenen cihaz bulunduğunda gattCallback() çağırılır. onConnectionStateChange() içerisindeki newState ile bağlantının sağlandığını veya bağlantının koptuğunu belirleyebiliriz. Bağlantı sağlandı ise gatt?.requestMtu(64) ile istenilen MTU miktarını belirtmeliyiz. MTU isteğinin ardından onMtuChanged metodu çağırılır ve ardından istenilen servise bağlanmak için gatt?.discoverServices() ile onServicesDiscovered() methodu çağırılır. Eğer istenilen servise bağlantı başarılı ise isServiceDiscovered = true ile isServiceDiscovered değişkenine bir setter belirleyip bağlantının başarılı olduğuna dair bir bildirim veya popup gösterebiliriz.
BLE cihazlarını taramak için bleScanner.startScan(null, scanSettings, scanCallback), taramayı durdurmak için ise bleScanner.stopScan(scanCallback) kullanılır.
Bağlanılan cihaza gönderilecek veri byte array tipine dönüştürülmesi gerekir.
Daha sonra characteristic ve mConnectedGatt değişkenleri null durumundan farklı ise veriyi BLE cihazına göndermek gerekir.