Android uygulamanıza BLE desteği nasıl eklenir adım adım

Code With Ammar
8 min readFeb 17, 2023

Klasik Bluetooth kullanarak BLE cihazlarına bağlanmak mümkün mu?

HAYIR, klasik Bluetooth kullanarak BLE cihazlarına bağlanmak mümkün değildir. BLE ve klasik Bluetooth, farklı işletme modlarına sahip iki ayrı kablosuz iletişim protokolüdür ve birbiriyle uyumlu değillerdir.

BLE ve klasik Bluetooth arasındaki temel farklar, güç tüketimi, veri transfer hızları ve cihaz keşfi ve bağlantı işlemleridir. BLE, düşük güç tüketimi ve düşük veri oranlı uygulamalar için optimize edilmiştir ve veri alışverişi için istemci-sunucu mimarisi kullanırken, klasik Bluetooth daha yüksek veri oranları için tasarlanmıştır ve veri alışverişi için noktadan noktaya mimari kullanır.

BLE’yi destekleyen bir Android uygulaması geliştirirken, BLE cihazlarının tarama, bağlantı ve veri alışverişi işlemleri için doğru API’ları kullanmak ve doğru prosedürleri izlemek önemlidir. Android çerçevesi, BLE iletişimi için özel olarak tasarlanmış bir dizi API sağlar ve BLE iletişimi için klasik Bluetooth kullanmaya çalışmak yerine bu API’ları kullanmanız önerilir.

BLE ve klasik Bluetooth arasındaki protokol farklılıkları nedeniyle BLE cihazlarına klasik Bluetooth ile bağlanmak mümkün değildir. Bu nedenle, bir uygulama geliştiricisi olarak, BLE cihazlarına bağlanmak için BLE protokolüne uygun olarak uygulama geliştirme sürecinde doğru adımları takip etmeniz gerekmektedir.

Eğer Android uygulamanızda klasik Bluetooth bağlantılarına zaten destek veriyorsanız ve Bluetooth Low Energy (BLE) bağlantılarını ve BLE cihazları ile iletişimi desteklemek istiyorsanız, aşağıdaki adımları izleyin:

  1. BLE desteğini kontrol edin: Uygulamanıza BLE desteği eklemek için önce cihazın BLE yeteneklerine sahip olup olmadığını kontrol edin. Cihazın Bluetooth 4.0 veya üstü desteğini sağladığından emin olun.
  2. İzinleri ekleme: Uygulamanızın AndroidManifest.xml dosyasına, BLE desteği için gereken izinleri, BLUETOOTH, BLUETOOTH_ADMIN ve ACCESS_COARSE_LOCATION veya ACCESS_FINE_LOCATION dahil olmak üzere ekleyin.
  3. Bluetooth adaptörü alın: BluetoothManager sistem servisini kullanarak BluetoothAdapter referansını alın.
  4. BLE cihazları için tarama yapın: startLeScan() yöntemini kullanarak BLE cihazları için tarama yapmaya başlayın ve BluetoothAdapter.LeScanCallback arabirimini tarama sonuçlarını işlemek için kullanın.
  5. BLE cihazına bağlanın: Bir cihaz bulunduğunda, BluetoothGattCallback ile birlikte connectGatt() yöntemini kullanarak cihaza bağlanın. BluetoothGatt nesnesinin yöntemlerini kullanarak cihazla iletişim kurun.
  6. Cihazla iletişim kurun: BluetoothGatt nesnesi tarafından sağlanan yöntemleri kullanarak BLE cihazına veri gönderin ve veri alın.
  7. Bağlantıyı kesin ve kapatın: Cihazla iletişim kurduktan sonra, bağlantıyı kapatmak için disconnect() ve close() yöntemlerini kullanın.

Adımları tek tek anlatmak :

  1. BLE desteğini kontrol edin: Uygulamanıza BLE desteği eklemek için önce cihazın BLE yeteneklerine sahip olup olmadığını kontrol edin. Cihazın Bluetooth 4.0 veya üstü desteğini sağladığından emin olun.

