WebRTC من خلال Kurento: تجربة الاختبار والتنفيذ


في هذه المقالة ، سوف أشارك تجربتي مع تقنية WebRTC وخادم وسائط Kurento أثناء مرحلة الاختبار والتنفيذ. سوف أخبركم بالمشاكل التي واجهتها وكيف حلتها. لن أتحدث عن كيفية تطوير تطبيق من البداية ، لكنني سأقدم الكثير من الروابط المفيدة. أنا متأكد من أن قصتي ستكون مفيدة لأولئك الذين سيعملون مع WebRTC.

مقدمة


لقد تطور نظام المعلومات الطبية (MIS) ، الذي يتم تطويره من قبل شركتنا ، بالفعل إلى مشروع تجاري ضخم يضم العديد من الخدمات المصغرة وحافلات المراسلة وعملاء الأجهزة المحمولة وما إلى ذلك. يجب تقديم بعض أجزاء النظام للتطوير والدعم لمنظمات الجهات الخارجية ، لأنها ليست ملف تعريفنا.

تعد خدمة التطبيب عن بعد واحدة من وحدات MIS هذه. لم تكن هناك خبرة في تطوير مؤتمرات الفيديو واستخدام WebRTC وتم تفويض الطلب. ولكن بعد بعض الوقت ، نظرًا للظروف المختلفة ، توقفت هذه الشركة عن دعم مؤتمرات الفيديو. بدون دعم ، تم تعطيل هذه الخدمة و "تجميع الغبار" في المستودع.

والآن حان الوقت لإحياء هذه الخدمة الصغيرة. تقرر إعادة تشغيل Telemedicine من تلقاء نفسها. لقد نمت شركتنا ، وظهر عدد أكبر من المتخصصين - من الممكن والضروري إتقان مواضيع جديدة للتنمية. لم أشارك في بث الفيديو من قبل ، لكن كان من المثير للاهتمام للغاية فهم ودراسة هذه التكنولوجيا الواعدة مثل WebRTC.

فيما يلي بعض الروابط المفيدة جدًا في تقنية WebRTC وخادم Kurento الذي ساعدني في البداية:


الابتداء


كانت المهمة بسيطة: استعادة نظام مؤتمرات الفيديو الحالي ، وأخذ جرد لما تم إنجازه بالفعل من قبل ، وإذا لزم الأمر ، قم بتعديله وفقًا لرغبات المستخدمين. كانت الاختبارات الأولى على الأجهزة الافتراضية وأجهزة الكمبيوتر الحقيقية ناجحة. لكن نشر النظام على العميل جلب الكثير من المتاعب.

واسمحوا لي أن أذكرك أن العميل لديه بالفعل نظام معلومات طبية (MIS) يغطي عددًا كبيرًا من المهام: من قائمة الانتظار الإلكترونية ، ومكان عمل الطبيب ، وإدارة الوثائق ونظام PACS إلى النظام الفرعي لإدارة المعدات الطبية.

عندما أصبح من الضروري تطوير وظائف عقد المؤتمرات عن طريق الفيديو للتواصل بين العاملين الطبيين في مراكز التشخيص (يشار إليها فيما بعد باسم DC) والمرضى عن بعد ، تم تعيين شرطين أساسيين:

يجب تسجيل جميع المؤتمرات وتخزينها على الخادم.

يجب على المرضى عدم تثبيت أي برامج إضافية على أجهزتهم ، باستثناء المتصفح ، والذي تم تثبيته مسبقًا بالفعل في معظم الحالات.

يعمل WebRTC من مستعرض بدون برامج أو مكونات إضافية. ويمكن لكورنتو تسجيل كل شيء يمر عبره. بالإضافة إلى ذلك ، يحتوي خادم الوسائط هذا على مجموعة جيدة من المكتبات الجاهزة للعمل مع API الخاص به من خلال Java و JavaScript ، مما يبسط عملية التطوير إلى حد كبير.

تم نقل تطوير جزء الخادم ، أو بالأحرى أساسه ، حتى قبل أن أبدأ المهمة ، من قبل العميل إلى شركة الاستعانة بمصادر خارجية لشركة خارجية. لذلك كان هناك "خادم إدارة" (CSS) - قاعدة خادم جاهزة ، حصلت عليها للتنفيذ.

