Тры складнікі, адна мэта
З тэхнічнага боку Timmy пабудаваны даволі практычна: Flutter для праграмы, WebRTC для аўдыё і відэа ў рэальным часе, і Firebase для каардынацыі. Я не хацеў ствараць велізарную платформу, якая прапускае ўсё праз воблака. Кожны складнік павінен ведаць як мага менш і пры гэтым надзейна працаваць з іншымі.
WebRTC: прамое злучэнне, шыфраванне па змаўчанні
WebRTC (Web Real-Time Communication) перадае аўдыё і відэа паміж прыладамі для дзіцяці і бацькоў. У найлепшым выпадку даныя ідуць напрамую паміж дзвюма прыладамі, па аднарангавай схеме, без медыясервера пасярэдзіне.
Кожнае злучэнне WebRTC па змаўчанні выкарыстоўвае DTLS-SRTP. Калі нехта перахопіць сеткавыя пакеты, ён не атрымае відэа ці аўдыё, якія можна прачытаць або праслухаць. Гэтае шыфраванне — частка пратаколу, і ў WebRTC яго нельга проста адключыць.
Для мяне гэта было галоўным: аўдыё і відэа з дзіцячага пакоя не павінны трапляць на мой сервер. Яны застаюцца паміж вашымі прыладамі.
Сігналізацыя праз Firebase Firestore
Перад пачаткам WebRTC прылады мусяць знайсці адна адну і ўзгадніць спосаб злучэння. Гэта называецца сігналізацыяй. Для гэтага Timmy выкарыстоўвае Firebase Firestore — воблачную базу даных Google.
Абменьваюцца толькі тэхнічныя даныя злучэння:
- Прапановы і адказы SDP: Апісваюць магчымасці прылад (падтрымліваемыя кодэкі, раздзяляльнасць і г. д.).
- Кандыдаты ICE: Магчымыя сеткавыя шляхі, па якіх прылады могуць дасягнуць адна адной.
Аўдыё і відэа не трапляюць у Firebase. Firestore перадае толькі тэхнічныя даныя злучэння. Timmy таксама шыфруе гэты сігнальны ўзровень, таму Firestore не становіцца адкрытым пунктам абмену данымі SDP і ICE.
Серверы TURN: калі прамы шлях не працуе
Некаторыя сеткі блакуюць прамыя злучэнні, напрыклад строгія фаерволы або асобныя мабільныя аператары. Тады WebRTC патрэбны сервер-рэтранслятар TURN (Traversal Using Relays around NAT).
Timmy спачатку спрабуе выкарыстаць лакальны сервер TURN, а калі ён недаступны або перагружаны, у якасці запаснога варыянту выкарыстоўвае Cloudflare. Рэтранслятар перасылае зашыфраваныя пакеты. Ён не атрымлівае ключоў да гуку ці відэа; шыфраванне WebRTC працягвае дзейнічаць.
Уліковыя даныя TURN выдае Firebase Cloud Function, і яны дзейнічаюць толькі 24 гадзіны. Пастаянныя ўліковыя даныя ў праграме-радыёняні, на маю думку, былі б занадта рызыкоўнымі.
Nearby Connections: прылады знаходзяць адна адну аўтаматычна
Каб пазбегнуць нязручнай налады паміж прыладай для дзіцяці і прыладай для бацькоў, Timmy выкарыстоўвае Nearby Connections. Google забяспечвае гэты ўзровень пошуку праз Bluetooth і Wi‑Fi.
Аўтаматычнае спалучэнне ў Timmy працуе без ручнога ўводу кода: прылады знаходзяць адна адну і адзін і той жа пункт для абмену ключамі. Калі гэта не спрацуе, можна ўвесці 4-знакавы код. Код спалучэння ніколі не пакідае прыладу; Firestore бачыць толькі крыптаграфічны хэш (SHA-256) як ідэнтыфікатар дакумента.
Ананімная аўтэнтыфікацыя
Timmy выкарыстоўвае ананімную аўтэнтыфікацыю Firebase. Пры першым запуску кожная прылада атрымлівае часовы ананімны ідэнтыфікатар. Няма ні ўліковага запісу, ні адраса электроннай пошты, ні пароля. Ідэнтыфікатар патрэбны толькі для выканання правілаў Firestore: чытаць або запісваць даныя сеанса могуць толькі аўтэнтыфікаваныя прылады.
Архітэктура: хто адпраўляе, хто прымае
У Timmy ёсць два рэжымы:
- Рэжым дзіцяці (адпраўнік): Прылада запісвае гук праз мікрафон і адпраўляе яго на прыладу бацькоў праз WebRTC. Па жаданні можна ўключыць камеру; тады відэа таксама перадаецца напрамую.
- Рэжым бацькоў (атрымальнік): Прылада прымае аўдыё і відэа, паказвае паток з камеры і мае функцыю «націсні і гавары» для перадачы кароткіх галасавых паведамленняў на прыладу дзіцяці.
Элементы кіравання, напрыклад «націсні і гавары» і ўключэнне/выключэнне камеры, выкарыстоўваюць DataChannel, яшчэ адзін канал WebRTC, які адпраўляе невялікія зашыфраваныя паведамленні напрамую паміж прыладамі.
Чаму Flutter?
Flutter — гэта фрэймворк Google для праграм на некалькіх платформах. Для Timmy гэта азначае, што я магу напісаць значную частку логікі адзін раз і выкарыстоўваць яе на Android і iOS. Timmy даступны на Android, а версія для iOS ужо амаль гатовая да выпуску. Менш дубляванага кода — менш месцаў, дзе могуць з'явіцца памылкі.
Падсумаванне
Тэхнічнае правіла простае: Timmy павінен апрацоўваць толькі тыя даныя, якія яму сапраўды патрэбныя. WebRTC абараняе медыя, Firebase каардынуе наладжванне злучэння, TURN бачыць толькі зашыфраваныя пакеты, а Nearby Connections спрашчае спалучэнне.
Добрыя тэхналогіі становяцца амаль незаўважнымі ў паўсядзённым жыцці. Яны працуюць, не ператвараючы дзіцячы пакой у воблачны праект.