Trys pagrindiniai elementai, vienas tikslas
Timmy sukurtas gana pragmatiškai: Flutter programėlei, WebRTC garso ir vaizdo perdavimui realiuoju laiku bei Firebase koordinavimui. Nenorėjau kurti didžiulės platformos, kuri viską perduoda per debesiją. Kiekviena dalis turėtų žinoti kuo mažiau ir vis tiek patikimai veikti su kitomis.
WebRTC: tiesioginis ryšys ir numatytasis šifravimas
WebRTC („Web Real-Time Communication“) perduoda garsą ir vaizdą tarp kūdikio ir tėvų įrenginių. Geriausiu atveju duomenys keliauja tiesiogiai tarp abiejų įrenginių, lygiarangiu ryšiu, be tarpinio medijos serverio.
Kiekvienam WebRTC ryšiui pagal numatytuosius nustatymus naudojamas DTLS-SRTP. Jei kas nors perimtų tinklo paketus, iš jų negautų įskaitomo garso ar vaizdo. Šifravimas yra protokolo dalis, todėl WebRTC jo negalima tiesiog išjungti.
Man tai buvo svarbiausia: vaiko kambario garso ir vaizdo duomenys neturi patekti į mano serverį. Jie perduodami tik tarp jūsų įrenginių.
Signalizavimas per Firebase Firestore
Prieš pradedant veikti WebRTC, įrenginiai turi rasti vienas kitą ir susitarti, kaip galės prisijungti. Ši dalis vadinama signalizavimu. Tam Timmy naudoja „Google“ debesijos duomenų bazę Firebase Firestore.
Keičiamasi tik techniniais ryšio duomenimis:
- SDP pasiūlymais ir atsakymais: Juose aprašomos įrenginių galimybės (palaikomi kodekai, raiška ir kt.).
- ICE kandidatais: Galimi tinklo keliai, kuriais įrenginiai gali pasiekti vienas kitą.
Garsas ir vaizdas nepatenka į Firebase. Firestore perduoda tik techninius ryšio duomenis. Timmy taip pat šifruoja šį signalizavimo sluoksnį, todėl SDP ir ICE duomenys Firestore nėra laikomi nešifruotu pavidalu.
TURN serveriai: kai tiesioginis kelias neveikia
Kai kurie tinklai blokuoja tiesioginius ryšius, pavyzdžiui, griežtos užkardos ar tam tikri mobiliojo ryšio operatoriai. Tuomet WebRTC reikia TURN tarpinio serverio („Traversal Using Relays around NAT“).
Timmy pirmiausia bando naudoti vietinį TURN serverį, o jei jis nepasiekiamas arba perkrautas, kaip atsarginį variantą naudoja Cloudflare. Tarpinis serveris persiunčia šifruotus paketus. Jis negauna garso ar vaizdo šifravimo raktų, todėl WebRTC šifravimas išlieka nepažeistas.
TURN prisijungimo duomenys gaunami iš Firebase Cloud Function ir galioja tik 24 valandas. Nuolatiniai prisijungimo duomenys kūdikio stebėjimo programėlėje man atrodo pernelyg rizikingi.
Nearby Connections: įrenginiai vienas kitą randa automatiškai
Kad kūdikio ir tėvų įrenginius būtų galima sujungti be nepatogių nustatymo veiksmų, Timmy naudoja Nearby Connections. „Google“ šį aptikimo sluoksnį teikia per Bluetooth ir Wi‑Fi.
Automatinis susiejimas Timmy programėlėje veikia neįvedant kodo ranka: įrenginiai aptinka vienas kitą ir prisijungia prie to paties raktų mainų taško. Jei to padaryti nepavyksta, galite įvesti 4 simbolių kodą. Susiejimo kodas niekada nepalieka įrenginio; Firestore kaip dokumento identifikatorių mato tik kriptografinę maišos reikšmę (SHA-256).
Anoniminis autentifikavimas
Timmy naudoja Firebase anoniminį autentifikavimą. Pirmą kartą paleidus programėlę kiekvienas įrenginys gauna laikiną anoniminį ID. Nereikia paskyros, el. pašto adreso ar slaptažodžio. ID reikalingas tik Firestore taisyklėms taikyti: tik autentifikuoti įrenginiai gali skaityti ar rašyti sesijos duomenis.
Architektūra: kas siunčia, kas gauna
Timmy turi du režimus:
- Kūdikio režimas (siuntėjas): Įrenginys fiksuoja garsą mikrofonu ir per WebRTC siunčia jį į tėvų įrenginį. Pasirinktinai galima įjungti kamerą – tuomet vaizdas taip pat siunčiamas tiesiogiai.
- Tėvų režimas (gavėjas): Įrenginys gauna garsą ir vaizdą, rodo kameros transliaciją ir leidžia naudojant funkciją „paspausk ir kalbėk“ siųsti trumpas balso žinutes į kūdikio įrenginį.
Valdikliai, tokie kaip „paspausk ir kalbėk“ ir kameros įjungimas ar išjungimas, naudoja DataChannel, kitą WebRTC kanalą, kuriuo maži šifruoti pranešimai siunčiami tiesiogiai tarp įrenginių.
Kodėl Flutter?
Flutter yra „Google“ programėlių kelioms platformoms kūrimo sistema. Timmy atveju tai reiškia, kad daug logikos galiu parašyti vieną kartą ir naudoti ją Android bei iOS. Timmy galima naudoti Android įrenginiuose, o iOS versija jau netrukus bus išleista. Mažiau pasikartojančio kodo reiškia mažiau vietų, kur gali atsirasti klaidų.
Santrauka
Techninė taisyklė paprasta: Timmy turėtų naudoti tik tuos duomenis, kurių jam iš tiesų reikia. WebRTC apsaugo mediją, Firebase koordinuoja ryšio nustatymą, TURN mato tik šifruotus paketus, o Nearby Connections supaprastina susiejimą.
Geros technologijos šiek tiek pranyksta kasdienybėje. Jos tiesiog veikia, nepaversdamos vaiko kambario debesijos projektu.