Bu adımda, cihazın BLE desteğine sahip olup olmadığını kontrol etmek için bir kontrol mekanizması eklemelisiniz. Bunun için aşağıdaki kod örneği kullanılabilir:

if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
Toast.makeText(this, "BLE desteklenmiyor", Toast.LENGTH_SHORT).show();
finish();
}

Bu örnekte, getPackageManager() yöntemi kullanılarak sistem özelliklerinden FEATURE_BLUETOOTH_LE’nin varlığı kontrol edilir. Eğer cihaz bu özelliği desteklemiyorsa, bir Toast mesajı ile kullanıcıya bildirilir ve uygulama kapatılır.

Bu adımda, uygulamanızın BLE desteğine sahip cihazlarda çalıştığından emin olmak için bu kontrolü gerçekleştirmek önemlidir.

2. BLE cihazını tarayın ve bağlanın: Uygulamanızın BLE cihazlarını taraması ve ardından bağlanması gerekiyor. Bu adımı gerçekleştirmek için BluetoothAdapter ve BluetoothLeScanner sınıflarını kullanabilirsiniz.

Aşağıdaki örnek kodda, BLE cihazlarını tarayıp bir listeye eklemek için BluetoothLeScanner sınıfı kullanılmıştır:

private BluetoothLeScanner mBluetoothLeScanner;
private ScanCallback mScanCallback;


// BLE cihazlarını tarayın
mBluetoothLeScanner = BluetoothAdapter.getDefaultAdapter().getBluetoothLeScanner();
mScanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
// Cihazları tara ve listeye ekleyin
}
};
mBluetoothLeScanner.startScan(mScanCallback);

Bu örnekte, BluetoothAdapter.getDefaultAdapter().getBluetoothLeScanner() yöntemi kullanılarak bir BluetoothLeScanner nesnesi oluşturulur. Daha sonra, ScanCallback sınıfını kullanarak cihazları tarama işlemi gerçekleştirilir ve tespit edilen BLE cihazları bir listeye eklenir.

BLE cihazına bağlanmak için ise BluetoothDevice sınıfını kullanabilirsiniz. Aşağıdaki örnek kodda, cihaza bağlanmak için BluetoothDevice sınıfı kullanılmıştır:

private BluetoothGatt mBluetoothGatt;
private BluetoothGattCallback mGattCallback;

// BLE cihazına bağlanın
mBluetoothGatt = device.connectGatt(this, false, mGattCallback);

Bu örnekte, BluetoothDevice.connectGatt() yöntemi kullanılarak cihaza bağlanılır ve bağlantı durumuyla ilgili bildirimler BluetoothGattCallback sınıfında ele alınır.

3. BLE cihazıyla iletişim kurun: BLE cihazlarıyla iletişim kurmak için, GATT (Generic Attribute Profile) protokolünü kullanabilirsiniz. GATT, BLE cihazlarındaki servisler, öznitelikler ve karakteristiklerle iletişim kurmanızı sağlar.

Aşağıdaki örnek kodda, BLE cihazıyla bir GATT bağlantısı kurulduktan sonra bir servis okunur ve bir öznitelik (characteristic) yazılır:

@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
if (newState == BluetoothProfile.STATE_CONNECTED) {
// GATT bağlantısı kurulduğunda servisleri keşfedin
gatt.discoverServices();
}
}

@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
if (status == BluetoothGatt.GATT_SUCCESS) {
// Servisler keşfedildiğinde servisleri, öznitelikleri ve karakteristikleri okuyun veya yazın
BluetoothGattService service = gatt.getService(SERVICE_UUID);
BluetoothGattCharacteristic characteristic = service.getCharacteristic(CHARACTERISTIC_UUID);
byte[] value = {0x01, 0x02};
characteristic.setValue(value);
gatt.writeCharacteristic(characteristic);
}
}

Bu örnekte, BluetoothGattCallback sınıfındaki onConnectionStateChange() yöntemi, GATT bağlantısı kurulduğunda otomatik olarak çağrılır ve servisleri keşfetmek için gatt.discoverServices() yöntemi kullanılır.

