Tres componentes, un objetivo
Por dentro, Timmy está construido de forma bastante pragmática: Flutter para la app, WebRTC para el audio y el vídeo en tiempo real, y Firebase para la coordinación. No quería crear una plataforma enorme que lo hiciera pasar todo por la nube. Cada parte debe saber lo mínimo posible y, aun así, funcionar de forma fiable con las demás.
WebRTC: conexión directa y cifrada por defecto
WebRTC (Web Real-Time Communication) transporta el audio y el vídeo entre el dispositivo del bebé y el de los padres. En el mejor de los casos, los datos fluyen directamente entre los dos dispositivos, de igual a igual, sin ningún servidor multimedia de por medio.
Todas las conexiones WebRTC usan DTLS-SRTP por defecto. Si alguien captura paquetes de red, no obtiene audio ni vídeo inteligibles. Este cifrado forma parte del protocolo y no se puede desactivar sin más en WebRTC.
Para mí, ese era el punto importante: el audio y el vídeo de la habitación del bebé no deben acabar en mi servidor. Se quedan entre tus dispositivos.
Señalización mediante Firebase Firestore
Antes de que WebRTC pueda empezar, los dispositivos tienen que encontrarse y acordar cómo pueden conectarse. A esa parte se la llama señalización. Timmy usa Firebase Firestore, la base de datos en la nube de Google, para ello.
Solo se intercambian datos técnicos de conexión:
- Ofertas y respuestas SDP: Describen las capacidades de los dispositivos (códecs compatibles, resoluciones, etc.).
- Candidatos ICE: Posibles rutas de red por las que los dispositivos pueden comunicarse entre sí.
El audio y el vídeo no llegan a Firebase. Firestore solo transporta los datos técnicos de conexión. Timmy también cifra esta capa de señalización, para que Firestore no se convierta en un punto de encuentro en texto sin cifrar para SDP e ICE.
Servidores TURN: cuando la conexión directa no funciona
Algunas redes bloquean las conexiones directas, por ejemplo, cortafuegos estrictos o determinadas operadoras móviles. Entonces WebRTC necesita un relé TURN (Traversal Using Relays around NAT).
Timmy prueba primero el servidor TURN local y usa Cloudflare como alternativa cuando el relé local no está disponible o está sobrecargado. El relé reenvía paquetes cifrados. No recibe las claves del sonido ni del vídeo; el cifrado de WebRTC se mantiene intacto.
Las credenciales de TURN proceden de una función de Cloud Functions para Firebase y solo son válidas durante 24 horas. Las credenciales permanentes en una app de vigilabebés me parecerían demasiado arriesgadas.
Nearby Connections: los dispositivos se encuentran automáticamente
Para evitar pasos de configuración incómodos entre el dispositivo del bebé y el de los padres, Timmy utiliza Nearby Connections. Google ofrece esta capa de detección mediante Bluetooth y Wi‑Fi.
El emparejamiento automático en Timmy funciona sin introducir códigos manualmente: los dispositivos se detectan entre sí y encuentran el mismo punto de encuentro para el intercambio de claves. Si falla, hay un código de 4 caracteres que puedes escribir. El código de emparejamiento nunca sale del dispositivo; Firestore solo ve un hash criptográfico (SHA-256) como identificador del documento.
Autenticación anónima
Timmy usa la autenticación anónima de Firebase. Al abrir la app por primera vez, cada dispositivo recibe un ID temporal y anónimo. No hay cuenta, dirección de correo electrónico ni contraseña. El ID solo sirve para aplicar las reglas de Firestore: solo los dispositivos autenticados pueden leer o escribir datos de sesión.
La arquitectura: quién envía y quién recibe
Timmy tiene dos modos:
- Modo bebé (emisor): El dispositivo capta audio mediante el micrófono y lo envía al dispositivo de los padres a través de WebRTC. De forma opcional, se puede activar la cámara; el vídeo también se envía directamente.
- Modo parental (receptor): El dispositivo recibe audio y vídeo, muestra la transmisión de la cámara y ofrece la función «pulsar para hablar» para enviar mensajes de voz cortos al dispositivo del bebé.
Los controles, como «pulsar para hablar» y el encendido o apagado de la cámara, usan un DataChannel, otro canal de WebRTC que envía pequeños mensajes cifrados directamente entre los dispositivos.
¿Por qué Flutter?
Flutter es el framework de Google para crear apps en varias plataformas. Para Timmy, significa que puedo escribir gran parte de la lógica una sola vez y usarla en Android e iOS. Timmy está disponible en Android y la versión para iOS está a punto de publicarse. Menos código duplicado significa menos lugares donde pueden colarse errores.
Resumen
La regla técnica es sencilla: Timmy solo debe manejar los datos que realmente necesita. WebRTC protege el contenido multimedia, Firebase coordina la configuración de la conexión, TURN solo ve paquetes cifrados y Nearby Connections facilita el emparejamiento.
La buena tecnología pasa un poco desapercibida en el día a día. Funciona sin convertir la habitación del bebé en un proyecto en la nube.