Gereksinimler ve Ön Hazırlık
Bluetooth bağlantılarını yönetmek için Flutter ekosisteminde en kararlı ve güncel kütüphane olan flutter_blue_plus paketini kullanacağız. Bu kütüphane, hem Android hem de iOS platformlarında BLE işlemlerini yönetmek için optimize edilmiştir.
- Flutter SDK: 3.24 veya üzeri sürüm.
- Android:
minSdkVersionen az 21, tercihen 23 olmalıdır.AndroidManifest.xmldosyasına gerekli izinlerin eklenmesi şarttır. - iOS:
Info.plistdosyasına Bluetooth kullanım izinlerinin (NSBluetoothAlwaysUsageDescription) eklenmesi gerekir.
Projenizin pubspec.yaml dosyasına gerekli bağımlılığı şu şekilde ekleyin:
dependencies:
flutter:
sdk: flutter
flutter_blue_plus: ^1.31.0
Paketi ekledikten sonra terminalde flutter pub get komutunu çalıştırarak kütüphaneyi projenize dahil edin.
Adım Adım Bluetooth Cihazlarını Tarama
Bluetooth bağlantısının ilk adımı, çevredeki cihazları keşfetmektir. flutter_blue_plus kullanarak cihazları taramak için öncelikle Bluetooth adaptörünün açık olup olmadığını kontrol etmeli ve ardından tarama işlemini başlatmalısınız.
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
void startScanning() {
// Tarama işlemini başlat
FlutterBluePlus.startScan(timeout: const Duration(seconds: 5));
// Bulunan cihazları dinle
FlutterBluePlus.scanResults.listen((results) {
for (ScanResult r in results) {
print('Cihaz bulundu: ${r.device.name} - ${r.device.remoteId}');
}
});
}
Yukarıdaki kod, 5 saniyelik bir tarama başlatır ve bulunan cihazları konsola yazdırır. remoteId, Android'de MAC adresi, iOS'te ise UUID olarak döner; bu nedenle cihazları tanımlarken bu benzersiz kimliği kullanmanız önemlidir.
Cihaza Bağlanma ve Servisleri Keşfetme
Bir cihazı bulduktan sonra, veri alışverişi yapabilmek için o cihaza bağlanmanız gerekir. Bağlantı kurulduktan sonra, cihazın sunduğu servisleri ve karakteristikleri (characteristics) keşfetmek, veriye ulaşmanın anahtarıdır.
Future connectToDevice(BluetoothDevice device) async {
await device.connect();
// Servisleri keşfet
List services = await device.discoverServices();
for (var service in services) {
print('Servis UUID: ${service.uuid}');
for (var characteristic in service.characteristics) {
print('Karakteristik UUID: ${characteristic.uuid}');
}
}
}
Bağlantı kurulduğunda device.connect() metodu kullanılır. Servisler, Bluetooth cihazının sunduğu işlevsel gruplardır; karakteristikler ise bu servislerin içindeki gerçek veri noktalarıdır.
Bluetooth Üzerinden Veri Okuma ve Yazma
Cihazla bağlantı kurduktan sonra, belirli bir karakteristik üzerinden veri okuyabilir veya cihaza komut gönderebilirsiniz. Bu işlem genellikle sensör verilerini almak veya bir cihazı tetiklemek için kullanılır.
// Veri Okuma
Future readData(BluetoothCharacteristic characteristic) async {
List value = await characteristic.read();
print('Okunan Veri: $value');
}
// Veri Yazma
Future writeData(BluetoothCharacteristic characteristic, List data) async {
await characteristic.write(data, withoutResponse: false);
print('Veri başarıyla gönderildi.');
}
Veri yazarken withoutResponse parametresi, cihazın onay dönmesini bekleyip beklemeyeceğinizi belirler. Kritik komutlarda false (cevap bekler) kullanmanız veri bütünlüğü açısından önemlidir.
Bluetooth Bağlantı Yöntemleri Karşılaştırması
| Yöntem | Avantajı | Dezavantajı |
|---|---|---|
| BLE (Düşük Enerji) | Düşük güç tüketimi, hızlı bağlantı | Düşük veri aktarım hızı |
| Classic Bluetooth | Yüksek veri hızı, sürekli veri akışı | Yüksek enerji tüketimi |
Mobil uygulamalarda genellikle BLE tercih edilir çünkü modern akıllı cihazların çoğu bu protokolü kullanır ve pil ömrünü korumak için tasarlanmıştır.
Güvenlik Uyarısı: Bluetooth üzerinden hassas veriler (şifreler, kişisel sağlık verileri vb.) gönderirken mutlaka uçtan uca şifreleme kullanın. Ham veriyi olduğu gibi göndermek, "Man-in-the-Middle" (ortadaki adam) saldırılarına kapı aralayabilir.
Sıkça Sorulan Sorular
Bluetooth taraması neden hiçbir cihazı bulmuyor?
Öncelikle konum servislerinin açık olduğundan ve uygulamanın "Konum" (Location) iznine sahip olduğundan emin olun. Android 12 ve üzeri sürümlerde BLUETOOTH_SCAN ve BLUETOOTH_CONNECT izinlerinin çalışma zamanında (runtime) alınması zorunludur.
Bağlantı neden sürekli kopuyor?
Bağlantı kopmaları genellikle sinyal gücünün (RSSI) düşük olmasından veya cihazın uyku moduna geçmesinden kaynaklanır. device.connectionState dinleyicisi ile bağlantı durumunu takip ederek otomatik yeniden bağlanma (auto-reconnect) mekanizması kurmalısınız.
Aynı anda birden fazla cihaza bağlanabilir miyim?
Evet, flutter_blue_plus aynı anda birden fazla cihaza bağlanmayı destekler. Ancak her cihaz için ayrı bir BluetoothDevice örneği yönetmeniz ve kaynak tüketimini (CPU/Pil) takip etmeniz gerekir.
iOS'te neden "CoreBluetooth" hatası alıyorum?
iOS platformunda Bluetooth işlemleri için Info.plist dosyasında NSBluetoothAlwaysUsageDescription anahtarının tanımlı olması gerekir. Aksi takdirde uygulama, Bluetooth donanımına erişim yetkisi alamaz.
Veri yazarken neden hata alıyorum?
Karakteristiğin yazma yetkisi (write property) olup olmadığını kontrol edin. Bazı karakteristikler sadece okunabilir (read-only) veya bildirim (notify) odaklıdır.
Bluetooth Uygulamalarında Performans Optimizasyonu
Bluetooth Low Energy (BLE) uygulamalarında pil tüketimi ve veri iletim hızı, kullanıcı deneyimini doğrudan etkileyen kritik faktörlerdir. Özellikle sürekli veri akışı gerektiren uygulamalarda, cihazın bağlantı parametrelerini optimize etmek hayati önem taşır.
Bağlantı Aralığı (Connection Interval) Yönetimi
Bağlantı aralığı, cihazın ne sıklıkla veri alışverişi yapacağını belirler. Daha düşük aralıklar daha hızlı veri transferi sağlasa da pil tüketimini artırır. Flutter tarafında flutter_blue_plus kullanırken, bağlantı sonrası cihazın requestConnectionPriority metodunu kullanarak bu değeri optimize edebilirsiniz.
// Bağlantı önceliğini yüksek olarak ayarlama (Daha hızlı veri transferi için)
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
Future optimizeConnection(BluetoothDevice device) async {
try {
await device.requestConnectionPriority(ConnectionPriority.high);
print("Bağlantı önceliği yükseltildi.");
} catch (e) {
print("Hata: $e");
}
}
Veri Paketleme ve MTU Boyutu
MTU (Maximum Transmission Unit), tek bir paketle gönderilebilecek maksimum veri boyutudur. Varsayılan değer genellikle 23 bayttır. Eğer büyük veri blokları (örneğin sensör logları) gönderiyorsanız, MTU boyutunu artırmak paket sayısını azaltarak performansı ciddi oranda artırır.
// MTU boyutunu 512 bayta çıkarma isteği
Future requestMtu(BluetoothDevice device) async {
int mtuSize = await device.requestMtu(512);
print("Yeni MTU boyutu: $mtuSize");
}
Üretim Ortamı İçin Hata Ayıklama ve İzleme
Bluetooth bağlantıları çevresel faktörlerden (duvarlar, diğer sinyaller, metal yüzeyler) kolayca etkilenir. Kullanıcı tarafında yaşanan kopmaları analiz etmek için kapsamlı bir loglama mekanizması kurmalısınız.
Bağlantı Durumunu İzleme (State Monitoring)
Uygulamanızın arka planda veya ön planda bağlantı durumunu sürekli dinlemek, kullanıcıya anlık bildirimler sunmanızı sağlar. connectionState akışını dinleyerek bağlantı koptuğunda otomatik yeniden bağlanma (reconnect) mantığı kurabilirsiniz.
// Bağlantı durumunu dinleyerek otomatik yeniden bağlanma
device.connectionState.listen((BluetoothConnectionState state) {
if (state == BluetoothConnectionState.disconnected) {
print("Bağlantı koptu, yeniden bağlanılıyor...");
device.connect();
}
});
Bluetooth Test Stratejileri
Bluetooth uygulamalarını sadece emülatörlerde test etmek imkansızdır. Gerçek cihazlarla test yaparken şu kontrol listesini uygulayın:
- Farklı İşletim Sistemi Sürümleri: Android 12 ve sonrası için eklenen "Bluetooth Connect" ve "Bluetooth Scan" izinlerinin doğru yönetildiğinden emin olun.
- Sinyal Gücü (RSSI):
rssideğerini izleyerek, cihazın kapsama alanı dışına çıkıp çıkmadığını kullanıcıya arayüz üzerinden bildirin. - Arka Plan Kısıtlamaları: Uygulama arka plana alındığında işletim sisteminin Bluetooth taramasını durdurup durdurmadığını test edin; gerekirse "Foreground Service" kullanın.
Profesyonel İpucu: Bluetooth cihazınızın donanım yazılımı (firmware) güncellemelerini test ederken, bağlantının kesilmesi durumunda cihazın "brick" olmaması için bir "bootloader" koruma mekanizması olduğundan emin olun.
Sonuç
Flutter & Mobil ile Bluetooth üzerinden cihaz bağlantısı kurmak, doğru kütüphane ve izin yönetimi ile oldukça sistematik bir süreçtir. Bu rehberde, taramadan veri alışverişine kadar temel adımları tamamladınız. Bir sonraki aşamada, cihazdan gelen verileri bir veritabanında (SQLite veya Hive) saklayarak çevrimdışı analiz yapabileceğiniz bir mimari kurmayı deneyebilirsiniz.
Sorumluluk Reddi: Bu makaledeki kod örnekleri eğitim amaçlıdır. Üretim ortamındaki uygulamalarınızda, cihaz güvenliği, veri gizliliği ve platforma özel kısıtlamaları (Apple/Google politika güncellemeleri) mutlaka kontrol edin. Yazılımın güvenliğinden geliştirici sorumludur.


Yorumlar (0)
Yorum Yaz