Servisler keşfedildiğinde, BluetoothGattCallback sınıfındaki onServicesDiscovered() yöntemi çağrılır. Bu yöntemde, BluetoothGattService ve BluetoothGattCharacteristic sınıfları kullanılarak servisler, öznitelikler ve karakteristikler okunabilir veya yazılabilir.

4. Bağlantıyı sonlandırın: BLE cihazıyla iletişim işlemi tamamlandıktan sonra, bağlantıyı sonlandırmak önemlidir. Bu, enerji tasarrufu sağlar ve başka BLE cihazlarıyla bağlantı kurmaya hazır hale gelir.

Aşağıdaki örnek kodda, bağlantı sonlandırma işlemi gösterilmektedir:

@Override
public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
// Öznitelik okuma işlemi tamamlandığında, bağlantıyı sonlandırın
gatt.disconnect();
}

Bu örnekte, BluetoothGattCallback sınıfındaki onCharacteristicRead() yöntemi, öznitelik okuma işlemi tamamlandığında çağrılır. Bu yöntemde, gatt.disconnect() yöntemi kullanılarak bağlantı sonlandırılır.

5. Hata durumlarına hazırlıklı olun: BLE cihazlarıyla iletişim kurarken, hata durumları oluşabilir. Örneğin, BLE cihazı bağlantısını kesme, özniteliklerin okunamaması veya yazılamaması gibi durumlar oluşabilir. Bu nedenle, BluetoothGattCallback sınıfındaki hata yöntemlerini kullanarak hata durumlarına hazırlıklı olmanız gerekir.

Aşağıdaki örnek kodda, BLE cihazıyla iletişim sırasında ortaya çıkan bir hata durumunda ne yapılması gerektiği gösterilmektedir:

@Override
public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
if (status != BluetoothGatt.GATT_SUCCESS) {
// Öznitelik yazma işlemi başarısız oldu, hata durumuna hazırlık yapın
Log.d(TAG, "Error writing characteristic");
}
}

Bu örnekte, BluetoothGattCallback sınıfındaki onCharacteristicWrite() yöntemi, öznitelik yazma işlemi başarısız olduğunda çağrılır. status değişkeni, yazma işleminin başarılı olup olmadığını gösterir. status değişkeninin değeri BluetoothGatt.GATT_SUCCESS değilse, bir hata durumu meydana gelmiştir ve buna göre gerekli önlemler alınmalıdır. Bu örnekte, hata durumu Log.d() yöntemiyle kaydedilir.

6. Enerji tasarrufu sağlayın: BLE cihazları düşük güç tüketimi sağlamak için tasarlanmıştır. Bu nedenle, BLE cihazıyla iletişim sırasında enerji tasarrufu sağlamak önemlidir.

Aşağıdaki örnek kodda, BLE cihazıyla iletişim sırasında enerji tasarrufu sağlamak için bazı öneriler verilmektedir:

// Öznitelik okuma işlemi başlatın
BluetoothGattCharacteristic characteristic = gatt.getService(serviceUUID).getCharacteristic(characteristicUUID);
gatt.readCharacteristic(characteristic);

// Öznitelik okuma işlemi tamamlandığında, bağlantıyı sonlandırın
@Override
public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
gatt.disconnect(); // Bağlantıyı sonlandırın
// Uyku moduna geçin
try {
Thread.sleep(1000); // 1 saniye uyuyun
} catch (InterruptedException e) {
e.printStackTrace();
}
gatt.close(); // Bağlantıyı kapatın
}

Bu örnekte, öznitelik okuma işlemi tamamlandıktan sonra bağlantıyı sonlandırmak için gatt.disconnect() yöntemi kullanılır. Daha sonra, Thread.sleep() yöntemi kullanarak 1 saniye uyku moduna geçilir. Bu, BLE cihazıyla iletişim kurarken enerji tasarrufu sağlamaya yardımcı olur. Son olarak, gatt.close() yöntemi kullanılarak bağlantı kapatılır.

7. İzinleri kontrol edin: BLE özellikleri kullanmak için, uygulamanızın BLE özelliklerine erişim izni olması gerekir. Bu izinleri AndroidManifest.xml dosyasında tanımlayabilirsiniz.

