Երեք հիմնական մաս, մեկ նպատակ
Ներսում 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-ն կոդավորում է նաև այս ազդանշանավորման շերտը, այնպես որ Firestore-ը չի դառնում SDP և ICE տվյալների բաց տեքստով հանդիպման վայր։
TURN սերվերներ. երբ ուղիղ կապը չի աշխատում
Որոշ ցանցեր արգելափակում են ուղիղ կապերը, օրինակ՝ խիստ firewall-ները կամ որոշ բջջային օպերատորներ։ Այդ դեպքում WebRTC-ին պետք է TURN փոխանցող սերվեր (Traversal Using Relays around NAT)։
Timmy-ն նախ փորձում է տեղային TURN սերվերը, իսկ եթե այն անհասանելի է կամ գերծանրաբեռնված, որպես պահուստային տարբերակ օգտագործում է Cloudflare-ը։ Փոխանցող սերվերը պարզապես փոխանցում է կոդավորված փաթեթները։ Այն ձայնի կամ տեսանյութի բանալիներ չի ստանում. WebRTC-ի կոդավորումը մնում է անխախտ։
TURN-ի մուտքի տվյալները գալիս են Firebase Cloud Function-ից և գործում են ընդամենը 24 ժամ։ Երեխայի մոնիտորի հավելվածում մշտական մուտքի տվյալները, իմ կարծիքով, չափազանց ռիսկային կլինեին։
Մոտակա կապեր. սարքերն ավտոմատ գտնում են միմյանց
Որպեսզի երեխայի և ծնողի սարքերի միջև կարգավորումը անհարմար քայլեր չպահանջի, 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-ը հեշտացնում է զուգակցումը։
Լավ տեխնոլոգիան առօրյա կյանքում գրեթե աննկատ է դառնում։ Այն աշխատում է՝ առանց մանկասենյակն ամպային նախագծի վերածելու։