ሦስት መሠረታዊ ክፍሎች፣ አንድ ግብ
ከውስጥ ሲታይ 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 ሰዓታት ብቻ ያገለግላሉ። በሕፃን መከታተያ መተግበሪያ ውስጥ ቋሚ የመግቢያ መረጃ መኖር ለእኔ በጣም አደገኛ ነው።
በአቅራቢያ ያሉ ግንኙነቶች፦ መሣሪያዎች እርስ በርስ በራሳቸው ይፈላለጋሉ
በሕፃኑ መሣሪያና በወላጅ መሣሪያ መካከል አስቸጋሪ የማዋቀር ደረጃዎችን ለማስቀረት Timmy Nearby Connectionsን ይጠቀማል። Google ይህን የመፈለጊያ ሽፋን በBluetooth እና WiFi በኩል ያቀርባል።
በTimmy ውስጥ ራስ-ሰር ማጣመር በእጅ ኮድ ሳይገባ ይሠራል፦ መሣሪያዎቹ እርስ በርስ ይፈላለጋሉ እና ለቁልፍ ልውውጥ ተመሳሳይ የመገናኛ ነጥብ ያገኛሉ። ይህ ካልሠራ፣ ማስገባት የምትችሉት ባለ4-ቁምፊ ኮድ አለ። የማጣመሪያ ኮዱ ከመሣሪያው ፈጽሞ አይወጣም፤ Firestore እንደ ሰነድ መለያ የሚያየው ክሪፕቶግራፊያዊ ሃሽ (SHA-256) ብቻ ነው።
ስም-አልባ ማረጋገጫ
Timmy የFirebase ስም-አልባ ማረጋገጫን ይጠቀማል። ለመጀመሪያ ጊዜ ሲከፈት እያንዳንዱ መሣሪያ ጊዜያዊ፣ ስም-አልባ መለያ ያገኛል። መለያ የለም፣ ኢሜይል አድራሻ የለም፣ የይለፍ ቃልም የለም። ይህ መለያ ያለው ለFirestore ደንቦች ብቻ ነው፦ የተረጋገጡ መሣሪያዎች ብቻ የክፍለ ጊዜ ውሂብን ማንበብ ወይም መጻፍ ይችላሉ።
አርክቴክቸሩ፦ ማን ይልካል፣ ማን ይቀበላል
Timmy ሁለት ሁነታዎች አሉት፦
- የሕፃን ሁነታ (ላኪ)፦ መሣሪያው ድምፅን በማይክሮፎን ይቀርጻል እና በWebRTC በኩል ወደ ወላጅ መሣሪያ ይልካል። ካስፈለገ ካሜራው ሊነቃ ይችላል፤ ቪዲዮውም በቀጥታ ይላካል።
- የወላጅ ሁነታ (ተቀባይ)፦ መሣሪያው ድምፅና ቪዲዮ ይቀበላል፣ የካሜራውን ስርጭት ያሳያል፣ እና ወደ ሕፃኑ መሣሪያ አጭር የድምፅ መልዕክቶች ለመላክ ተጭኖ መናገርን ያቀርባል።
እንደ ተጭኖ መናገር እና ካሜራ ማብራት/ማጥፋት ያሉ መቆጣጠሪያዎች DataChannelን ይጠቀማሉ፤ ይህም ትንንሽ የተመሰጠሩ መልዕክቶችን በቀጥታ በመሣሪያዎች መካከል የሚልክ ሌላ የWebRTC ቻናል ነው።
ለምን Flutter?
Flutter በብዙ መድረኮች ላይ ለሚሠሩ መተግበሪያዎች የGoogle ፍሬምወርክ ነው። ለTimmy ይህ ማለት ብዙ ሎጂክን አንድ ጊዜ ጽፌ በAndroid እና iOS ላይ መጠቀም እችላለሁ ማለት ነው። Timmy በAndroid ላይ ይገኛል፣ የiOS ስሪቱም ለመለቀቅ ተቃርቧል። የሚደጋገም ኮድ ሲቀንስ ስህተቶች ሊገቡባቸው የሚችሉ ቦታዎችም ይቀንሳሉ።
ማጠቃለያ
ቴክኒካዊው መርህ ቀላል ነው፦ Timmy በእውነት የሚያስፈልገውን ውሂብ ብቻ መንካት አለበት። WebRTC ሚዲያውን ይጠብቃል፣ Firebase የግንኙነት መጀመሪያውን ያስተባብራል፣ TURN የሚያየው የተመሰጠሩ ፓኬቶችን ብቻ ነው፣ Nearby Connections ደግሞ ማጣመርን ቀላል ያደርገዋል።
ጥሩ ቴክኖሎጂ በዕለት ተዕለት ኑሮ ውስጥ ትንሽ ትጠፋለች። የሕፃኑን ክፍል ወደ የክላውድ ፕሮጀክት ሳይቀይር ይሠራል።