Aşağıdaki örnek kodda, Bluetooth özelliğine erişim izni tanımlamak için AndroidManifest.xml dosyasına eklemeniz gereken kod gösterilmektedir:

<uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

Bu örnekte, BLE özelliğine erişim izni için uses-feature etiketi kullanılmaktadır. uses-feature etiketi, uygulamanızın BLE özelliğine sahip cihazlarla uyumlu olduğunu belirtir. uses-permission etiketi, uygulamanızın Bluetooth özelliğine erişim izni olduğunu belirtir. BLUETOOTH izni, cihazın Bluetooth modülüne erişim izni sağlar. BLUETOOTH_ADMIN izni, cihazın Bluetooth ayarlarını değiştirmek için erişim izni sağlar.

İzinleri tanımladıktan sonra, uygulamanız BLE cihazlarına erişebilir ve iletişim kurabilir.

9. Test edin: Uygulamanızı BLE cihazlarıyla test etmek için, birkaç farklı BLE cihazı kullanarak test edebilirsiniz. Bu cihazlar, BLE reklamını destekleyen birçok farklı cihazdan oluşabilir.

Örneğin, bir akıllı saat, fitness izleme cihazı veya BLE özellikli bir araç kitine sahip bir araç kullanabilirsiniz. Uygulamanızın farklı cihazlarla uyumlu olduğundan emin olmak için, uygulamanızı farklı cihazlarla test etmelisiniz.

BLE cihazlarıyla iletişim kurmak için kullanabileceğiniz birkaç farklı araç vardır. Bunlar arasında Nordic nRF Connect, LightBlue Explorer ve BLE Scanner gibi ücretsiz uygulamalar bulunmaktadır. Bu uygulamalar, BLE cihazlarınızın reklamını taramanıza ve hizmetlerini ve özniteliklerini görüntülemenize olanak tanır.

Test sırasında, uygulamanızın BLE cihazlarıyla iletişim kurduğundan emin olun. Özniteliklerin okunup yazılabildiğini, hizmetlerin bulunabildiğini ve diğer BLE cihazı özelliklerinin çalıştığını doğrulayın. Test sırasında oluşabilecek hataları not edin ve bunları düzeltmek için uygulamanızda gerekli değişiklikleri yapın.

Bu makalede, Android uygulamanıza BLE bağlantısı eklemenin adımlarını öğrendiniz. Bu adımlar şunları içerir:

  1. BLE desteği ekleyin: Uygulamanıza BLE desteği eklemek için, uygulamanızın AndroidManifest.xml dosyasında BLE iznini ekleyin.

2. BluetoothAdapter ve BluetoothLeScanner örneklerini alın: BluetoothAdapter ve BluetoothLeScanner örneklerini almak için getSystemService() yöntemini kullanın.

3. BLE cihazlarını tara: BluetoothLeScanner kullanarak BLE cihazlarını taramak için startScan() yöntemini kullanın.

4. BLE cihazlarıyla bağlantı kurun: BluetoothDevice örneğini almak ve connectGatt() yöntemini kullanarak BLE cihazına bağlanmak için BluetoothAdapter örneğini kullanın.

5. BluetoothGattCallback arabirimini uygulayın: BLE cihazlarıyla iletişim kurmak için BluetoothGattCallback arabirimini uygulayın.

6. Öznitelikleri okuyun veya yazın: BLE cihazının özniteliklerini okumak veya yazmak için readCharacteristic() veya writeCharacteristic() yöntemlerini kullanın.

7. Hizmetleri ve öznitelikleri keşfedin: BLE cihazının hizmetlerini ve özniteliklerini keşfetmek için discoverServices() yöntemini kullanın.

8. Test edin: Uygulamanızı farklı BLE cihazlarıyla test ederek, farklı cihazlarla uyumlu olduğundan emin olun.

9. Classic Bluetooth desteği ekleyin: Uygulamanıza classic Bluetooth desteği eklemek için, uygulamanızın AndroidManifest.xml dosyasında Bluetooth izinlerini ekleyin.

10 . İstenirse BLE özelliğini kapatın: BLE özelliğini devre dışı bırakmak için BluetoothAdapter öğesini kullanın.

