Tri sastavna dijela, jedan cilj
Ispod haube, Timmy je napravljen prilično praktično: Flutter za aplikaciju, WebRTC za zvuk i video u stvarnom vremenu te Firebase za koordinaciju. Nisam htio graditi golemu platformu koja sve gura kroz oblak. Svaki dio trebao bi znati što je moguće manje, a i dalje pouzdano raditi s ostalima.
WebRTC: izravna veza, šifrirana prema zadanim postavkama
WebRTC (Web Real-Time Communication) prenosi zvuk i video između uređaja za bebu i roditelja. U najboljem slučaju podaci teku izravno između dva uređaja, ravnopravno, bez poslužitelja za medijske sadržaje između njih.
Svaka WebRTC veza prema zadanim postavkama koristi DTLS-SRTP. Ako netko presretne mrežne pakete, neće dobiti čitljiv zvuk ni video. Ta je enkripcija dio protokola i u WebRTC-u se ne može jednostavno isključiti.
To mi je bilo najvažnije: sadržaju iz dječje sobe nije mjesto na mom poslužitelju. Ostaje između vaših uređaja.
Signalizacija putem Firebase Firestorea
Prije nego što WebRTC može početi, uređaji se moraju pronaći i dogovoriti kako se mogu povezati. Taj se dio naziva signalizacija. Timmy za to koristi Firebase Firestore, Googleovu bazu podataka u oblaku.
Razmjenjuju se samo tehnički podaci o vezi:
- SDP ponude i odgovori: Opisuju mogućnosti uređaja (podržani kodeci, rezolucije itd.).
- ICE kandidati: Mogući mrežni putevi kojima uređaji mogu doći jedan do drugoga.
Zvuk i video ne završavaju u Firebaseu. Firestore prenosi samo tehničke podatke o vezi. Timmy šifrira i taj sloj signalizacije, tako da Firestore ne postane mjesto gdje su SDP i ICE podaci dostupni u čitljivom obliku.
TURN poslužitelji: kad izravna veza ne radi
Neke mreže blokiraju izravne veze, primjerice strogi vatrozidi ili određeni mobilni operateri. Tada WebRTC treba TURN relej (Traversal Using Relays around NAT).
Timmy najprije pokušava s lokalnim TURN poslužiteljem, a Cloudflare koristi kao rezervnu opciju kada lokalni relej nije dostupan ili je preopterećen. Relej prosljeđuje šifrirane pakete. Nema ključeve za zvuk ni video; WebRTC enkripcija ostaje netaknuta.
TURN vjerodajnice dolaze iz Firebase Cloud Functiona i vrijede samo 24 sata. Trajne vjerodajnice u aplikaciji za nadzor bebe bile bi, po mom mišljenju, prevelik rizik.
Nearby Connections: uređaji se automatski pronalaze
Kako bi se izbjegli nezgrapni koraci postavljanja između uređaja za bebu i roditelja, Timmy koristi Nearby Connections. Google pruža taj sloj za otkrivanje putem Bluetootha i Wi-Fija.
Automatsko uparivanje u Timmyju radi bez ručnog unosa koda: uređaji se pronađu i nađu isto mjesto za razmjenu ključeva. Ako to ne uspije, postoji kod od 4 znaka koji možete upisati. Kod za uparivanje nikada ne napušta uređaj; Firestore vidi samo kriptografski sažetak (SHA-256) kao identifikator dokumenta.
Anonimna autentifikacija
Timmy koristi Firebase Anonymous Authentication. Pri prvom pokretanju svaki uređaj dobiva privremeni, anonimni ID. Nema računa, e-adrese ni lozinke. ID služi samo za provedbu pravila Firestorea: samo autentificirani uređaji smiju čitati ili zapisivati podatke o sesiji.
Arhitektura: tko šalje, a tko prima
Timmy ima dva načina rada:
- Način rada za bebu (pošiljatelj): Uređaj snima zvuk mikrofonom i šalje ga roditeljskom uređaju putem WebRTC-a. Po želji se može uključiti kamera; video se tada također šalje izravno.
- Način rada za roditelje (primatelj): Uređaj prima zvuk i video, prikazuje snimku kamere te nudi push-to-talk za kratke glasovne poruke uređaju za bebu.
Kontrole poput push-to-talka i uključivanja/isključivanja kamere koriste DataChannel, još jedan WebRTC kanal koji izravno između uređaja šalje male šifrirane poruke.
Zašto Flutter?
Flutter je Googleov okvir za izradu aplikacija na više platformi. Za Timmy to znači da velik dio logike mogu napisati jednom i koristiti na Androidu i iOS-u. Timmy je dostupan na Androidu, a verzija za iOS uskoro izlazi. Manje dupliciranog koda znači manje mjesta na kojima se mogu potkrasti greške.
Sažetak
Tehničko je pravilo jednostavno: Timmy bi trebao obrađivati samo podatke koji mu zaista trebaju. WebRTC štiti medijske sadržaje, Firebase koordinira uspostavljanje veze, TURN vidi samo šifrirane pakete, a Nearby Connections pojednostavljuje uparivanje.
Dobra tehnologija pomalo nestaje u svakodnevnom životu. Radi bez pretvaranja dječje sobe u projekt u oblaku.