الفكرة العامة للتفاعل بدا في البداية مثل هذا:



ولكن في عملية مزيد من العمل ، تغير النظام بأكمله وأصبح أكثر تعقيدًا.

تجربة الإنعاش الأولى


بعد النشر في شبكة اختبار على الأجهزة الظاهرية وعلى العديد من أجهزة الكمبيوتر "المباشرة" ، تم إجراء العديد من الاختبارات والتجارب - كان كل شيء يعمل بشكل مثالي. وفقًا لذلك ، حان الوقت لتقديم شبكة عمل حقيقية.

للاختبار ، تم تعيين ضحية مسؤولة في شكل طبيب ومكان عمله لمساعدتي. والدعوة الثانية من خلال microservice التطبيب عن بعد تحطمت!

من الجيد أن هذا حدث خلال اختبار بيتا ، وبجانبني وطبيب كان سعيدًا بالمغامرات ، لم يرها أحد.

ما يحدث ولماذا لم يتم تأسيس الاتصال كان من الصعب للغاية فهمه. لا يظهر WebRTC أي عطل - إنه ينتظر ظهور إشارة. تدري ، كان من الصعب للغاية تصحيح الأخطاء بطريقة ما: جزء الخادم يعمل بشكل جيد ، كورينتو صامتة في السجلات ، العملاء ينتظرون الدفق ، لكن لا يحدث شيء.

ساعد هبر (الحمد لله):


من المؤسف أنني لم أعرف هذه الأدوات من قبل.

بعد تحليل بيانات السجل ومراقبة حالة الاتصالات ، أصبح من الواضح أن كلا من جانب الخادم والبرامج النصية العميل يفتقر إلى رد فعل للأحداث في نظام WebRTC. وأين يمكن الحصول على هذه الأحداث؟

يوفر مطورو خادم kurento مكتبة JavaScript ملائمة جدًا للعمل مع WebRTC: kurento-utils.js.

للبدء بسرعة ، فقط قم بإنشاء كائن:

new kurentoUtils.WebRtcPeer.WebRtcPeerRecvonly(options, callback()); 

ومن أجل الوصول إلى الأحداث ، من الضروري إعادة تحديد الأساليب الداخلية للمكتبة. قمت بتبسيط الكود قدر الإمكان لجعله أكثر وضوحًا:

 //    WebRtcPeerRecvonly var options = { //      peerConnection: getRTCPeerConnection(videoId), remoteVideo: videoElement, // //  ICE  onicecandidate: function (candidate) { onIceCandidate(candidate, videoId, true); }, onerror: onError, //   mediaConstraints: { //  video: true, audio: true} }; //  WebRTC incomeWebRtc[videoId] = new kurentoUtils.WebRtcPeer.WebRtcPeerRecvonly( options, function (error) { if (error) { return console.error(error); } this.generateOffer( function (error, sdpOffer) { //  }); }); //      function getRTCPeerConnection( videoId ){ var configuration = { "iceServers": [ {"url": "stun:" + stunServer}, {"url": "turn:" + turnServer, credential: turnCredential, username: turnUsername} ] }; var mypc = new RTCPeerConnection(configuration); //      mypc.oniceconnectionstatechange = function(){ state = this.iceConnectionState; console.info("### iceConnectionState " + videoId + " > " + this.iceConnectionState); }; mypc.onsignalingstatechange = function(){ state = this.signalingState || this.readyState; console.info("### SignalingState " + videoId + " > " + state); }; mypc.onconnectionstatechange = function(){ console.info("### ConnectionState " + videoId + " > " + this.connectionState); }; return mypc; } 

الحديث عن الشهادات


نظرًا لأن المقالة تدور حول تجربتي ، فسأشارك المعلومات التي أصبحت المتصفحات الحديثة صارمة للغاية حول الأمان. إذا كان المورد يحتوي على شهادة موقعة ذاتيًا ، فحتى مع إذن خاص ، يحظر المستعرض الوصول إلى ملحقات الكمبيوتر.

