Trīs pamatelementi, viens mērķis
Timmy pamatā ir veidots diezgan praktiski: Flutter lietotnei, WebRTC audio un video reāllaikā, un Firebase koordinācijai. Es negribēju veidot milzīgu platformu, kas visu sūta caur mākoni. Katrai daļai jāzina pēc iespējas mazāk, vienlaikus droši sadarbojoties ar pārējām.
WebRTC: tiešs savienojums un šifrēšana pēc noklusējuma
WebRTC (Web Real-Time Communication) pārraida audio un video starp bērna un vecāka ierīci. Ideālā gadījumā dati plūst tieši starp abām ierīcēm, vienādranga savienojumā, bez starpā esoša multivides servera.
Katrā WebRTC savienojumā pēc noklusējuma tiek izmantots DTLS-SRTP. Ja kāds pārtver tīkla paketes, viņš neiegūst nolasāmu audio vai video. Šī šifrēšana ir daļa no protokola, un WebRTC to nevar vienkārši izslēgt.
Man tas bija svarīgākais: bērnistabas audio un video nepieder manam serverim. Tie paliek starp jūsu ierīcēm.
Signalizācija ar Firebase Firestore
Lai WebRTC varētu sākt darbu, ierīcēm vispirms jāatrod vienai otra un jāvienojas, kā tās var savienoties. Šo daļu sauc par signalizāciju. Tam Timmy izmanto Google mākoņdatu bāzi Firebase Firestore.
Tiek apmainīti tikai tehniski savienojuma dati:
- SDP piedāvājumi un atbildes: Tie apraksta ierīču iespējas (atbalstītos kodekus, izšķirtspēju u. c.).
- ICE kandidāti: Iespējamie tīkla ceļi, pa kuriem ierīces var sasniegt viena otru.
Audio un video nenonāk Firebase. Firestore pārsūta tikai tehniskos savienojuma datus. Timmy šifrē arī šo signalizācijas slāni, tāpēc Firestore nekļūst par SDP un ICE atklātā teksta satikšanās vietu.
TURN serveri: kad tiešais ceļš nedarbojas
Daži tīkli bloķē tiešos savienojumus, piemēram, stingri ugunsmūri vai atsevišķi mobilo sakaru operatori. Tad WebRTC nepieciešams TURN retranslators (Traversal Using Relays around NAT).
Timmy vispirms mēģina izmantot lokālo TURN serveri un kā rezerves variantu izmanto Cloudflare, ja lokālais retranslators nav pieejams vai ir pārslogots. Retranslators pārsūta šifrētas paketes. Tam nav piekļuves audio vai video atslēgām; WebRTC šifrēšana paliek neskarta.
TURN piekļuves dati tiek saņemti no Firebase Cloud Function un ir derīgi tikai 24 stundas. Pastāvīgi piekļuves dati mazuļu monitora lietotnē, manuprāt, būtu pārāk riskanti.
Nearby Connections: ierīces pašas atrod viena otru
Lai izvairītos no neveiklām iestatīšanas darbībām starp bērna un vecāka ierīci, Timmy izmanto Nearby Connections. Google nodrošina šo atrašanas slāni, izmantojot Bluetooth un Wi‑Fi.
Automātiskā savienošana pārī Timmy lietotnē notiek bez manuālas koda ievadīšanas: ierīces atrod viena otru un vienu un to pašu atslēgu apmaiņas vietu. Ja tas neizdodas, var ievadīt 4 rakstzīmju kodu. Savienošanas pārī kods nekad neatstāj ierīci; Firestore kā dokumenta identifikatoru redz tikai kriptogrāfisku jaucējkodu (SHA-256).
Anonīmā autentifikācija
Timmy izmanto Firebase anonīmo autentifikāciju. Pirmajā palaišanas reizē katra ierīce saņem pagaidu anonīmu ID. Nav konta, e-pasta adreses vai paroles. ID ir nepieciešams tikai Firestore noteikumu nodrošināšanai: sesijas datus drīkst lasīt vai rakstīt tikai autentificētas ierīces.
Arhitektūra: kas sūta un kas saņem
Timmy ir divi režīmi:
- Bērna režīms (sūtītājs): Ierīce uztver audio ar mikrofonu un nosūta to uz vecāka ierīci, izmantojot WebRTC. Pēc izvēles var aktivizēt kameru; arī video tad tiek sūtīts tieši.
- Vecāka režīms (saņēmējs): Ierīce saņem audio un video, rāda kameras tiešraidi un nodrošina rācijas funkciju īsu balss ziņojumu nosūtīšanai uz bērna ierīci.
Tādas vadīklas kā rācijas funkcija un kameras ieslēgšana vai izslēgšana izmanto DataChannel, vēl vienu WebRTC kanālu, kas tieši starp ierīcēm nosūta nelielas šifrētas ziņas.
Kāpēc Flutter?
Flutter ir Google ietvars lietotnēm vairākās platformās. Timmy gadījumā tas nozīmē, ka lielu daļu loģikas varu uzrakstīt vienreiz un izmantot gan Android, gan iOS. Timmy ir pieejams Android ierīcēs, un iOS versijas izlaidums ir pavisam tuvu. Mazāk dublēta koda nozīmē mazāk vietu, kur var rasties kļūdas.
Kopsavilkums
Tehniskais princips ir vienkāršs: Timmy jāapstrādā tikai tie dati, kas tam patiešām nepieciešami. WebRTC aizsargā multividi, Firebase koordinē savienojuma izveidi, TURN redz tikai šifrētas paketes, un Nearby Connections padara savienošanu pārī vienkāršāku.
Laba tehnoloģija mazliet pazūd ikdienā. Tā vienkārši darbojas, nepārvēršot bērnistabu par mākoņprojektu.