Três pilares, um objetivo
Nos bastidores, o Timmy foi desenvolvido de forma bastante pragmática: Flutter para a app, WebRTC para áudio e vídeo em tempo real, e Firebase para a coordenação. Não queria criar uma plataforma enorme que fizesse passar tudo pela nuvem. Cada parte deve saber o mínimo possível e, ainda assim, funcionar de forma fiável com as outras.
WebRTC: ligação direta, encriptada por predefinição
O WebRTC (Web Real-Time Communication) transmite áudio e vídeo entre o dispositivo do bebé e o dos pais. No melhor cenário, os dados fluem diretamente entre os dois dispositivos, ponto a ponto, sem qualquer servidor multimédia pelo meio.
Todas as ligações WebRTC usam DTLS-SRTP por predefinição. Se alguém intercetar pacotes de rede, não conseguirá obter áudio ou vídeo legíveis. Esta encriptação faz parte do protocolo e não pode simplesmente ser desativada no WebRTC.
Para mim, este era o ponto importante: os conteúdos multimédia do quarto do bebé não devem passar pelo meu servidor. Mantêm-se entre os seus dispositivos.
Sinalização através do Firebase Firestore
Antes de o WebRTC poder começar, os dispositivos têm de se encontrar e negociar a forma como se podem ligar. Esta parte chama-se sinalização. O Timmy usa o Firebase Firestore, a base de dados na nuvem da Google, para esse efeito.
Só são trocados dados técnicos da ligação:
- Ofertas e respostas SDP: Descrevem as capacidades dos dispositivos (codecs suportados, resoluções, etc.).
- Candidatos ICE: Possíveis caminhos de rede através dos quais os dispositivos conseguem chegar um ao outro.
O áudio e o vídeo não são enviados para o Firebase. O Firestore apenas transporta os dados técnicos da ligação. O Timmy também encripta esta camada de sinalização, para que o Firestore não se torne num ponto de encontro com dados SDP e ICE não encriptados.
Servidores TURN: quando a ligação direta não funciona
Algumas redes bloqueiam ligações diretas, por exemplo, firewalls rigorosas ou certas operadoras móveis. Nesse caso, o WebRTC precisa de um servidor de retransmissão TURN (Traversal Using Relays around NAT).
O Timmy tenta primeiro o servidor TURN local e usa a Cloudflare como alternativa quando esse servidor de retransmissão não está disponível ou está sobrecarregado. O servidor reencaminha pacotes encriptados. Não recebe as chaves do áudio nem do vídeo; a encriptação do WebRTC mantém-se intacta.
As credenciais TURN são fornecidas por uma Firebase Cloud Function e só são válidas durante 24 horas. Para mim, seria demasiado arriscado incluir credenciais permanentes numa app de monitorização de bebés.
Nearby Connections: os dispositivos encontram-se automaticamente
Para evitar passos de configuração complicados entre o dispositivo do bebé e o dos pais, o Timmy usa Nearby Connections. A Google disponibiliza esta camada de descoberta através de Bluetooth e Wi-Fi.
O emparelhamento automático no Timmy funciona sem ser necessário introduzir códigos manualmente: os dispositivos detetam-se e encontram o mesmo ponto de encontro para a troca de chaves. Se isso falhar, pode introduzir um código de 4 caracteres. O código de emparelhamento nunca sai do dispositivo; o Firestore só vê um hash criptográfico (SHA-256) como identificador do documento.
Autenticação anónima
O Timmy usa a autenticação anónima do Firebase. No primeiro arranque, cada dispositivo recebe um ID temporário e anónimo. Não existe conta, endereço de e-mail nem palavra-passe. O ID serve apenas para aplicar as regras do Firestore: só os dispositivos autenticados podem ler ou escrever dados da sessão.
A arquitetura: quem envia, quem recebe
O Timmy tem dois modos:
- Modo bebé (emissor): O dispositivo capta áudio através do microfone e envia-o para o dispositivo dos pais através do WebRTC. Opcionalmente, a câmara pode ser ativada; nesse caso, o vídeo também é enviado diretamente.
- Modo pais (recetor): O dispositivo recebe áudio e vídeo, mostra a transmissão da câmara e disponibiliza uma função de premir para falar, que permite enviar mensagens de voz curtas para o dispositivo do bebé.
Os controlos, como a função de premir para falar e a ativação ou desativação da câmara, usam um DataChannel, outro canal WebRTC que envia pequenas mensagens encriptadas diretamente entre os dispositivos.
Porquê Flutter?
O Flutter é a framework da Google para criar apps em várias plataformas. Para o Timmy, isto significa que posso escrever grande parte da lógica uma só vez e usá-la no Android e no iOS. O Timmy está disponível para Android e a versão para iOS está prestes a ser lançada. Menos código duplicado significa menos pontos onde podem surgir erros.
Resumo
A regra técnica é simples: o Timmy só deve aceder aos dados de que realmente precisa. O WebRTC protege os conteúdos multimédia, o Firebase coordena o estabelecimento da ligação, o TURN vê apenas pacotes encriptados e o Nearby Connections simplifica o emparelhamento.
A boa tecnologia passa um pouco despercebida no dia a dia. Funciona sem transformar o quarto do bebé num projeto alojado na nuvem.