يمكنك إنشاء شهادة على الموارد المجانية على الإنترنت وتكوين شبكة محلية لاستخدامها ، أو يمكنك تنزيل Firefox الإصدار 65 أو أعلى ، وفي هذا الإصدار ، فقط انقر فوق الزر الذي أوافق على مخاطر الشهادات الموقعة ذاتيًا والوصول إلى الكاميرات والميكروفونات.

وبدا بهذه الطريقة أسهل بالنسبة لي.

الاختبار الثاني (دقيق بالفعل)


بدا لي أن الطبيب سيرشح الفشار عندما رآني في الاختبار التالي. من الواضح أنه استمتع بمشاهدتي وأنا أواجه التكنولوجيا الحديثة.

في الواقع ، لم يكن تحديث النظام هذا إصدارًا ، لأنني لم أصلح أي شيء ، حتى أنني لم أعرف سبب المشكلات. أكرر أن كل شيء يعمل بشكل مثالي في المكتب. تمت إضافة ردود الفعل على جميع الأحداث التي تم إنشاؤها بواسطة WebRTC و Kurento التي وصلت إليها في الكود ، وتم كتابة كل ذلك بتفصيل كبير في السجلات. لقد وضعت سجلاتي في ملفات منفصلة حتى لا يتم الخلط بينها وبين السجلات الرئيسية في معهد المراجعين الداخليين.

جنبا إلى جنب مع طبيب حريص ومسؤول نظام العميل ، جربنا النظام. حتى أنهم لم يختبروا ، أي "التعذيب". أنشأنا مؤتمرات الفيديو في جميع الأوضاع الممكنة ومن جميع الأجهزة المتاحة. وشارك أطباء آخرون وجزء من موظفي المكتب البعيد في هذه اللعبة.

الشيء الرئيسي لم يكن التحقق من النظام (لم ينجح) ، ولكن لجمع أكبر قدر ممكن من البيانات. نتيجة لذلك ، اتضح أن:

  1. ما يقرب من 80 ٪ من محاولات إنشاء مؤتمر فيديو ناجحة.
  2. بعض الاتصالات التي تستخدم مرشحي ICE لـ IPv6 لا تعمل.
  3. من بين 5 مشغلين للهواتف المحمولة ، عمل 2 منهم فقط.

كل شيء تبين أنه بسيط - لا يمكنك الذهاب بعيدا على جوجل وحدها


أظهر تحليل المعلومات التي تم جمعها أن الاتصال من خلال خادم TURN من Google غير مستقر. إما أن يكون العبء عليها كبيرًا ، أو أنه مجرد خادم تجريبي لأولئك الذين بدأوا لتعلم التكنولوجيا. ولكن كحقيقة: إخفاقات متكررة للغاية. تحتاج خادم TURN / STUN الخاص بك!

السبب الثاني للفشل هو عناوين IPv6.local. لا يقبل خادم kurento مرشحي ICE بهذه العناوين. من الجيد أنه قبل إرسال جميع مرشحي ICE ، تمر الشفرة في يدي وقد قمت بتصفية IPv6.local.

يتم حل مشكلة مشغلي شبكات الهاتف المحمول ، مرة أخرى ، من خلال خادم TURN / STUN.
في ثلاثة من كل خمسة مشغلين للهاتف المحمول ، يكون NAT متماثلًا ، ولا يمكن لـ WebRTC اختراقه. مزيد من التفاصيل يمكن العثور عليها هنا: هل متماثل NAT فظيع؟

من العار أن هاتفي المحمول يعمل على بطاقة SIM لمشغل لم يكلف نفسه عناء الحماية المتماثلة. لذلك ، لم يكشف اختباري الأولي عن هذه المشكلة.


خادم TURN / STUN


تم اختيار حزمة resiprocate-turn-server كخادم لها.

لم يتم اختيارهم لفترة طويلة - إنه في مستودع أوبونتو القياسي - سهولة التثبيت والتحديثات التلقائية. لكن ليس من السهل للغاية التعامل مع الحسابات للاتصال: يتم تسجيل الدخول وكلمات المرور فقط من الملف ، ولهذا السبب يجب عليك إنشاء أداة إضافية أو برنامج نصي للتصدير من قاعدة بيانات الخادم الرئيسي.

