Kolm ehituskivi, üks eesmärk
Kulisside taga on Timmy üles ehitatud üsna praktiliselt: Flutter rakenduse jaoks, WebRTC reaalajas heli ja video jaoks ning Firebase koordineerimiseks. Ma ei tahtnud ehitada tohutut platvormi, mis suunab kõik läbi pilve. Iga osa peaks teadma võimalikult vähe ja töötama siiski teistega usaldusväärselt koos.
WebRTC: otseühendus, vaikimisi krüptitud
WebRTC (Web Real-Time Communication) edastab heli ja video beebiseadme ning vanema seadme vahel. Parimal juhul liiguvad andmed otse kahe seadme vahel, võrdõigusvõrguna ja ilma meediaserverita nende vahel.
Iga WebRTC-ühendus kasutab vaikimisi DTLS-SRTP-d. Kui keegi võtab võrgupaketid kinni, ei saa ta neist loetavat heli ega videot. See krüptimine on protokolli osa ja seda ei saa WebRTC-s lihtsalt välja lülitada.
See oli minu jaoks oluline: lastetoa heli ja video ei kuulu minu serverisse. Need jäävad teie seadmete vahele.
Signaalivahetus Firebase Firestore'i kaudu
Enne kui WebRTC saab alustada, peavad seadmed teineteist leidma ja kokku leppima, kuidas nad saavad ühenduda. Seda osa nimetatakse signaalivahetuseks. Timmy kasutab selleks Google'i pilveandmebaasi Firebase Firestore.
Vahetatakse ainult tehnilisi ühendusandmeid:
- SDP-pakkumised ja -vastused: Kirjeldavad seadmete võimalusi (toetatud kodekid, eraldusvõimed jne).
- ICE-kandidaadid: Võimalikud võrguteed, mille kaudu seadmed üksteiseni jõuavad.
Heli ja video ei jõua Firebase'i. Firestore edastab ainult tehnilisi ühendusandmeid. Timmy krüptib ka selle signaalivahetuskihi, nii et Firestore'ist ei saa krüptimata SDP- ja ICE-andmete kohtumispaika.
TURN-serverid: kui otsetee ei tööta
Mõni võrk blokeerib otseühendusi, näiteks rangete tulemüüride või mõne mobiilioperaatori piirangute tõttu. Siis vajab WebRTC TURN-vahendust (Traversal Using Relays around NAT).
Timmy proovib esmalt kohalikku TURN-serverit ja kasutab varuvariandina Cloudflare'i, kui kohalik vahendusserver pole saadaval või on ülekoormatud. Vahendusserver edastab krüptitud pakette. See ei saa heli ega video krüptovõtmeid; WebRTC-krüptimine jääb puutumata.
TURN-i pääsuandmed pärinevad Firebase'i pilvefunktsioonist ja kehtivad ainult 24 tundi. Püsivad pääsuandmed beebimonitori rakenduses oleksid minu meelest liiga riskantsed.
Nearby Connections: seadmed leiavad teineteist automaatselt
Et vältida tüütuid seadistussamme beebiseadme ja vanema seadme vahel, kasutab Timmy Nearby Connectionsi. Google pakub seda seadmete leidmise kihti Bluetoothi ja Wi-Fi kaudu.
Automaatne sidumine Timmys toimib ilma koodi käsitsi sisestamata: seadmed leiavad teineteise ja võtmevahetuseks sama kohtumispunkti. Kui see ei õnnestu, saab sisestada 4-märgilise koodi. Sidumiskood ei lahku kunagi seadmest; Firestore näeb dokumendi identifikaatorina ainult krüptograafilist räsi (SHA-256).
Anonüümne autentimine
Timmy kasutab Firebase'i anonüümset autentimist. Esmakordsel käivitamisel saab iga seade ajutise anonüümse ID. Kontot, e-posti aadressi ega parooli pole. ID on olemas ainult Firestore'i reeglite jõustamiseks: seansiandmeid võivad lugeda või kirjutada vaid autenditud seadmed.
Arhitektuur: kes saadab, kes võtab vastu
Timmyl on kaks režiimi:
- Beebirežiim (saatja): Seade hõivab mikrofoniga heli ja saadab selle WebRTC kaudu vanema seadmesse. Soovi korral saab kaamera sisse lülitada; siis saadetakse otse ka video.
- Vanema režiim (vastuvõtja): Seade võtab vastu heli ja video, kuvab kaamerapilti ning pakub funktsiooni „Vajuta ja räägi“, mille abil saab lühidalt beebiseadmesse rääkida.
Juhtimiseks, näiteks funktsiooni „Vajuta ja räägi“ ning kaamera sisse- ja väljalülitamiseks, kasutatakse DataChannelit, mis on veel üks WebRTC kanal ja saadab väikseid krüptitud sõnumeid otse seadmete vahel.
Miks Flutter?
Flutter on Google'i raamistik rakenduste loomiseks mitmel platvormil. Timmy puhul tähendab see, et saan suure osa loogikast kirjutada üks kord ning kasutada seda Androidis ja iOS-is. Timmy on Androidis saadaval ning iOS-i versioon ilmub peagi. Vähem dubleeritud koodi tähendab vähem kohti, kuhu vead võivad sisse lipsata.
Kokkuvõte
Tehniline põhimõte on lihtne: Timmy peaks kasutama ainult neid andmeid, mida tal päriselt vaja on. WebRTC kaitseb meediat, Firebase koordineerib ühenduse loomist, TURN näeb vaid krüptitud pakette ning Nearby Connections muudab seadmete sidumise sujuvamaks.
Hea tehnoloogia jääb igapäevaelus peaaegu märkamatuks. See töötab, muutmata lastetuba pilveprojektiks.