Гурван үндсэн хэсэг, нэг зорилго
Timmy-ийн дотоод бүтэц нэлээд практик шийдэлтэй: Flutter аппыг бүтээхэд, WebRTC бодит цагийн аудио, видео дамжуулахад, харин Firebase зохицуулалтад ашигладаг. Бүх зүйлийг үүлээр дамжуулдаг том платформ хийхийг би хүсээгүй. Хэсэг бүр аль болох бага мэдээлэл мэддэг атлаа бусадтайгаа найдвартай ажиллах ёстой.
WebRTC: Шууд холболт, анхнаасаа шифрлэгдсэн
WebRTC (Web Real-Time Communication) нь хүүхдийн болон эцэг эхийн төхөөрөмжийн хооронд аудио, видеог дамжуулдаг. Хамгийн тохиромжтой үед өгөгдөл хоёр төхөөрөмжийн хооронд шууд, өөрөөр хэлбэл peer-to-peer байдлаар, дунд нь медиа сервергүй урсдаг.
WebRTC холболт бүр анхнаасаа DTLS-SRTP ашигладаг. Хэн нэгэн сүлжээний пакетуудыг барьж авсан ч унших боломжтой аудио эсвэл видео авч чадахгүй. Энэ шифрлэлт нь протоколын нэг хэсэг бөгөөд WebRTC дээр зүгээр л унтрааж болдоггүй.
Миний хувьд гол зүйл нь энэ байсан: хүүхдийн өрөөнөөс дамжих аудио, видео миний сервер дээр байх ёсгүй. Тэдгээр нь зөвхөн таны төхөөрөмжүүдийн хооронд дамжина.
Firebase Firestore ашиглан холболтын дохионы мэдээлэл солилцох
WebRTC эхлэхээс өмнө төхөөрөмжүүд бие биенээ олж, хэрхэн холбогдохоо тохиролцох хэрэгтэй. Үүнийг холболтын дохионы мэдээлэл солилцоо гэдэг. Timmy үүнд Google-ийн үүлэн өгөгдлийн сан болох Firebase Firestore-ийг ашигладаг.
Зөвхөн холболтын техникийн өгөгдөл солилцогдоно:
- SDP санал ба хариу: Төхөөрөмжийн боломжуудыг (дэмждэг кодек, нягтрал гэх мэт) тайлбарлана.
- ICE холболтын боломжит хувилбарууд: Төхөөрөмжүүд бие биетэйгээ холбогдоход ашиглаж болох сүлжээний замууд.
Аудио, видео Firebase-д очдоггүй. Firestore зөвхөн холболтын техникийн өгөгдлийг дамжуулдаг. Timmy холболтын дохионы мэдээллийн энэ давхаргыг мөн шифрлэдэг тул SDP болон ICE мэдээлэл Firestore дээр ил текстээр төвлөрөхгүй.
TURN серверүүд: Шууд зам ажиллахгүй үед
Зарим сүлжээ шууд холболтыг хаадаг. Жишээлбэл, хатуу галт хана эсвэл зарим мобайл операторын сүлжээ. Тэгвэл WebRTC-д TURN дамжуулагч (NAT-ыг дамжуулах серверээр тойрон нэвтрэх буюу Traversal Using Relays around NAT) хэрэгтэй.
Timmy эхлээд дотоод TURN серверийг оролддог бөгөөд дотоод дамжуулагч ажиллахгүй эсвэл хэт ачаалалтай үед Cloudflare-г нөөц хувилбараар ашиглана. Дамжуулагч нь шифрлэгдсэн пакетуудыг л дамжуулна. Түүнд дуу, видеоны түлхүүр байдаггүй; WebRTC-ийн шифрлэлт хэвээрээ байна.
TURN-ийн нэвтрэх мэдээлэл Firebase Cloud Function-оос ирдэг бөгөөд ердөө 24 цаг хүчинтэй. Хүүхэд хянах аппд байнгын нэвтрэх мэдээлэл ашиглах нь миний хувьд хэт эрсдэлтэй.
Ойр орчмын холболт: Төхөөрөмжүүд бие биенээ автоматаар олно
Хүүхдийн болон эцэг эхийн төхөөрөмжийг тохируулах төвөгтэй алхмаас зайлсхийхийн тулд Timmy Nearby Connections ашигладаг. Google энэ илрүүлэх давхаргыг Bluetooth болон WiFi-аар хангадаг.
Timmy-ийн автомат хослол нь кодыг гараар оруулахгүйгээр ажилладаг: төхөөрөмжүүд бие биенээ илрүүлж, түлхүүр солилцох нэг цэгт холбогдоно. Хэрэв энэ нь бүтэлгүйтвэл 4 тэмдэгттэй кодыг гараар оруулж болно. Хослуулах код төхөөрөмжөөс хэзээ ч гардаггүй; Firestore баримтын танигч хэлбэрээр зөвхөн криптограф хэш (SHA-256)-ийг хардаг.
Нэргүй баталгаажуулалт
Timmy Firebase Anonymous Authentication ашигладаг. Анх нээхэд төхөөрөмж бүр түр, нэргүй ID авна. Бүртгэл, имэйл хаяг, нууц үг байхгүй. Энэ ID нь зөвхөн Firestore-ийн дүрмийг мөрдүүлэхэд хэрэгтэй: зөвхөн баталгаажсан төхөөрөмжүүд сессийн өгөгдлийг уншиж, бичиж болно.
Архитектур: Хэн илгээж, хэн хүлээж авдаг вэ
Timmy хоёр горимтой:
- Хүүхдийн горим (илгээгч): Төхөөрөмж микрофоноор дуу авч, WebRTC-ээр эцэг эхийн төхөөрөмж рүү илгээнэ. Хүсвэл камерыг идэвхжүүлж болох бөгөөд видео ч мөн шууд илгээгдэнэ.
- Эцэг эхийн горим (хүлээн авагч): Төхөөрөмж аудио, видео хүлээн авч, камерын дүрсийг харуулахын зэрэгцээ хүүхдийн төхөөрөмж рүү богино дуут мессеж илгээх товч дарж ярих (push-to-talk) боломжтой.
Push-to-talk болон камерыг асаах/унтраах зэрэг удирдлага нь DataChannel буюу төхөөрөмжүүдийн хооронд жижиг шифрлэгдсэн мессежийг шууд илгээдэг өөр нэг WebRTC суваг ашигладаг.
Яагаад Flutter гэж?
Flutter бол олон платформд апп хийх Google-ийн фреймворк юм. Timmy-ийн хувьд энэ нь ихэнх логикийг нэг удаа бичээд Android болон iOS дээр ашиглаж болно гэсэн үг. Timmy Android дээр ашиглах боломжтой, харин iOS хувилбар гарахад тун ойрхон байна. Давхардсан код бага байх тусам алдаа гарах боломжтой газар ч цөөн байна.
Дүгнэлт
Техникийн дүрэм нь энгийн: Timmy үнэхээр хэрэгтэй өгөгдөлд л хүрэх ёстой. WebRTC медиа мэдээллийг хамгаалж, Firebase холболтын тохиргоог зохицуулж, TURN зөвхөн шифрлэгдсэн пакетуудыг харж, Nearby Connections хослуулах үйл явцыг хялбарчилдаг.
Сайн технологи өдөр тутмын амьдралд бага зэрэг үл анзаарагдан шингэдэг. Хүүхдийн өрөөг үүлэн төсөл болголгүйгээр ажилладаг.