तीन मुख्य हिस्से, एक लक्ष्य
अंदर से देखें तो Timmy को काफ़ी व्यावहारिक तरीके से बनाया गया है: Flutter ऐप के लिए, WebRTC रीयल-टाइम ऑडियो और वीडियो के लिए, और Firebase समन्वय के लिए। मैं ऐसा बड़ा प्लेटफ़ॉर्म नहीं बनाना चाहता था जो सब कुछ क्लाउड के ज़रिए भेजे। हर हिस्सा कम-से-कम जानकारी रखे और फिर भी बाकी हिस्सों के साथ भरोसेमंद ढंग से काम करे।
WebRTC: सीधा कनेक्शन, डिफ़ॉल्ट रूप से एन्क्रिप्टेड
WebRTC (Web Real-Time Communication) बच्चे वाले डिवाइस और माता-पिता वाले डिवाइस के बीच ऑडियो और वीडियो भेजता है। सबसे अच्छी स्थिति में, डेटा सीधे दोनों डिवाइसों के बीच जाता है—पीयर-टू-पीयर, बीच में कोई मीडिया सर्वर नहीं होता।
हर WebRTC कनेक्शन डिफ़ॉल्ट रूप से DTLS-SRTP का उपयोग करता है। अगर कोई नेटवर्क पैकेट पकड़ भी ले, तो उसे पढ़ने लायक ऑडियो या वीडियो नहीं मिलता। यह एन्क्रिप्शन प्रोटोकॉल का हिस्सा है और WebRTC में इसे यूँ ही बंद नहीं किया जा सकता।
मेरे लिए यही अहम बात थी: बच्चे के कमरे का ऑडियो-वीडियो मेरे सर्वर पर नहीं होना चाहिए। यह आपके डिवाइसों के बीच ही रहता है।
Firebase Firestore के ज़रिए सिग्नलिंग
WebRTC शुरू होने से पहले, डिवाइसों को एक-दूसरे को ढूँढना और कनेक्ट होने का तरीका तय करना होता है। इस हिस्से को सिग्नलिंग कहते हैं। Timmy इसके लिए Google के क्लाउड डेटाबेस Firebase Firestore का उपयोग करता है।
सिर्फ़ तकनीकी कनेक्शन डेटा का आदान-प्रदान होता है:
- 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 पेयरिंग को आसान बनाता है।
अच्छी तकनीक रोज़मर्रा की ज़िंदगी में थोड़ी-सी घुल जाती है। वह बच्चे के कमरे को क्लाउड प्रोजेक्ट बनाए बिना काम करती है।