Три градивна елемента, један циљ
Испод хаубе, Timmy је направљен прилично прагматично: Flutter за апликацију, WebRTC за звук и видео у реалном времену, и Firebase за координацију. Нисам желео да правим огромну платформу која све гура кроз облак. Сваки део треба да зна што мање, а да ипак поуздано ради с осталима.
WebRTC: директна веза, подразумевано шифрована
WebRTC (Web Real-Time Communication) преноси звук и видео између уређаја за бебу и родитеља. У најбољем случају, подаци иду директно између два уређаја, peer-to-peer, без медијског сервера између њих.
Свака 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 Anonymous Authentication. При првом покретању, сваки уређај добија привремени анонимни ID. Нема налога, имејл адресе ни лозинке. ID служи само за примену Firestore правила: само аутентификовани уређаји могу да читају или уписују податке сесије.
Архитектура: ко шаље, ко прима
Timmy има два режима:
- Режим за бебу (шаље): Уређај снима звук преко микрофона и шаље га родитељском уређају преко WebRTC-а. По жељи се може укључити камера; тада се и видео шаље директно.
- Режим за родитеље (прима): Уређај прима звук и видео, приказује снимак камере и нуди функцију „притисни за разговор“ за слање кратких гласовних порука уређају код бебе.
Контроле попут функције „притисни за разговор“ и укључивања или искључивања камере користе DataChannel, још један WebRTC канал који шаље мале шифроване поруке директно између уређаја.
Зашто Flutter?
Flutter је Google-ов оквир за апликације на више платформи. За Timmy то значи да могу једном да напишем велики део логике и користим је на Android-у и iOS-у. Timmy је доступан на Android-у, а iOS верзија је пред објављивањем. Мање дуплираног кода значи мање места где се могу поткрасти грешке.
Укратко
Техничко правило је једноставно: Timmy треба да користи само податке који су му заиста потребни. WebRTC штити медијски садржај, Firebase координира успостављање везе, TURN види само шифроване пакете, а Nearby Connections поједностављује упаривање.
Добра технологија постаје готово неприметан део свакодневног живота. Ради без претварања бебине собе у пројекат у облаку.