Þrjár byggingareiningar, eitt markmið
Timmy er byggt upp á nokkuð hagkvæman hátt: Flutter fyrir appið, WebRTC fyrir hljóð og mynd í rauntíma og Firebase fyrir samhæfingu. Ég vildi ekki byggja risastórt kerfi sem sendir allt í gegnum skýið. Hver hluti á að vita sem minnst en samt vinna áreiðanlega með hinum.
WebRTC: Bein tenging, sjálfgefið dulkóðuð
WebRTC (Web Real-Time Communication) flytur hljóð og mynd milli barnatækisins og foreldratækisins. Þegar best lætur flæða gögnin beint milli tækjanna tveggja, í jafningjatengingu og án miðlunarþjóns þar á milli.
Sérhver WebRTC-tenging notar sjálfgefið DTLS-SRTP. Ef einhver fangar netpakka fær viðkomandi hvorki læsilegt hljóð né mynd. Dulkóðunin er hluti af samskiptareglunni og ekki er hægt að slökkva á henni í WebRTC.
Þetta var mikilvægt fyrir mig: hljóð- og myndefni úr barnaherberginu á ekki heima á netþjóninum mínum. Það fer aðeins á milli tækjanna þinna.
Merkjasamskipti í gegnum Firebase Firestore
Áður en WebRTC getur hafist þurfa tækin að finna hvort annað og semja um hvernig þau geta tengst. Sá hluti kallast merkjasamskipti. Timmy notar Firebase Firestore, skýjagagnagrunn Google, fyrir það.
Aðeins tæknileg tengingargögn eru send á milli:
- SDP-tilboð og svör: Lýsa getu tækjanna (studdum merkjamálum, upplausnum o.s.frv.).
- ICE-frambjóðendur: Mögulegar netleiðir sem tækin geta notað til að ná hvort til annars.
Hljóð og mynd enda ekki í Firebase. Firestore flytur aðeins tæknileg tengingargögn. Timmy dulkóðar einnig merkjasamskiptin, svo Firestore verður ekki að ódulkóðuðum skiptistað fyrir SDP- og ICE-gögn.
TURN-þjónar: Þegar beina leiðin virkar ekki
Sum net loka á beinar tengingar, til dæmis strangir eldveggir eða ákveðin farsímakerfi. Þá þarf WebRTC á TURN-miðlara (Traversal Using Relays around NAT).
Timmy reynir fyrst að nota staðbundna TURN-þjóninn og notar Cloudflare til vara þegar staðbundni miðlarinn er ekki tiltækur eða er ofhlaðinn. Miðlarinn framsendir dulkóðaða pakka. Hann fær ekki lykla að hljóði eða mynd; WebRTC-dulkóðunin helst óskert.
TURN-aðgangsupplýsingarnar koma frá Firebase Cloud Function og gilda aðeins í 24 klukkustundir. Varanlegar aðgangsupplýsingar í barnavaktarforriti væru of áhættusamar að mínu mati.
Nearby Connections: Tækin finna hvort annað sjálfkrafa
Til að forðast óþægileg uppsetningarskref milli barnatækisins og foreldratækisins notar Timmy Nearby Connections. Google býður upp á þetta uppgötvunarlag sem notar Bluetooth og Wi-Fi.
Sjálfvirk pörun í Timmy virkar án þess að slá kóða inn handvirkt: tækin finna hvort annað og sama skiptistaðinn fyrir lyklaskiptin. Ef það tekst ekki er hægt að slá inn 4 tákna kóða. Pörunarkóðinn yfirgefur aldrei tækið; Firestore sér aðeins dulritað kássugildi (SHA-256) sem auðkenni skjalsins.
Nafnlaus auðkenning
Timmy notar nafnlausa auðkenningu Firebase. Við fyrstu ræsingu fær hvert tæki tímabundið, nafnlaust auðkenni. Það er enginn notandareikningur, ekkert netfang og ekkert lykilorð. Auðkennið er aðeins notað til að framfylgja reglum Firestore: aðeins auðkennd tæki mega lesa eða skrifa setugögn.
Uppbyggingin: Hver sendir og hver tekur við
Timmy er með tvær stillingar:
- Barnastilling (sendir): Tækið nemur hljóð með hljóðnemanum og sendir það í foreldratækið í gegnum WebRTC. Einnig er hægt að kveikja á myndavélinni; myndin er þá send beint á sama hátt.
- Foreldrastilling (móttakari): Tækið tekur við hljóði og mynd, sýnir myndavélarstrauminn og gerir notandanum kleift að ýta á hnapp og senda stutt raddskilaboð til barnatækisins.
Stýringar á borð við talhnappinn og það að kveikja eða slökkva á myndavélinni nota DataChannel, aðra WebRTC-rás sem sendir lítil dulkóðuð skilaboð beint milli tækja.
Af hverju Flutter?
Flutter er þróunarrammi Google fyrir öpp á mörgum stýrikerfum. Fyrir Timmy þýðir það að ég get skrifað stóran hluta virkninnar einu sinni og notað hann bæði á Android og iOS. Timmy er í boði fyrir Android og stutt er í útgáfu fyrir iOS. Minni tvíverknaður í kóðanum þýðir færri staði þar sem villur geta læðst inn.
Samantekt
Tæknireglan er einföld: Timmy á aðeins að vinna með þau gögn sem það þarf raunverulega. WebRTC verndar hljóð- og myndefnið, Firebase samhæfir uppsetningu tengingarinnar, TURN sér aðeins dulkóðaða pakka og Nearby Connections einfaldar pörunina.
Góð tækni verður svolítið ósýnileg í daglegu lífi. Hún virkar án þess að breyta barnaherberginu í skýjaverkefni.