Üç əsas hissə, bir məqsəd
Timmy-nin içində hər şey olduqca praktik şəkildə qurulub: Flutter tətbiq üçün, WebRTC real vaxtda səs və video üçün və Firebase əlaqələndirmə üçün. Hər şeyi bulud üzərindən keçirən nəhəng bir platforma qurmaq istəmirdim. Hər hissə mümkün qədər az məlumat bilməli, amma digərləri ilə etibarlı işləməlidir.
WebRTC: birbaşa bağlantı, standart olaraq şifrələnmiş
WebRTC (Web Real-Time Communication) körpə və valideyn cihazları arasında səs və videonu ötürür. Ən yaxşı halda məlumatlar birbaşa iki cihaz arasında, peer-to-peer şəkildə, arada media serveri olmadan axır.
Hər WebRTC bağlantısında standart olaraq DTLS-SRTP istifadə edilir. Kimsə şəbəkə paketlərini ələ keçirsə, oxuna bilən səs və ya video əldə etmir. Bu şifrələmə protokolun bir hissəsidir və WebRTC-də sadəcə söndürülə bilməz.
Mənim üçün əsas məqam bu idi: uşaq otağındakı media məlumatları mənim serverimə aid deyil. Onlar cihazlarınız arasında qalır.
Firebase Firestore ilə Siqnallaşma
WebRTC başlamazdan əvvəl cihazlar bir-birini tapmalı və necə qoşula biləcəklərini razılaşdırmalıdır. Bu hissə siqnallaşma adlanır. Timmy bunun üçün Google-un bulud verilənlər bazası olan Firebase Firestore-dan istifadə edir.
Yalnız texniki bağlantı məlumatları paylaşılır:
- SDP təklifləri və cavabları: Cihazların imkanlarını təsvir edir (dəstəklənən kodeklər, qətnamələr və s.).
- ICE namizədləri: Cihazların bir-birinə çata biləcəyi mümkün şəbəkə yolları.
Səs və video Firebase-ə düşmür. Firestore yalnız texniki bağlantı məlumatlarını ötürür. Timmy bu siqnallaşma qatını da şifrələyir, beləliklə Firestore SDP və ICE üçün açıq mətnli görüş nöqtəsinə çevrilmir.
TURN Serverləri: Birbaşa Yol İşləməyəndə
Bəzi şəbəkələr birbaşa bağlantıları bloklayır, məsələn, sərt təhlükəsizlik divarları və ya bəzi mobil operatorlar. Bu zaman WebRTC-yə TURN releysi (Traversal Using Relays around NAT) lazımdır.
Timmy əvvəlcə yerli TURN serverini yoxlayır, yerli rele əlçatmaz və ya yüklənmiş olduqda isə ehtiyat variant kimi Cloudflare-dən istifadə edir. Rele şifrələnmiş paketləri yönləndirir. Səs və ya video üçün açarları əldə etmir; WebRTC şifrələnməsi qüvvədə qalır.
TURN giriş məlumatları Firebase Cloud Function-dan gəlir və cəmi 24 saat etibarlıdır. Körpə monitoru tətbiqində daimi giriş məlumatları məncə həddindən artıq riskli olardı.
Yaxınlıqdakı Bağlantılar: Cihazlar Bir-birini Avtomatik Tapır
Körpə və valideyn cihazları arasında çətin quraşdırma addımlarının qarşısını almaq üçün Timmy Nearby Connections istifadə edir. Google bu aşkarlama qatını Bluetooth və WiFi üzərindən təmin edir.
Timmy-də avtomatik qoşalaşdırma əl ilə kod daxil etmədən işləyir: cihazlar bir-birini tapır və açar mübadiləsi üçün eyni görüş nöqtəsini müəyyən edir. Bu alınmasa, daxil edə biləcəyiniz 4 simvollu kod var. Qoşalaşdırma kodu heç vaxt cihazdan çıxmır; Firestore sənəd identifikatoru kimi yalnız kriptoqrafik heş (SHA-256) görür.
Anonim Doğrulama
Timmy Firebase Anonymous Authentication-dan istifadə edir. İlk açılışda hər cihaz müvəqqəti, anonim ID alır. Hesab, e-poçt ünvanı və parol yoxdur. ID yalnız Firestore qaydalarını tətbiq etmək üçündür: sessiya məlumatlarını yalnız doğrulanmış cihazlar oxuya və yaza bilər.
Arxitektura: Kim Göndərir, Kim Qəbul Edir
Timmy-nin iki rejimi var:
- Körpə rejimi (göndərən): Cihaz mikrofon vasitəsilə səsi qəbul edir və WebRTC ilə valideyn cihazına göndərir. İstəyə görə kamera da aktivləşdirilə bilər; video da birbaşa göndərilir.
- Valideyn rejimi (qəbul edən): Cihaz səs və videonu qəbul edir, kamera görüntüsünü göstərir və körpə cihazına qısa səsli mesajlar göndərmək üçün basıb-danışma funksiyası təqdim edir.
Basıb-danışma və kameranı açıb-söndürmə kimi idarəetmələr DataChannel adlı başqa bir WebRTC kanalı ilə işləyir; bu kanal kiçik şifrələnmiş mesajları birbaşa cihazlar arasında göndərir.
Niyə Flutter?
Flutter Google-un müxtəlif platformalar üçün tətbiq çərçivəsidir. Timmy üçün bu o deməkdir ki, məntiqin böyük hissəsini bir dəfə yazıb həm Android, həm də iOS-da istifadə edə bilirəm. Timmy Android-də əlçatandır, iOS versiyasının buraxılışı isə yaxındır. Təkrarlanan kodun az olması xətaların yarana biləcəyi yerləri də azaldır.
Xülasə
Texniki qayda sadədir: Timmy yalnız həqiqətən ehtiyacı olan məlumatlara toxunmalıdır. WebRTC medianı qoruyur, Firebase bağlantının qurulmasını əlaqələndirir, TURN yalnız şifrələnmiş paketləri görür, Nearby Connections isə qoşalaşdırmanı sadələşdirir.
Yaxşı texnologiya gündəlik həyatda bir qədər görünməz olur. Uşaq otağını bulud layihəsinə çevirmədən işləyir.