Üç Yapı Taşı, Tek Amaç
Timmy'nin altyapısı oldukça pratik bir şekilde kuruldu: Flutter uygulama için, WebRTC gerçek zamanlı ses ve görüntü için, Firebase koordinasyon için kullanılıyor. Her şeyi bulut üzerinden geçiren devasa bir platform kurmak istemedim. Her parça mümkün olduğunca az şey bilmeli, ama diğerleriyle yine de güvenilir şekilde çalışmalıydı.
WebRTC: Doğrudan Bağlantı, Varsayılan Olarak Şifreli
WebRTC (Web Real-Time Communication), bebek ve ebeveyn cihazları arasında ses ve görüntüyü taşır. En ideal durumda veriler iki cihaz arasında doğrudan, yani eşler arası akar; arada bir medya sunucusu olmaz.
Her WebRTC bağlantısı varsayılan olarak DTLS-SRTP kullanır. Biri ağ paketlerini ele geçirse bile okunabilir ses veya görüntü elde edemez. Bu şifreleme protokolün bir parçasıdır ve WebRTC'de öylece kapatılamaz.
Benim için önemli nokta buydu: Bebek odasındaki ses ve görüntünün sunucumda yeri yok. Bunlar cihazlarınız arasında kalır.
Firebase Firestore ile Sinyalleşme
WebRTC başlamadan önce cihazların birbirini bulması ve nasıl bağlanabileceklerini belirlemesi gerekir. Bu bölüme sinyalleşme denir. Timmy bunun için Google'ın bulut veritabanı Firebase Firestore'u kullanır.
Yalnızca teknik bağlantı verileri paylaşılır:
- SDP teklifleri ve yanıtları: Cihazların özelliklerini (desteklenen kodekler, çözünürlükler vb.) açıklar.
- ICE adayları: Cihazların birbirine ulaşabileceği olası ağ yolları.
Ses ve görüntü Firebase'e ulaşmaz. Firestore yalnızca teknik bağlantı verilerini taşır. Timmy bu sinyalleşme katmanını da şifreler; böylece Firestore, SDP ve ICE için açık metin bir buluşma noktası olmaz.
TURN Sunucuları: Doğrudan Yol Çalışmadığında
Bazı ağlar doğrudan bağlantıları engeller; örneğin katı güvenlik duvarları veya bazı mobil operatörler. Böyle durumlarda WebRTC'nin bir TURN aktarıcısına (NAT çevresinde aktarıcılar kullanarak geçiş) ihtiyacı olur.
Timmy önce yerel TURN sunucusunu dener; yerel aktarıcı kullanılamıyorsa veya aşırı yüklüyse yedek olarak Cloudflare'i kullanır. Aktarıcı şifreli paketleri iletir. Ses veya görüntü için anahtarlara erişemez; WebRTC şifrelemesi korunur.
TURN kimlik bilgileri bir Firebase Cloud Function'dan gelir ve yalnızca 24 saat geçerlidir. Bir bebek telsizi uygulamasında kalıcı kimlik bilgileri benim için gereğinden fazla riskli olurdu.
Nearby Connections: Cihazlar Birbirini Otomatik Olarak Bulur
Bebek ve ebeveyn cihazı arasında uğraştırıcı kurulum adımlarını önlemek için Timmy Nearby Connections özelliğini kullanır. Google bu keşif katmanını Bluetooth ve Wi-Fi üzerinden sunar.
Timmy'de otomatik eşleştirme manuel olarak kod girmeden çalışır: cihazlar birbirini keşfeder ve anahtar değişimi için aynı buluşma noktasını bulur. Bu başarısız olursa girebileceğiniz 4 karakterli bir kod vardır. Eşleştirme kodu asla cihazdan çıkmaz; Firestore belge tanımlayıcısı olarak yalnızca kriptografik bir özet (SHA-256) görür.
Anonim Kimlik Doğrulama
Timmy, Firebase Anonim Kimlik Doğrulama'yı kullanır. İlk açılışta her cihaza geçici, anonim bir kimlik verilir. Hesap, e-posta adresi veya şifre yoktur. Bu kimlik yalnızca Firestore kurallarını uygulamak içindir: sadece kimliği doğrulanmış cihazlar oturum verilerini okuyabilir veya yazabilir.
Mimari: Kim Gönderir, Kim Alır
Timmy'nin iki modu vardır:
- Bebek Modu (gönderen): Cihaz mikrofonla sesi alır ve WebRTC üzerinden ebeveyn cihazına gönderir. İsteğe bağlı olarak kamera açılabilir; görüntü de doğrudan gönderilir.
- Ebeveyn Modu (alıcı): Cihaz ses ve görüntüyü alır, kamera akışını gösterir ve bebek cihazına kısa sesli mesajlar göndermek için bas-konuş özelliği sunar.
Bas-konuş ve kamera açma/kapatma gibi kontroller bir DataChannel kullanır; bu, cihazlar arasında küçük şifreli mesajları doğrudan gönderen başka bir WebRTC kanalıdır.
Neden Flutter?
Flutter, Google'ın birden fazla platformda uygulama geliştirmeye yönelik çerçevesidir. Timmy için bu, mantığın büyük kısmını bir kez yazıp Android ve iOS'ta kullanabilmem anlamına geliyor. Timmy Android'de kullanılabiliyor ve iOS sürümü yayınlanmaya çok yakın. Kod tekrarının azalması, hataların ortaya çıkabileceği yerlerin de azalması demektir.
Özet
Teknik kural basit: Timmy yalnızca gerçekten ihtiyaç duyduğu verilere dokunmalı. WebRTC medyayı korur, Firebase bağlantı kurulumunu koordine eder, TURN yalnızca şifreli paketleri görür ve Nearby Connections eşleştirmedeki zahmeti ortadan kaldırır.
İyi teknoloji günlük hayatta arka planda kalır. Bebek odasını bir bulut projesine çevirmeden çalışır.