Tres peces clau, un objectiu
Per dins, Timmy està construït d'una manera força pràctica: Flutter per a l'aplicació, WebRTC per a l'àudio i el vídeo en temps real, i Firebase per a la coordinació. No volia crear una plataforma enorme que fes passar-ho tot pel núvol. Cada part hauria de saber-ne el mínim possible i, alhora, funcionar de manera fiable amb les altres.
WebRTC: connexió directa, xifrada per defecte
WebRTC (Web Real-Time Communication) porta l'àudio i el vídeo entre el dispositiu del nadó i el dels pares. En el millor dels casos, les dades circulen directament entre els dos dispositius, de dispositiu a dispositiu, sense cap servidor multimèdia entremig.
Tota connexió WebRTC utilitza DTLS-SRTP per defecte. Si algú captura paquets de xarxa, no hi obté àudio ni vídeo llegibles. Aquest xifrat forma part del protocol i no es pot desactivar així com així a WebRTC.
Per a mi, aquest era el punt important: el contingut de l'habitació del nadó no ha de ser al meu servidor. Es queda entre els vostres dispositius.
Senyalització amb Firebase Firestore
Abans que WebRTC pugui començar, els dispositius s'han de trobar i negociar com es poden connectar. Aquesta part s'anomena senyalització. Timmy utilitza Firebase Firestore, la base de dades al núvol de Google, per fer-ho.
Només s'intercanvien dades tècniques de connexió:
- Ofertes i respostes SDP: Descriuen les capacitats dels dispositius (còdecs compatibles, resolucions, etc.).
- Candidats ICE: Possibles camins de xarxa pels quals els dispositius poden arribar l'un a l'altre.
L'àudio i el vídeo no arriben a Firebase. Firestore només transporta les dades tècniques de connexió. Timmy també xifra aquesta capa de senyalització, de manera que Firestore no es converteix en un punt de trobada en text clar per a SDP i ICE.
Servidors TURN: quan la ruta directa no funciona
Algunes xarxes bloquegen les connexions directes, per exemple els tallafocs estrictes o determinats operadors mòbils. Aleshores WebRTC necessita un relé TURN (Traversal Using Relays around NAT).
Timmy prova primer el servidor TURN local i fa servir Cloudflare com a alternativa quan el relé local no està disponible o està sobrecarregat. El relé reenvia paquets xifrats. No té les claus de l'àudio ni del vídeo; el xifrat de WebRTC es manté intacte.
Les credencials TURN provenen d'una Firebase Cloud Function i només són vàlides durant 24 hores. Les credencials permanents en una aplicació de vigilabebès em semblarien massa arriscades.
Nearby Connections: els dispositius es troben automàticament
Per evitar passos de configuració feixucs entre el dispositiu del nadó i el dels pares, Timmy utilitza Nearby Connections. Google proporciona aquesta capa de detecció mitjançant Bluetooth i Wi‑Fi.
L'aparellament automàtic a Timmy funciona sense introduir cap codi manualment: els dispositius es detecten i troben el mateix punt de trobada per a l'intercanvi de claus. Si falla, hi ha un codi de 4 caràcters que podeu escriure. El codi d'aparellament no surt mai del dispositiu; Firestore només veu un hash criptogràfic (SHA-256) com a identificador del document.
Autenticació anònima
Timmy utilitza Firebase Anonymous Authentication. En obrir l'aplicació per primer cop, cada dispositiu rep un identificador temporal i anònim. No hi ha cap compte, cap adreça electrònica ni cap contrasenya. L'identificador només serveix per aplicar les regles de Firestore: només els dispositius autenticats poden llegir o escriure dades de sessió.
L'arquitectura: qui envia i qui rep
Timmy té dos modes:
- Mode nadó (emissor): El dispositiu capta l'àudio amb el micròfon i l'envia al dispositiu dels pares mitjançant WebRTC. Opcionalment, es pot activar la càmera; aleshores el vídeo també s'envia directament.
- Mode pares (receptor): El dispositiu rep àudio i vídeo, mostra el senyal de la càmera i ofereix la funció prem per parlar per enviar missatges de veu curts al dispositiu del nadó.
Els controls com ara prémer per parlar i activar o desactivar la càmera utilitzen un DataChannel, un altre canal WebRTC que envia missatges petits xifrats directament entre dispositius.
Per què Flutter?
Flutter és el framework de Google per crear aplicacions per a diverses plataformes. Per a Timmy, això vol dir que puc escriure molta lògica una sola vegada i fer-la servir a Android i iOS. Timmy està disponible per a Android, i la versió per a iOS és a punt de publicar-se. Menys codi duplicat vol dir menys llocs on es poden colar errors.
Resum
La regla tècnica és simple: Timmy només ha de tocar les dades que realment necessita. WebRTC protegeix el contingut multimèdia, Firebase coordina la configuració de la connexió, TURN només veu paquets xifrats i Nearby Connections fa que l'aparellament sigui més fàcil.
La bona tecnologia es va integrant una mica en el dia a dia. Funciona sense convertir l'habitació del nadó en un projecte al núvol.