तीन आधारभूत भाग, एउटै लक्ष्य
भित्रबाट हेर्दा, Timmy निकै व्यवहारिक ढंगले बनाइएको छ: Flutter एपका लागि, WebRTC तत्काल अडियो र भिडियोका लागि, र Firebase समन्वयका लागि। म क्लाउडमार्फत सबै कुरा पठाउने ठूलो प्लेटफर्म बनाउन चाहन्नथें। हरेक भागले सकेसम्म कम जानकारी राखोस् र अरूसँग भरपर्दो रूपमा काम गरोस् भन्ने चाहना थियो।
WebRTC: सिधा जडान, पूर्वनिर्धारित रूपमा इन्क्रिप्ट
WebRTC (Web Real-Time Communication) ले बच्चाको यन्त्र र अभिभावकको यन्त्रबीच अडियो र भिडियो पठाउँछ। सबैभन्दा राम्रो अवस्थामा, डाटा दुई यन्त्रबीच सिधै, peer-to-peer रूपमा, बीचमा कुनै media server नभई बग्छ।
हरेक WebRTC जडानले पूर्वनिर्धारित रूपमा DTLS-SRTP प्रयोग गर्छ। कसैले नेटवर्क प्याकेटहरू समाते पनि, उनीहरूले सुन्न वा हेर्न मिल्ने अडियो वा भिडियो पाउँदैनन्। यो इन्क्रिप्सन प्रोटोकलको भाग हो र WebRTC मा सजिलै बन्द गर्न मिल्दैन।
मेरो लागि मुख्य कुरा यही थियो: नर्सरीको अडियो वा भिडियो मेरो सर्भरमा हुनु हुँदैन। यो तपाईंका यन्त्रहरूबीचमै रहन्छ।
Firebase Firestore मार्फत Signaling
WebRTC सुरु हुनुअघि, यन्त्रहरूले एकअर्कालाई फेला पार्नुपर्छ र कसरी जडान हुन सक्छन् भनेर तय गर्नुपर्छ। यो भागलाई signaling भनिन्छ। यसका लागि Timmy ले Google को क्लाउड डाटाबेस Firebase Firestore प्रयोग गर्छ।
प्राविधिक जडानसम्बन्धी डाटा मात्र आदानप्रदान हुन्छ:
- SDP offers र answers: यन्त्रका क्षमताहरू (समर्थित codecs, resolutions आदि) बताउँछन्।
- ICE candidates: यन्त्रहरूले एकअर्कासम्म पुग्न सक्ने सम्भावित नेटवर्क मार्गहरू।
अडियो र भिडियो Firebase मा पुग्दैनन्। Firestore ले प्राविधिक जडान डाटा मात्र पठाउँछ। Timmy ले यो signaling तहलाई पनि इन्क्रिप्ट गर्छ, त्यसैले Firestore SDP र ICE का लागि खुला-पाठ भेट्ने ठाउँ बन्दैन।
TURN सर्भरहरू: सिधा मार्गले काम नगर्दा
केही नेटवर्कहरूले सिधा जडान रोक्छन्, जस्तै कडा firewall वा केही मोबाइल नेटवर्क प्रदायकहरू। त्यतिबेला WebRTC लाई TURN relay (Traversal Using Relays around NAT) चाहिन्छ।
Timmy ले पहिले स्थानीय TURN सर्भर प्रयास गर्छ र स्थानीय relay उपलब्ध नभएमा वा धेरै व्यस्त भएमा Cloudflare लाई विकल्पका रूपमा प्रयोग गर्छ। Relay ले इन्क्रिप्ट गरिएका प्याकेटहरू मात्र अगाडि पठाउँछ। यससँग ध्वनि वा भिडियोका key हुँदैनन्; WebRTC इन्क्रिप्सन यथावत् रहन्छ।
TURN credentials Firebase Cloud Function बाट आउँछन् र 24 घण्टाका लागि मात्र मान्य हुन्छन्। बेबी मोनिटर एपमा स्थायी credentials राख्नु मेरो हिसाबले धेरै जोखिमपूर्ण हुन्छ।
Nearby Connections: यन्त्रहरूले एकअर्कालाई आफैं फेला पार्छन्
बच्चाको यन्त्र र अभिभावकको यन्त्र जोड्दा झन्झटिला सेटअप चरणहरू नहोस् भनेर, Timmy ले Nearby Connections प्रयोग गर्छ। Google ले Bluetooth र WiFi मार्फत यो खोज्ने तह उपलब्ध गराउँछ।
Timmy मा स्वचालित pairing ले हातैले code हाल्नुपर्दैन: यन्त्रहरूले एकअर्कालाई फेला पार्छन् र key exchange का लागि एउटै भेट्ने बिन्दु पहिचान गर्छन्। यसले काम नगरेमा, तपाईंले टाइप गर्न सक्ने 4-अक्षरको code हुन्छ। Pairing code कहिल्यै यन्त्रबाट बाहिर जाँदैन; Firestore ले document identifier का रूपमा cryptographic hash (SHA-256) मात्र देख्छ।
Anonymous Authentication
Timmy ले Firebase Anonymous Authentication प्रयोग गर्छ। पहिलो पटक खोल्दा, हरेक यन्त्रले अस्थायी, गुमनाम ID पाउँछ। कुनै account, email address वा password हुँदैन। यो ID Firestore नियम लागू गर्नका लागि मात्र हो: प्रमाणीकरण भएका यन्त्रहरूले मात्र session data पढ्न वा लेख्न सक्छन्।
आर्किटेक्चर: कसले पठाउँछ, कसले पाउँछ
Timmy का दुई मोड छन्:
- Baby Mode (पठाउने): यन्त्रले microphone बाट अडियो लिन्छ र WebRTC मार्फत अभिभावकको यन्त्रमा पठाउँछ। चाहनाअनुसार camera सक्रिय गर्न सकिन्छ; त्यसपछि भिडियो पनि सिधै पठाइन्छ।
- Parent Mode (पाउने): यन्त्रले अडियो र भिडियो पाउँछ, camera stream देखाउँछ, र बच्चाको यन्त्रमा छोटो आवाज सन्देश पठाउन push-to-talk सुविधा दिन्छ।
Push-to-talk र camera on/off जस्ता नियन्त्रणहरूले DataChannel प्रयोग गर्छन्, जुन यन्त्रहरूबीच साना इन्क्रिप्ट गरिएका सन्देश सिधै पठाउने अर्को WebRTC channel हो।
किन Flutter?
Flutter धेरै प्लेटफर्मका लागि एप बनाउने Google को framework हो। Timmy का लागि यसको अर्थ धेरै logic एकपटक लेखेर Android र iOS दुवैमा प्रयोग गर्न सकिन्छ। Timmy Android मा उपलब्ध छ र iOS संस्करण सार्वजनिक हुनै लागेको छ। दोहोरिने code कम हुनु भनेको bug पस्न सक्ने ठाउँ पनि कम हुनु हो।
सारांश
प्राविधिक नियम सरल छ: Timmy ले साँच्चै चाहिने डाटामा मात्र पहुँच राख्नुपर्छ। WebRTC ले media सुरक्षित गर्छ, Firebase ले जडान सेटअप समन्वय गर्छ, TURN ले इन्क्रिप्ट गरिएका प्याकेटहरू मात्र देख्छ, र Nearby Connections ले pairing सहज बनाउँछ।
राम्रो प्रविधि दैनिक जीवनमा अलि हराएजस्तै हुन्छ। यसले नर्सरीलाई क्लाउड परियोजना नबनाई काम गर्छ।