Trije gradniki, en cilj
V ozadju je Timmy zgrajen precej pragmatično: Flutter za aplikacijo, WebRTC za zvok in sliko v realnem času ter Firebase za usklajevanje. Nisem želel zgraditi ogromne platforme, ki bi vse pošiljala skozi oblak. Vsak del naj ve čim manj, hkrati pa naj z drugimi zanesljivo deluje.
WebRTC: neposredna povezava, privzeto šifrirana
WebRTC (Web Real-Time Communication) prenaša zvok in sliko med napravo pri otroku in napravo starša. V najboljšem primeru podatki potujejo neposredno med napravama, po načelu enakovrednih naprav (peer-to-peer), brez vmesnega medijskega strežnika.
Vsaka povezava WebRTC privzeto uporablja DTLS-SRTP. Če nekdo prestreže omrežne pakete, iz njih ne more razbrati zvoka ali slike. To šifriranje je del protokola in ga v WebRTC ni mogoče kar izklopiti.
To je bilo zame ključno: zvok in slika iz otroške sobe ne sodita na moj strežnik. Ostajata med vašima napravama.
Signalizacija prek Firebase Firestore
Preden se lahko WebRTC zažene, se morata napravi najti in dogovoriti, kako se bosta povezali. Ta del se imenuje signalizacija. Timmy za to uporablja Firebase Firestore, Googlovo podatkovno zbirko v oblaku.
Izmenjajo se samo tehnični podatki o povezavi:
- Ponudbe in odgovori SDP: Opišejo zmogljivosti naprav (podprte kodeke, ločljivosti itd.).
- Kandidati ICE: Možne omrežne poti, po katerih se napravi lahko dosežeta.
Zvok in slika ne končata v storitvi Firebase. Firestore prenaša samo tehnične podatke o povezavi. Timmy šifrira tudi to signalizacijsko plast, zato Firestore ne postane stičišče za nešifrirane podatke SDP in ICE.
Strežniki TURN: ko neposredna pot ne deluje
Nekatera omrežja blokirajo neposredne povezave, na primer strogi požarni zidovi ali nekateri mobilni operaterji. Takrat WebRTC potrebuje posredovalni strežnik TURN (Traversal Using Relays around NAT).
Timmy najprej poskusi z lokalnim strežnikom TURN, kadar ta ni dosegljiv ali je preobremenjen, pa kot rezervno možnost uporabi Cloudflare. Posredovalni strežnik posreduje šifrirane pakete. Ne prejme ključev za zvok ali sliko; šifriranje WebRTC ostane nedotaknjeno.
Poverilnice TURN se pridobijo prek funkcije Firebase Cloud Function in veljajo samo 24 ur. Stalne poverilnice v aplikaciji za elektronsko varuško bi bile zame preveč tvegane.
Nearby Connections: napravi se najdeta samodejno
Da bi se izognili nerodnim korakom pri nastavitvi med napravo pri otroku in napravo starša, Timmy uporablja Nearby Connections. Google zagotavlja to plast za odkrivanje prek povezav Bluetooth in Wi‑Fi.
Samodejno seznanjanje v Timmyju deluje brez ročnega vnosa kode: napravi se samodejno zaznata in poiščeta isto stičišče za izmenjavo ključev. Če to ne uspe, lahko vnesete 4-znakovno kodo. Koda za seznanjanje nikoli ne zapusti naprave; Firestore kot identifikator dokumenta vidi samo kriptografsko zgoščeno vrednost (SHA-256).
Anonimna avtentikacija
Timmy uporablja Firebase Anonymous Authentication. Ob prvem zagonu vsaka naprava dobi začasni anonimni ID. Ni računa, e-poštnega naslova niti gesla. ID obstaja le zato, da se uveljavijo pravila Firestore: podatke seje lahko berejo ali zapisujejo samo avtenticirane naprave.
Arhitektura: kdo pošilja, kdo prejema
Timmy ima dva načina:
- Način za otroka (pošiljatelj): Naprava zajema zvok z mikrofonom in ga prek WebRTC pošlje napravi starša. Po želji lahko vklopite kamero; tudi slika se nato pošlje neposredno.
- Način za starša (prejemnik): Naprava prejema zvok in sliko, prikazuje sliko kamere ter omogoča funkcijo »pritisni za govor« za pošiljanje kratkih glasovnih sporočil napravi pri otroku.
Funkciji »pritisni za govor« in vklop/izklop kamere uporabljata DataChannel, še en kanal WebRTC, ki neposredno med napravama pošilja majhna šifrirana sporočila.
Zakaj Flutter?
Flutter je Googlovo ogrodje za razvoj aplikacij za več platform. Za Timmy to pomeni, da lahko velik del programske logike napišem enkrat in ga uporabim za Android in iOS. Timmy je na voljo za Android, različica za iOS pa je tik pred izidom. Manj podvojene kode pomeni manj mest, kjer se lahko prikradejo napake.
Povzetek
Tehnično pravilo je preprosto: Timmy naj obdeluje samo podatke, ki jih zares potrebuje. WebRTC varuje medijske podatke, Firebase usklajuje vzpostavitev povezave, TURN vidi le šifrirane pakete, Nearby Connections pa poenostavi seznanjanje.
Dobra tehnologija se nekoliko zlije z vsakdanom. Deluje, ne da bi otroško sobo spremenila v projekt v oblaku.