Bu adımları takip ederek, Android uygulamanıza hem classic Bluetooth hem de BLE desteği ekleyebilir ve BLE cihazlarıyla iletişim kurabilirsiniz.

Android uygulamanıza BLE desteği eklemek için kullanabileceğiniz birkaç popüler kütüphane bulunmaktadır. İşte en yaygın olarak kullanılanlardan bazıları:

  1. Android BLE Kütüphanesi: Bu, BLE iletişimi için Android tarafından sağlanan varsayılan kütüphanedir. BLE cihazlarını tarayan, bağlanan ve iletişim kuran basit bir arayüz sağlar.
  2. RxAndroidBle: Bu kütüphane Android BLE Kütüphanesi üzerine inşa edilmiş olup reaktif programlama tercih eden geliştiriciler arasında popüler bir seçimdir. BLE iletişimini ele almak için reaktif bir arayüz sağlar.
  3. Bluetooth GATT Kütüphanesi: Bu kütüphane GATT tabanlı BLE iletişimi için yüksek seviye bir API sağlamak üzere tasarlanmıştır. BLE cihazlarını tarayan, bağlanan ve iletişim kuran basitleştirilmiş bir arayüz sunar.

Bir BLE kütüphanesi seçerken, projenizin özel gereksinimlerini, ayrıca Android BLE API’si ile olan deneyim ve aşinalığınızı dikkate almak önemlidir.

Özet :

Android BLE Kütüphanesi kullanarak Android uygulamanıza BLE desteği eklemek için nasıl yapabileceğinize dair bir örnek:

Adım 1: Uygulamanızın manifest dosyasında Bluetooth izinlerini belirtin.

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

Adım 2: BluetoothAdapter sınıfını kullanarak cihazın BLE’yi destekleyip desteklemediğini kontrol edin.

BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter();
if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE) || bluetoothAdapter == null) {
// BLE desteklenmiyor
}

Adım 3: startLeScan() yöntemini kullanarak BLE cihazları için tarama yapın.

bluetoothAdapter.startLeScan(leScanCallback);

Adım 4: LeScanCallback arabirimini uygulayarak tarama sonuçlarını alın.

private BluetoothAdapter.LeScanCallback leScanCallback = new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice device, final int rssi, final byte[] scanRecord) {
runOnUiThread(new Runnable() {
@Override
public void run() {
// Tarama sonuçlarını işle
}
});
}
};

Adım 5: BluetoothGatt sınıfını kullanarak bir BLE cihazına bağlanın.

BluetoothGatt bluetoothGatt = device.connectGatt(context, false, gattCallback);

Adım 6: BluetoothGattCallback arabirimini uygulayarak GATT olaylarını alın.

private BluetoothGattCallback gattCallback = new BluetoothGattCallback() {
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
super.onConnectionStateChange(gatt, status, newState);
// Bağlantı durumu değişikliklerini işle
}
@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
super.onServicesDiscovered(gatt, status);
// Servis keşfi sonuçlarını işle
}
@Override
public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
super.onCharacteristicRead(gatt, characteristic, status);
// Karakteristik okuma sonuçlarını işle
}
};

Adım 7: discoverServices() yöntemini kullanarak bağlı BLE cihazında hizmetleri keşfedin.

bluetoothGatt.discoverServices();

Adım 8: readCharacteristic() ve writeCharacteristic() yöntemlerini kullanarak bir karakteristikten veri okuyun veya yazın.

BluetoothGattCharacteristic characteristic = bluetoothGatt.getService(serviceUuid).getCharacteristic(characteristicUuid);
bluetoothGatt.readCharacteristic(characteristic);
bluetoothGatt.writeCharacteristic(characteristic);

Adım 9: İşiniz bittiğinde GATT bağlantısını close() yöntemiyle kapatın.

bluetoothGatt.close();

Bu makalenin sonunda, bu işi yapmamı sağlayan tüm destek için AHB BİLİŞİM Şirketi’ne teşekkür etmek istiyorum ..

--

--

Code With Ammar

Mobile apps developer I'm Amar, I'm a developer with a passion for teaching. with all wishes for success .