Tatlong Pangunahing Bahagi, Isang Layunin
Sa likod ng app, praktikal ang pagkakagawa ng Timmy: Flutter para sa app, WebRTC para sa real-time na audio at video, at Firebase para sa pag-uugnayan. Ayokong gumawa ng malaking platform na idinadaan ang lahat sa cloud. Dapat kaunti lang ang alam ng bawat bahagi, pero maaasahan pa rin silang gumagana nang magkakasama.
WebRTC: Direktang Koneksyon, Naka-encrypt Bilang Default
Dinadala ng WebRTC (Web Real-Time Communication) ang audio at video sa pagitan ng baby device at parent device. Sa pinakamainam na sitwasyon, direktang dumadaloy ang data sa pagitan ng dalawang device, peer-to-peer, nang walang media server sa gitna.
Bawat koneksyon ng WebRTC ay gumagamit ng DTLS-SRTP bilang default. Kung may makakuha man ng network packets, hindi nila mababasa ang audio o video. Bahagi ng protocol ang encryption na ito at hindi basta puwedeng patayin sa WebRTC.
Ito ang mahalagang punto para sa akin: hindi dapat napupunta sa server ko ang media mula sa kuwarto ng sanggol. Nananatili ito sa pagitan ng mga device ninyo.
Signaling sa Pamamagitan ng Firebase Firestore
Bago magsimula ang WebRTC, kailangan munang mahanap ng mga device ang isa't isa at pag-usapan kung paano sila makakakonekta. Ang bahaging ito ay tinatawag na signaling. Ginagamit ng Timmy para rito ang Firebase Firestore, ang cloud database ng Google.
Teknikal na data lang ng koneksyon ang ipinapasa:
- SDP offers at answers: Inilalarawan ang kakayahan ng mga device (mga suportadong codec, resolution, at iba pa).
- ICE candidates: Mga posibleng network path kung saan maaabot ng mga device ang isa't isa.
Hindi napupunta sa Firebase ang audio at video. Teknikal na data lang ng koneksyon ang ipinapasa ng Firestore. Ini-encrypt din ng Timmy ang signaling layer na ito, kaya hindi nagiging malinaw na tagpuan ng SDP at ICE ang Firestore.
TURN Servers: Kapag Hindi Gumagana ang Direktang Daan
May ilang network na humaharang sa direktang koneksyon, gaya ng mahigpit na firewall o ilang mobile carrier. Sa ganitong sitwasyon, kailangan ng WebRTC ng TURN relay (Traversal Using Relays around NAT).
Sinusubukan muna ng Timmy ang lokal na TURN server at ginagamit ang Cloudflare bilang fallback kapag hindi available o overloaded ang lokal na relay. Nagpapasa lang ng naka-encrypt na packets ang relay. Wala itong susi para sa tunog o video; nananatiling buo ang encryption ng WebRTC.
Galing sa Firebase Cloud Function ang TURN credentials at 24 oras lang ang bisa nito. Para sa akin, masyadong delikado ang permanenteng credentials sa isang baby monitor app.
Nearby Connections: Awtomatikong Nagkakahanap ang mga Device
Para maiwasan ang abalang setup sa pagitan ng baby device at parent device, ginagamit ng Timmy ang Nearby Connections. Ibinibigay ng Google ang discovery layer na ito sa pamamagitan ng Bluetooth at WiFi.
Ang awtomatikong pagpapares sa Timmy ay gumagana nang walang manu-manong paglalagay ng code: natutuklasan ng mga device ang isa't isa at nahahanap ang iisang tagpuan para sa pagpapalitan ng key. Kapag hindi ito gumana, may 4-character na code na maaari mong i-type. Hindi umaalis sa device ang pairing code; cryptographic hash (SHA-256) lang ang nakikita ng Firestore bilang document identifier.
Anonymous Authentication
Ginagamit ng Timmy ang Firebase Anonymous Authentication. Sa unang pagbukas, bawat device ay nakakakuha ng pansamantalang anonymous ID. Walang account, email address, o password. Para lang ang ID na ito sa pagpapatupad ng mga panuntunan ng Firestore: mga authenticated device lang ang puwedeng magbasa o magsulat ng session data.
Ang Arkitektura: Sino ang Nagpapadala at Tumatanggap
May dalawang mode ang Timmy:
- Baby Mode (nagpapadala): Kinukuha ng device ang audio gamit ang mikropono at ipinapadala ito sa parent device sa pamamagitan ng WebRTC. Puwede ring i-activate ang camera; direktang ipinapadala rin ang video.
- Parent Mode (tumatanggap): Tumatanggap ang device ng audio at video, ipinapakita ang camera stream, at may push-to-talk para sa maiikling voice message papunta sa baby device.
Ang mga kontrol tulad ng push-to-talk at pag-on/off ng camera ay gumagamit ng DataChannel, isa pang WebRTC channel na direktang nagpapadala ng maliliit at naka-encrypt na mensahe sa pagitan ng mga device.
Bakit Flutter?
Ang Flutter ay framework ng Google para sa mga app sa maraming platform. Para sa Timmy, ibig sabihin nito ay isang beses kong maisusulat ang malaking bahagi ng logic at magagamit ito sa Android at iOS. Available ang Timmy sa Android, at malapit nang ilabas ang bersyon para sa iOS. Mas kaunting duplicate na code ang ibig sabihin ay mas kaunting puwedeng pasukan ng bug.
Buod
Simple lang ang teknikal na prinsipyo: dapat ang data lang na talagang kailangan ang hinahawakan ng Timmy. Pinoprotektahan ng WebRTC ang media, inaayos ng Firebase ang setup ng koneksyon, encrypted packets lang ang nakikita ng TURN, at ginagawang mas madali ng Nearby Connections ang pagpapares.
Ang mahusay na teknolohiya ay halos hindi napapansin sa pang-araw-araw na buhay. Gumagana ito nang hindi ginagawang proyekto sa cloud ang kuwarto ng sanggol.