Ön Hazırlık ve Gereksinimler
Giyilebilir cihazlarla iletişim kurmak için Flutter üzerinde belirli paketlerin yapılandırılması gerekir. Öncelikle, projenizin pubspec.yaml dosyasında aşağıdaki bağımlılıkların güncel sürümlerini tanımlamalısınız. Bluetooth Low Energy (BLE) protokolü üzerinden veri alışverişi yapmak için flutter_blue_plus kütüphanesi 2026 itibarıyla en stabil ve performanslı seçenektir.
dependencies:
flutter:
sdk: flutter
flutter_blue_plus: ^1.31.0
shared_preferences: ^2.3.0
permission_handler: ^11.0.0
Bu bağımlılıklar, cihaz tarama, bağlantı kurma ve yerel veri önbellekleme işlemlerini yönetmenizi sağlar. Ayrıca, Android için AndroidManifest.xml dosyanızda BLUETOOTH_SCAN, BLUETOOTH_CONNECT ve ACCESS_FINE_LOCATION izinlerini tanımlamayı unutmayın.
Bluetooth Cihazlarını Tarama ve Bağlanma
Veri senkronizasyonunun ilk adımı, giyilebilir cihazı bulmak ve güvenli bir bağlantı kurmaktır. Cihaz tarama işlemi, pil tüketimini minimize etmek için kısa süreli periyotlarla yapılmalıdır.
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
void startScanning() {
FlutterBluePlus.startScan(timeout: Duration(seconds: 5));
FlutterBluePlus.scanResults.listen((results) {
for (ScanResult result in results) {
if (result.device.platformName == "AkilliSaat_ModelX") {
connectToDevice(result.device);
}
}
});
}
Future connectToDevice(BluetoothDevice device) async {
await device.connect();
print("Cihaza bağlanıldı: ${device.remoteId}");
}
Yukarıdaki kod bloğu, belirli bir isimle yayın yapan cihazı tarar ve bağlantı isteği gönderir. Bağlantı kurulduktan sonra cihazın sunduğu servisleri keşfetmek bir sonraki adım olacaktır.
Giyilebilir Cihazdan Veri Okuma Süreci
Bağlantı kurulduktan sonra, cihazın sunduğu karakteristikler (characteristics) üzerinden veri okuması yapılır. Giyilebilir cihazlar genellikle veriyi "Notify" (bildirim) mekanizması ile gönderir. Bu, cihazın verisi güncellendiğinde uygulamanızın anlık olarak tetiklenmesini sağlar.
Future subscribeToData(BluetoothCharacteristic characteristic) async {
await characteristic.setNotifyValue(true);
characteristic.lastValueStream.listen((value) {
// Gelen veriyi işle ve uygulamaya aktar
processSensorData(value);
});
}
Bu yöntem, sürekli veri çekmek yerine cihazın veri göndermesini bekleyerek mobil cihazın enerji verimliliğini artırır.
Veri Senkronizasyon Yöntemleri Karşılaştırması
Giyilebilir cihaz verilerini yönetirken farklı stratejiler izlenebilir. Aşağıdaki tablo, farklı senkronizasyon yaklaşımlarının avantaj ve dezavantajlarını özetlemektedir.
| Yöntem | Avantajı | Dezavantajı |
|---|---|---|
| Gerçek Zamanlı (Streaming) | Anlık veri takibi | Yüksek pil tüketimi |
| Periyodik Senkronizasyon | Enerji tasarrufu | Veri gecikmesi |
| Olay Tabanlı (Triggered) | Düşük veri trafiği | Karmaşık yapı |
Veri İşleme ve Güvenli Depolama
Giyilebilir cihazdan gelen ham veriler genellikle byte dizisi şeklindedir. Bu verileri anlamlı hale getirmek için bir veri modeli oluşturmalı ve veriyi yerel veritabanında (örneğin sqflite veya isar) güvenli bir şekilde saklamalısınız.
void processSensorData(List rawData) {
// Ham veriyi anlamlı bir formata dönüştür
int heartRate = rawData[0];
// Veriyi şifreli bir veritabanına kaydet
saveToSecureStorage(heartRate);
}
Güvenlik Uyarısı: Giyilebilir cihazlardan gelen veriler kişisel sağlık bilgileri içerebilir. Bu verileri yerel cihazda saklarken mutlaka şifreleme (AES-256) kullanın ve verileri asla açık metin olarak loglamayın.
Arka Planda Senkronizasyon ve Bildirimler
Kullanıcı uygulamayı kapattığında bile senkronizasyonun devam etmesi için flutter_background_service gibi paketler kullanılmalıdır. Ancak, işletim sistemlerinin arka plan kısıtlamalarına dikkat edilmelidir.
// Arka plan servisi başlatma örneği
final service = FlutterBackgroundService();
await service.configure(
androidConfiguration: AndroidConfiguration(
onStart: onStart,
autoStart: true,
isForegroundMode: true,
),
);
Bu yapı, uygulamanızın sistem tarafından öldürülmesini engellemek için bir "Foreground Service" (ön plan servisi) oluşturur.
Sıkça Sorulan Sorular
Bluetooth bağlantısı sürekli kopuyor, ne yapmalıyım?
Bağlantı kopmaları genellikle sinyal gücü veya cihazın uyku moduna girmesinden kaynaklanır. Bağlantı koptuğunda otomatik olarak yeniden bağlanma (reconnection) mantığını bir "exponential backoff" algoritması ile kurmalısınız.
Giyilebilir cihaz verisi çok büyük, nasıl yönetirim?
Büyük veri paketlerini küçük parçalara (chunks) bölerek gönderin ve her paketin ulaştığını onaylayan bir "ACK" (acknowledgment) mekanizması kurun.
Pil tüketimini nasıl minimize ederim?
Tarama süresini kısaltın ve mümkünse BLE "Connection Interval" değerlerini cihazın desteklediği en yüksek aralıkta tutarak veri trafiğini azaltın.
Veri güvenliğini nasıl sağlarım?
Cihaz ile telefon arasındaki bağlantıyı "Pairing" (eşleştirme) yaparak şifreleyin ve verileri iletirken TLS benzeri bir uygulama katmanı şifrelemesi kullanın.
Hangi cihazlar Flutter ile uyumludur?
BLE protokolünü destekleyen tüm giyilebilir cihazlar, standart GATT (Generic Attribute Profile) yapısını kullandıkları sürece Flutter ile uyumludur.
Performans Optimizasyonu ve Veri Akış Yönetimi
Giyilebilir cihazlardan gelen veri akışı, özellikle yüksek frekanslı sensör verilerinde (örneğin kalp atış hızı veya ivmeölçer verileri) uygulamanın ana iş parçacığını (UI Thread) yorabilir. Performansı korumak için veriyi doğrudan işlemek yerine bir StreamTransformer yapısı kullanarak veriyi filtrelemeli ve gruplandırmalısınız.
Veri Akışını Filtreleme
Gereksiz veri paketlerinin işlenmesini engellemek için debounce veya throttle mekanizmalarını kullanmak, pil tüketimini ve işlemci yükünü ciddi oranda düşürür. Aşağıdaki örnek, gelen veri akışını belirli bir süre aralığıyla sınırlandırmayı gösterir:
import 'dart:async';
// Gelen veriyi 500ms aralıklarla sınırla
final streamController = StreamController();
void setupDataStream() {
streamController.stream
.throttleTime(Duration(milliseconds: 500))
.listen((data) {
processSensorData(data);
});
}
void processSensorData(List data) {
// İşleme mantığı burada yer alır
print("Veri işlendi: $data");
}
İleri Seviye Hata Ayıklama ve Loglama
Bluetooth Low Energy (BLE) bağlantılarında yaşanan sorunlar genellikle cihazın durum değişimlerinden kaynaklanır. Uygulamanızın üretim aşamasında hata ayıklamasını kolaylaştırmak için, bağlantı durumlarını merkezi bir StateNotifier veya Bloc yapısı ile takip etmeniz önerilir.
Bağlantı Durumu İzleme
Bağlantı koptuğunda otomatik yeniden bağlanma (reconnection) stratejisi geliştirmek için cihazın connectionState değerini sürekli dinlemelisiniz:
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
void monitorConnection(BluetoothDevice device) {
device.connectionState.listen((BluetoothConnectionState state) {
switch (state) {
case BluetoothConnectionState.disconnected:
print("Bağlantı koptu, yeniden bağlanılıyor...");
device.connect();
break;
case BluetoothConnectionState.connected:
print("Cihaz bağlı.");
break;
default:
break;
}
});
}
Test Stratejileri
Giyilebilir cihazların donanımsal çeşitliliği nedeniyle, kodunuzu farklı cihaz gruplarında test etmek için şu yöntemleri izleyin:
- Mocking: Fiziksel cihazınızın olmadığı durumlarda
flutter_blue_pluskütüphanesini mock'layarak sanal veri paketleri oluşturun. - Integration Testing: Cihazın GATT servislerini ve karakteristiklerini doğrulamak için entegrasyon testleri yazın.
- Field Testing: Farklı işletim sistemi sürümlerine sahip cihazlarda (Android 10+, iOS 15+) Bluetooth izinlerinin ve arka plan servislerinin davranışlarını gözlemleyin.
İpucu: Android tarafındaAndroidManifest.xmldosyasındaBLUETOOTH_SCANveBLUETOOTH_CONNECTizinlerinin "neverForLocation" olarak işaretlenmesi, konum izni gereksinimini azaltarak kullanıcı deneyimini iyileştirebilir.
Sonuç
Flutter ve mobil ortamda giyilebilir cihaz veri senkronizasyonu, doğru kütüphaneler ve iyi optimize edilmiş bir mimari ile oldukça verimli bir şekilde gerçekleştirilebilir. Bu rehberde öğrendiğiniz tarama, bağlantı, veri işleme ve arka plan yönetimi adımları, profesyonel bir sağlık veya spor uygulaması geliştirmeniz için temel oluşturacaktır.
Sorumluluk Reddi: Bu makaledeki kod örnekleri eğitim amaçlıdır. Üretim ortamında veri güvenliği, şifreleme standartları ve kullanıcı gizliliği politikalarına (GDPR/KVKK) tam uyum sağlamak geliştiricinin sorumluluğundadır. Sağlık verileri kritik öneme sahiptir; bu tür verileri işlerken ilgili yasal mevzuatlara uygun hareket edin.
Bir sonraki adım olarak, senkronize ettiğiniz bu verileri bir bulut servisine (Firebase veya kendi API'niz) nasıl aktaracağınızı ve kullanıcıya anlamlı grafikler halinde nasıl sunacağınızı araştırmanızı öneririm.

Yorumlar (0)
Yorum Yaz