Flutter & Mobil İle Giyilebilir Cihaz Veri Senkronizasyonu Nasıl Yapılır?

Flutter & Mobil İle Giyilebilir Cihaz Veri Senkronizasyonu Nasıl Yapılır?
Flutter & Mobil İle Giyilebilir Cihaz Veri Senkronizasyonu Nasıl Yapılır?

Ö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_plus kü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ında AndroidManifest.xml dosyasında BLUETOOTH_SCAN ve BLUETOOTH_CONNECT izinlerinin "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.

Bu yazıya tepkinizi paylaşın:
Selin Korkmaz

Kendin yap (DIY) projeleri ve evde pratik tamirat üzerine uzmanım. Detaylı rehberlerimle herkesin teknik becerilerini geliştirmesini amaçlıyorum.

Yorumlar (0)

Yorum Yaz