Trei componente, un singur scop
În culise, Timmy este construit într-un mod destul de pragmatic: Flutter pentru aplicație, WebRTC pentru audio și video în timp real, și Firebase pentru coordonare. Nu am vrut să construiesc o platformă uriașă care trimite totul prin cloud. Fiecare componentă ar trebui să știe cât mai puțin posibil și totuși să funcționeze fiabil împreună cu celelalte.
WebRTC: conexiune directă, criptată implicit
WebRTC (Web Real-Time Communication) transmite audio și video între dispozitivul copilului și cel al părintelui. În scenariul ideal, datele circulă direct între cele două dispozitive, peer-to-peer, fără un server media între ele.
Fiecare conexiune WebRTC folosește implicit DTLS-SRTP. Dacă cineva interceptează pachetele de rețea, nu obține conținut audio sau video inteligibil. Această criptare face parte din protocol și nu poate fi pur și simplu dezactivată în WebRTC.
Pentru mine, acesta a fost punctul important: datele audio-video din camera copilului nu au ce căuta pe serverul meu. Ele rămân între dispozitivele voastre.
Semnalizare prin Firebase Firestore
Înainte ca WebRTC să poată porni, dispozitivele trebuie să se găsească și să negocieze cum se pot conecta. Această parte se numește semnalizare. Timmy folosește Firebase Firestore, baza de date cloud de la Google, pentru asta.
Sunt transmise doar date tehnice de conectare:
- Oferte și răspunsuri SDP: Descriu capacitățile dispozitivelor (codecuri acceptate, rezoluții etc.).
- Candidați ICE: Posibile rute de rețea prin care dispozitivele pot comunica între ele.
Datele audio și video nu ajung în Firebase. Firestore transportă doar datele tehnice de conectare. Timmy criptează și acest nivel de semnalizare, astfel încât Firestore să nu devină un punct în care datele SDP și ICE sunt expuse în clar.
Servere TURN: când calea directă nu funcționează
Unele rețele blochează conexiunile directe, de exemplu firewall-uri stricte sau anumiți operatori de telefonie mobilă. Atunci WebRTC are nevoie de un releu TURN (Traversal Using Relays around NAT).
Timmy încearcă mai întâi serverul TURN local și folosește Cloudflare ca soluție de rezervă atunci când releul local nu este disponibil sau este supraîncărcat. Releul redirecționează pachete criptate. Nu primește cheile pentru conținutul audio sau video, iar criptarea WebRTC rămâne intactă.
Datele de autentificare TURN provin dintr-o Firebase Cloud Function și sunt valabile doar 24 de ore. Pentru mine, folosirea unor date de autentificare permanente într-o aplicație de monitorizare pentru bebeluși ar fi prea riscantă.
Nearby Connections: dispozitivele se găsesc automat
Pentru a evita pașii de configurare incomozi între dispozitivul copilului și cel al părintelui, Timmy folosește Nearby Connections. Google oferă acest mecanism de descoperire prin Bluetooth și Wi‑Fi.
Asocierea automată în Timmy funcționează fără introducerea manuală a unui cod: dispozitivele se descoperă reciproc și găsesc același punct de întâlnire pentru schimbul de chei. Dacă nu reușește, există un cod din 4 caractere pe care îl poți introduce. Codul de asociere nu părăsește niciodată dispozitivul; Firestore vede doar un hash criptografic (SHA-256) ca identificator al documentului.
Autentificare anonimă
Timmy folosește Firebase Anonymous Authentication. La prima pornire, fiecare dispozitiv primește un ID temporar, anonim. Nu există cont, adresă de e-mail sau parolă. ID-ul există doar pentru a aplica regulile Firestore: numai dispozitivele autentificate pot citi sau scrie datele sesiunii.
Arhitectura: cine trimite, cine primește
Timmy are două moduri:
- Mod copil (expeditor): Dispozitivul captează sunetul prin microfon și îl trimite către dispozitivul părintelui prin WebRTC. Opțional, camera poate fi activată, iar fluxul video este transmis și el direct.
- Mod părinte (receptor): Dispozitivul primește conținut audio și video, afișează fluxul camerei și oferă funcția „apasă pentru a vorbi” pentru a trimite mesaje vocale scurte către dispozitivul copilului.
Comenzi precum „apasă pentru a vorbi” și pornirea sau oprirea camerei folosesc un DataChannel, un alt canal WebRTC care trimite direct între dispozitive mesaje mici, criptate.
De ce Flutter?
Flutter este frameworkul Google pentru aplicații pe mai multe platforme. Pentru Timmy, asta înseamnă că pot scrie o mare parte din logică o singură dată și o pot folosi pe Android și iOS. Timmy este disponibil pe Android, iar versiunea pentru iOS este aproape de lansare. Mai puțin cod duplicat înseamnă mai puține locuri în care se pot strecura erori.
Pe scurt
Regula tehnică este simplă: Timmy ar trebui să acceseze doar datele de care are cu adevărat nevoie. WebRTC protejează datele media, Firebase coordonează configurarea conexiunii, TURN vede doar pachete criptate, iar Nearby Connections simplifică asocierea.
Tehnologia bună se integrează discret în viața de zi cu zi. Funcționează fără să transforme camera copilului într-un proiect cloud.