Három építőelem, egy cél
A háttérben Timmy meglehetősen gyakorlatiasan épül fel: Flutter az alkalmazáshoz, WebRTC a valós idejű hanghoz és videóhoz, valamint Firebase az összehangoláshoz. Nem akartam egy hatalmas platformot építeni, amely mindent a felhőn keresztül továbbít. Minden résznek a lehető legkevesebbet kell tudnia, miközben megbízhatóan együttműködik a többivel.
WebRTC: közvetlen kapcsolat, alapértelmezett titkosítással
A WebRTC (Web Real-Time Communication) továbbítja a hangot és a videót a baba és a szülő készüléke között. Ideális esetben az adatok közvetlenül a két készülék között, peer-to-peer módon áramlanak, köztes médiaszerver nélkül.
Minden WebRTC-kapcsolat alapértelmezetten DTLS-SRTP-t használ. Ha valaki elfogja a hálózati csomagokat, nem kap olvasható hang- vagy videóadatot. Ez a titkosítás a protokoll része, és a WebRTC-ben nem lehet egyszerűen kikapcsolni.
Számomra ez volt a lényeg: a gyerekszobából érkező médiaadatoknak nincs helyük az én szerveremen. A készülékeid között maradnak.
Jelzésátvitel a Firebase Firestore-on keresztül
Mielőtt a WebRTC elindulhat, a készülékeknek meg kell találniuk egymást, és egyeztetniük kell, hogyan tudnak kapcsolódni. Ezt a részt jelzésátvitelnek nevezik. Timmy ehhez a Firebase Firestore-t, a Google felhőalapú adatbázisát használja.
Csak technikai kapcsolati adatok cserélődnek:
- SDP-ajánlatok és -válaszok: Leírják a készülékek képességeit (támogatott kodekek, felbontások stb.).
- ICE-jelöltek: Lehetséges hálózati útvonalak, amelyeken keresztül a készülékek elérhetik egymást.
A hang és a videó nem kerül a Firebase-be. A Firestore csak a technikai kapcsolati adatokat továbbítja. Timmy ezt a jelzésátviteli réteget is titkosítja, így a Firestore nem válik az SDP és az ICE titkosítás nélküli találkozóhelyévé.
TURN-szerverek: amikor a közvetlen útvonal nem működik
Egyes hálózatok blokkolják a közvetlen kapcsolatokat, például a szigorú tűzfalak vagy bizonyos mobilszolgáltatók. Ilyenkor a WebRTC-nek szüksége van egy TURN-relére (Traversal Using Relays around NAT).
Timmy először a helyi TURN-szervert próbálja használni, és ha a helyi relé nem elérhető vagy túlterhelt, a Cloudflare szolgál tartalékként. A relé titkosított csomagokat továbbít. Nem kap kulcsot a hanghoz vagy a videóhoz; a WebRTC-titkosítás változatlanul megmarad.
A TURN-hitelesítő adatok egy Firebase Cloud Functionből érkeznek, és csak 24 óráig érvényesek. Egy bébiőralkalmazásban az állandó hitelesítő adatok számomra túl kockázatosak lennének.
Közeli kapcsolatok: a készülékek automatikusan megtalálják egymást
A baba- és a szülői készülék közötti körülményes beállítás elkerülésére Timmy a Nearby Connections technológiát használja. A Google ezt a felderítési réteget Bluetoothon és Wi-Fi-n keresztül biztosítja.
Automatikus párosítás a Timmyben kézi kódbevitel nélkül működik: a készülékek felfedezik egymást, és ugyanazt a találkozási pontot találják meg a kulcscseréhez. Ha ez nem sikerül, beírhatsz egy 4 karakteres kódot. A párosítási kód soha nem hagyja el a készüléket; a Firestore csak egy kriptográfiai kivonatot (SHA-256) lát dokumentumazonosítóként.
Névtelen hitelesítés
Timmy a Firebase Anonymous Authenticationt használja. Első indításkor minden készülék ideiglenes, névtelen azonosítót kap. Nincs fiók, e-mail-cím vagy jelszó. Az azonosító csak a Firestore-szabályok érvényesítésére szolgál: csak hitelesített készülékek olvashatják vagy írhatják a munkamenet adatait.
Az architektúra: ki küld, ki fogad
Timmynek két üzemmódja van:
- Baba mód (küldő): A készülék a mikrofonon keresztül rögzíti a hangot, és WebRTC-n keresztül elküldi a szülői készülékre. A kamera igény szerint bekapcsolható; ekkor a videó is közvetlenül kerül továbbításra.
- Szülői mód (fogadó): A készülék fogadja a hangot és a videót, megjeleníti a kameraképet, és rövid hangüzenetekhez adóvevő funkciót kínál a baba készülékére.
Az olyan vezérlők, mint az adóvevő és a kamera be-/kikapcsolása, egy DataChannelt használnak, vagyis egy másik WebRTC-csatornát, amely kis méretű, titkosított üzeneteket küld közvetlenül a készülékek között.
Miért Flutter?
A Flutter a Google többplatformos alkalmazásfejlesztő keretrendszere. Timmy esetében ez azt jelenti, hogy a logika nagy részét egyszer írhatom meg, és Androidon, valamint iOS-en is használhatom. Timmy Androidon már elérhető, az iOS-verzió pedig hamarosan megjelenik. A kevesebb ismétlődő kód kevesebb olyan helyet jelent, ahol hibák csúszhatnak be.
Összefoglalás
A műszaki alapelv egyszerű: Timmynek csak azokhoz az adatokhoz szabad hozzáférnie, amelyekre valóban szüksége van. A WebRTC védi a médiaadatokat, a Firebase összehangolja a kapcsolat beállítását, a TURN csak titkosított csomagokat lát, a Nearby Connections pedig egyszerűbbé teszi a párosítást.
A jó technológia kicsit beleolvad a mindennapokba. Működik anélkül, hogy a gyerekszobából felhőprojektet csinálna.