Tre elementi, un unico obiettivo
Dietro le quinte, Timmy è costruito in modo piuttosto pragmatico: Flutter per l'app, WebRTC per l'audio e il video in tempo reale, e Firebase per il coordinamento. Non volevo creare una piattaforma enorme che fa passare tutto attraverso il cloud. Ogni componente deve sapere il meno possibile e funzionare comunque in modo affidabile con gli altri.
WebRTC: connessione diretta, crittografata per impostazione predefinita
WebRTC (Web Real-Time Communication) trasporta audio e video tra il dispositivo del bambino e quello del genitore. Nella situazione migliore, i dati fluiscono direttamente tra i due dispositivi, con una connessione peer-to-peer e senza alcun server multimediale intermedio.
Ogni connessione WebRTC usa DTLS-SRTP per impostazione predefinita. Se qualcuno intercetta i pacchetti di rete, non ottiene audio o video leggibili. Questa crittografia fa parte del protocollo e in WebRTC non può essere semplicemente disattivata.
Per me questo era il punto fondamentale: i dati audio e video della cameretta non devono finire sul mio server. Restano tra i tuoi dispositivi.
Segnalazione tramite Firebase Firestore
Prima che WebRTC possa avviarsi, i dispositivi devono trovarsi e accordarsi su come connettersi. Questa parte si chiama segnalazione. Timmy usa Firebase Firestore, il database cloud di Google, per questo scopo.
Vengono scambiati solo dati tecnici di connessione:
- Offerte e risposte SDP: Descrivono le capacità dei dispositivi (codec supportati, risoluzioni ecc.).
- Candidati ICE: Possibili percorsi di rete attraverso cui i dispositivi possono raggiungersi.
Audio e video non finiscono in Firebase. Firestore trasporta solo i dati tecnici di connessione. Timmy crittografa anche questo livello di segnalazione, così Firestore non diventa un punto di incontro in chiaro per SDP e ICE.
Server TURN: quando il percorso diretto non funziona
Alcune reti bloccano le connessioni dirette, ad esempio firewall rigidi o alcuni operatori mobili. In questi casi WebRTC ha bisogno di un relay TURN (Traversal Using Relays around NAT).
Timmy prova prima il server TURN locale e usa Cloudflare come alternativa quando il relay locale non è disponibile o è sovraccarico. Il relay inoltra pacchetti crittografati. Non riceve le chiavi per audio o video; la crittografia WebRTC resta intatta.
Le credenziali TURN provengono da una Firebase Cloud Function e sono valide solo per 24 ore. Delle credenziali permanenti in un'app baby monitor sarebbero troppo rischiose, per i miei gusti.
Nearby Connections: i dispositivi si trovano automaticamente
Per evitare procedure di configurazione scomode tra il dispositivo del bambino e quello del genitore, Timmy usa Nearby Connections. Google fornisce questo livello di rilevamento tramite Bluetooth e Wi‑Fi.
L'abbinamento automatico in Timmy funziona senza inserire manualmente un codice: i dispositivi si trovano e individuano lo stesso punto di incontro per lo scambio delle chiavi. Se non funziona, puoi inserire un codice di 4 caratteri. Il codice di abbinamento non lascia mai il dispositivo; Firestore vede solo un hash crittografico (SHA-256) come identificatore del documento.
Autenticazione anonima
Timmy usa Firebase Anonymous Authentication. Al primo avvio, ogni dispositivo riceve un ID temporaneo e anonimo. Non c'è alcun account, indirizzo email o password. L'ID serve solo ad applicare le regole di Firestore: solo i dispositivi autenticati possono leggere o scrivere i dati della sessione.
L'architettura: chi invia e chi riceve
Timmy ha due modalità:
- Modalità bambino (mittente): Il dispositivo acquisisce l'audio dal microfono e lo invia al dispositivo del genitore tramite WebRTC. Facoltativamente, si può attivare la fotocamera; anche il video viene quindi inviato direttamente.
- Modalità genitore (ricevente): Il dispositivo riceve audio e video, mostra il flusso della fotocamera e offre la funzione push-to-talk per inviare brevi messaggi vocali al dispositivo del bambino.
I comandi, come il push-to-talk e l'attivazione o disattivazione della fotocamera, utilizzano un DataChannel, un altro canale WebRTC che invia piccoli messaggi crittografati direttamente tra i dispositivi.
Perché Flutter?
Flutter è il framework di Google per app su più piattaforme. Per Timmy, significa che posso scrivere gran parte della logica una sola volta e usarla su Android e iOS. Timmy è disponibile su Android e la versione iOS è quasi pronta per il rilascio. Meno codice duplicato significa meno punti in cui possono insinuarsi bug.
In sintesi
La regola tecnica è semplice: Timmy dovrebbe gestire solo i dati di cui ha davvero bisogno. WebRTC protegge i contenuti multimediali, Firebase coordina la configurazione della connessione, TURN vede solo pacchetti crittografati e Nearby Connections rende l'abbinamento più semplice.
La buona tecnologia sa quasi scomparire nella vita quotidiana. Funziona senza trasformare la cameretta in un progetto nel cloud.