তিনটি মূল অংশ, একটিই লক্ষ্য
ভেতরে ভেতরে Timmy বেশ বাস্তবসম্মতভাবে তৈরি: Flutter অ্যাপের জন্য, WebRTC রিয়েল-টাইম অডিও ও ভিডিওর জন্য, এবং Firebase সমন্বয়ের জন্য। আমি এমন কোনো বিশাল প্ল্যাটফর্ম বানাতে চাইনি, যা সবকিছু ক্লাউডের মাধ্যমে পাঠায়। প্রতিটি অংশ যত কম তথ্য জানে, তবু অন্যগুলোর সঙ্গে নির্ভরযোগ্যভাবে কাজ করে—সেটাই লক্ষ্য।
WebRTC: সরাসরি সংযোগ, ডিফল্টভাবেই এনক্রিপ্টেড
WebRTC (Web Real-Time Communication) শিশু ও অভিভাবকের ডিভাইসের মধ্যে অডিও ও ভিডিও পাঠায়। আদর্শ পরিস্থিতিতে ডেটা যায় সরাসরি দুই ডিভাইসের মধ্যে, পিয়ার-টু-পিয়ারভাবে, মাঝখানে কোনো মিডিয়া সার্ভার ছাড়াই।
প্রতিটি WebRTC সংযোগ ডিফল্টভাবে DTLS-SRTP ব্যবহার করে। কেউ নেটওয়ার্ক প্যাকেট ধরে ফেললেও, তারা শোনা বা দেখা যায় এমন অডিও-ভিডিও পাবে না। এই এনক্রিপশন প্রোটোকলের অংশ, আর WebRTC-তে এটিকে সহজে বন্ধ করা যায় না।
এটাই আমার কাছে গুরুত্বপূর্ণ ছিল: শিশুর ঘরের মিডিয়া আমার সার্ভারে থাকার কথা নয়। এটি আপনার ডিভাইস দুটির মধ্যেই থাকে।
Firebase Firestore-এর মাধ্যমে সিগন্যালিং
WebRTC শুরু হওয়ার আগে ডিভাইস দুটিকে একে অপরকে খুঁজে পেতে এবং কীভাবে সংযুক্ত হবে তা ঠিক করতে হয়। এই অংশটির নাম সিগন্যালিং. এর জন্য Timmy গুগলের ক্লাউড ডেটাবেস 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. গুগল Bluetooth ও WiFi-এর মাধ্যমে এই খোঁজার ব্যবস্থা দেয়।
Timmy-তে স্বয়ংক্রিয় পেয়ারিং ম্যানুয়ালি কোড না লিখেই কাজ করে: ডিভাইস দুটি একে অপরকে খুঁজে পায় এবং কী বিনিময়ের জন্য একই মিলনস্থল খুঁজে নেয়। এটি কাজ না করলে 4 অক্ষরের একটি কোড লিখতে পারবেন। পেয়ারিং কোড কখনোই ডিভাইসের বাইরে যায় না; Firestore শুধু ডকুমেন্ট আইডেন্টিফায়ার হিসেবে একটি ক্রিপ্টোগ্রাফিক হ্যাশ (SHA-256) দেখে।
বেনামী প্রমাণীকরণ
Timmy Firebase Anonymous Authentication ব্যবহার করে। প্রথমবার চালু হলে প্রতিটি ডিভাইস একটি অস্থায়ী, বেনামী আইডি পায়। কোনো অ্যাকাউন্ট, ইমেইল ঠিকানা বা পাসওয়ার্ড নেই। এই আইডি শুধু Firestore-এর নিয়ম কার্যকর করার জন্য: কেবল প্রমাণীকৃত ডিভাইসই সেশনের ডেটা পড়তে বা লিখতে পারে।
আর্কিটেকচার: কে পাঠায়, কে গ্রহণ করে
Timmy-তে দুটি মোড আছে:
- বেবি মোড (প্রেরক): ডিভাইসটি মাইক্রোফোন দিয়ে অডিও ধারণ করে এবং WebRTC-এর মাধ্যমে অভিভাবকের ডিভাইসে পাঠায়। চাইলে ক্যামেরা চালু করা যায়; তখন ভিডিওও সরাসরি পাঠানো হয়।
- প্যারেন্ট মোড (গ্রহণকারী): ডিভাইসটি অডিও ও ভিডিও গ্রহণ করে, ক্যামেরা স্ট্রিম দেখায় এবং শিশুর ডিভাইসে ছোট ভয়েস মেসেজ পাঠানোর জন্য পুশ-টু-টক সুবিধা দেয়।
পুশ-টু-টক ও ক্যামেরা চালু/বন্ধের মতো নিয়ন্ত্রণে ব্যবহৃত হয় একটি DataChannel, এটি আরেকটি WebRTC চ্যানেল যা ডিভাইস দুটির মধ্যে সরাসরি ছোট এনক্রিপ্টেড বার্তা পাঠায়।
কেন Flutter?
Flutter হলো একাধিক প্ল্যাটফর্মে অ্যাপ তৈরির জন্য গুগলের ফ্রেমওয়ার্ক। Timmy-এর ক্ষেত্রে এর মানে হলো, আমি একবার অনেকটা লজিক লিখে Android ও iOS—দুই প্ল্যাটফর্মেই ব্যবহার করতে পারি। Timmy Android-এ পাওয়া যায়, আর iOS সংস্করণটি প্রকাশের খুব কাছাকাছি। একই কোড বারবার না লিখলে বাগ ঢোকার জায়গাও কমে যায়।
সংক্ষেপে
প্রযুক্তিগত নিয়মটি সহজ: Timmy শুধু সেই ডেটাই ব্যবহার করবে, যা তার সত্যিই দরকার। WebRTC মিডিয়াকে সুরক্ষিত রাখে, Firebase সংযোগ স্থাপনের সমন্বয় করে, TURN শুধু এনক্রিপ্টেড প্যাকেট দেখে, আর Nearby Connections পেয়ারিংয়ের ঝামেলা কমায়।
ভালো প্রযুক্তি একটু দৈনন্দিন জীবনের আড়ালেই থাকে। শিশুর ঘরকে ক্লাউড প্রকল্পে পরিণত না করেই এটি কাজ করে।