في الوقت الحالي ، يتم إنشاء هذا الملف يدويًا وتوزع الحسابات من خلال مجموعة كلمات مرور بسيطة. يتم تنفيذ التفويض من خلال خادم MIS الرئيسي ، لذلك لا يتم اختراق الأمان. لكن الهيكل العام للنظام بأكمله يبدو قبيحاً. خطط لإعادة تشكيل هذه اللحظة.

الرحلة الثالثة إلى العميل


قمت بتصحيح الكود ، وقمت بتثبيت وتكوين خادم TURN / STUN ، وقمت بتطوير مجموعة من كلمات المرور وتوزيعها على العملاء في بداية مؤتمر الفيديو ، وبعد تحديث خوادم الإنتاج ، ذهبت إلى طبيب كنت أعرفه بالفعل.

إنه يعمل! الصيحة! جميع عمليات بدء المؤتمر ناجحة من جميع الأجهزة وفي جميع الأوضاع: يمكن للمريض من الحساب الشخصي الاتصال بالطبيب ، ويمكن للمعالج أثناء الاستقبال الاتصال بأخصائي التشخيص الوظيفي للحصول على استشارة إضافية ، ويمكن للأطباء أنفسهم ترتيب مؤتمر فيديو متعدد المستخدمين من فروع مختلفة من جميع أنحاء المدينة.

تعلمنا بالفعل من خلال تجربة مريرة ، شاركنا في اختبار دقيق مع خلق مصطنع لحالات الطوارئ. من موضوع هذه المقالة ، أسلط الضوء على الحاجة إلى وضع حد لوقت انتظار الاتصال. ينتظر WebRTC ، جنبا إلى جنب مع Kurento ، أن يبدأ البث لفترة غير محدودة ويأمل أن تكون وحدات بايت الفيديو على وشك الانتقال. اضطررت إلى تعيين مؤقت لمدة 10 ثوانٍ ، مما يعطي خطأً لخادم الإدارة إذا لم تصل البايتات مطلقًا.

بعد كل التحسينات


وأخيرا ، فإن النظام يعمل ويعمل بشكل جيد. تم إرسال المراجعات الأولى من المستخدمين في هذا المجال. وعلى الفور ظهر عدد كبير من رغبات واقتراحات التصميم والوظائف الإضافية والخطط الأخرى لمزيد من التطوير. بدأ العمل يغلي بقوة متجددة!

الآن تبدو بنية النظام الكاملة كما يلي:


النتائج:


في الختام ، أود أن أقول ما يلي:

أولاً ، WebRTC هي تقنية ممتازة ذات آفاق كبيرة ، ولكن من الصعب للغاية اختبارها وتصحيحها. قبل بدء التطوير ، من الضروري نشر شبكة بجميع أنواع الاتصالات التي قد يكون لدى العميل. والتصحيح من خلال نافذة معلومات المتصفح ليس أداة مريحة للغاية.

ثانياً ، الحمد للهبرو! أثناء العمل في هذا المشروع ، وجدت الكثير من المعلومات حول هذا المورد. جميع الروابط في هذه المقالة تؤدي إليها.

تقرر ترك مشروع عقد المؤتمرات عن بعد عبر الفيديو للدعم والتطوير في مؤسستنا ، ولن نقوم بتعهيده. في المستقبل ، لا يزال هناك الكثير من العمل:


ALL


أنا متأكد من أن تجربتي ستكون مفيدة ليس فقط للمطورين تحت WebRTC + Kurento ، ولكن أيضًا لأولئك الذين سيبدأون في تنفيذ مشاريع معقدة على قدم المساواة. إيلاء المزيد من الاهتمام للاختبار في ظروف أقرب ما يكون إلى الواقع.

ضع في اعتبارك المخاطر التي يمكن أن "تختفي" بها فرق الدعم الخاصة بأجهزتك الصغيرة - وهذا عمل غير متوقع وغير سارة للغاية.

Source: https://habr.com/ru/post/ar478536/


All Articles