Google is committed to advancing racial equity for Black communities. See how.
ترجمت واجهة Cloud Translation API‏ هذه الصفحة.
Switch to English

البدء مع اتصالات الأقران

تعد اتصالات النظراء جزءًا من مواصفات WebRTC التي تتعامل مع توصيل تطبيقين على أجهزة كمبيوتر مختلفة للتواصل باستخدام بروتوكول نظير إلى نظير. يمكن أن يكون الاتصال بين الزملاء بيانات فيديو أو صوت أو بيانات ثنائية عشوائية (للعملاء الذين يدعمون RTCDataChannel API). لاكتشاف كيفية اتصال زميلين ، يحتاج كلا العملاء إلى توفير تكوين خادم ICE. هذا إما STUN أو خادم TURN ، ودورهم هو توفير مرشحي ICE لكل عميل ثم يتم نقله إلى النظير البعيد. ويسمى هذا النقل لمرشحي ICE عادةً الإشارات.

إرسال الإشارات

تتضمن مواصفات WebRTC واجهات برمجة تطبيقات للاتصال بخادم ICE (إنشاء اتصال الإنترنت) ، ولكن مكون الإشارة ليس جزءًا منه. هناك حاجة إلى الإشارة من أجل مشاركة زملائهما في كيفية الاتصال. عادة يتم حل هذا من خلال واجهة برمجة تطبيقات الويب المستندة إلى HTTP العادية (أي خدمة REST أو آلية RPC أخرى) حيث يمكن لتطبيقات الويب ترحيل المعلومات الضرورية قبل بدء اتصال النظير.

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

 // Set up an asynchronous communication channel that will be
// used during the peer connection setup
const signalingChannel = new SignalingChannel(remoteClientId);
signalingChannel.addEventListener('message', message => {
    // New message from remote client received
});

// Send an asynchronous message to the remote client
signalingChannel.send('Hello!');
 

يمكن تنفيذ التشوير بعدة طرق مختلفة ، ولا تفضل مواصفات WebRTC أي حل محدد.

بدء اتصالات الأقران

تتم معالجة كل اتصال نظير بواسطة كائن RTCPeerConnection . يأخذ مُنشئ هذه الفئة كائن RTCConfiguration واحد RTCConfiguration له. يحدد هذا الكائن كيفية إعداد اتصال النظير ويجب أن يحتوي على معلومات حول خوادم ICE المطلوب استخدامها.

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

لبدء إعداد اتصال النظير من جانب الاستدعاء ، نقوم بإنشاء كائن RTCPeerConnection ثم ندعو createOffer() لإنشاء كائن RTCSessionDescription . يتم تعيين وصف الجلسة هذا على أنه الوصف المحلي باستخدام setLocalDescription() ثم يتم إرساله عبر قناة الإشارة الخاصة بنا إلى جانب الاستلام. نقوم أيضًا بإعداد مستمع لقناة الإشارة الخاصة بنا عندما يتم تلقي إجابة على وصف الجلسة المعروضة من جانب الاستلام.

 async function makeCall() {
    const configuration = {'iceServers': [{'urls': 'stun:stun.l.google.com:19302'}]}
    const peerConnection = new RTCPeerConnection(configuration);
    signalingChannel.addEventListener('message', async message => {
        if (message.answer) {
            const remoteDesc = new RTCSessionDescription(message.answer);
            await peerConnection.setRemoteDescription(remoteDesc);
        }
    });
    const offer = await peerConnection.createOffer();
    await peerConnection.setLocalDescription(offer);
    signalingChannel.send({'offer': offer});
}
 

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

 const peerConnection = new RTCPeerConnection(configuration);
signalingChannel.addEventListener('message', async message => {
    if (message.offer) {
        peerConnection.setRemoteDescription(new RTCSessionDescription(message.offer));
        const answer = await peerConnection.createAnswer();
        await peerConnection.setLocalDescription(answer);
        signalingChannel.send({'answer': answer});
    }
});
 

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

المرشحين ICE

قبل أن يتمكن زميلان من التواصل باستخدام WebRTC ، يحتاجان إلى تبادل معلومات الاتصال. نظرًا لأن ظروف الشبكة يمكن أن تختلف اعتمادًا على عدد من العوامل ، فعادة ما تستخدم خدمة خارجية لاكتشاف المرشحين المحتملين للاتصال بزميل. تسمى هذه الخدمة ICE وتستخدم إما خادم STUN أو خادم TURN. STUN هي اختصار لـ Trav Traval Utilities for NAT ، وعادة ما تستخدم بشكل غير مباشر في معظم تطبيقات WebRTC.

TURN (الاجتياز باستخدام Relay NAT) هو الحل الأكثر تقدمًا الذي يشتمل على بروتوكولات STUN ومعظم الخدمات التجارية المستندة إلى WebRTC تستخدم خادم TURN لإنشاء اتصالات بين النظراء. تدعم واجهة برمجة تطبيقات WebRTC كلاً من STUN و TURN مباشرة ، ويتم تجميعها بموجب مصطلح "اتصال الإنترنت" الأكثر اكتمالاً. عند إنشاء اتصال WebRTC ، عادة ما نقدم خادم أو أكثر من خوادم ICE في التكوين لكائن RTCPeerConnection .

هزيلة

بمجرد إنشاء كائن RTCPeerConnection ، يستخدم الإطار الأساسي خوادم ICE المتوفرة لجمع المرشحين لإنشاء الاتصال (مرشحي ICE). الحدث icegatheringstatechange على إشارات RTCPeerConnection في الحالة التي يكون فيها تجمع ICE ( new أو gathering أو complete ).

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

لجمع مرشحي ICE ، ما icecandidate سوى إضافة مستمع لحدث icecandidate . RTCPeerConnectionIceEvent المنبعث على ذلك المستمع على خاصية candidate التي تمثل مرشحًا جديدًا يجب إرساله إلى النظير البعيد (انظر الإشارة).

 // Listen for local ICE candidates on the local RTCPeerConnection
peerConnection.addEventListener('icecandidate', event => {
    if (event.candidate) {
        signalingChannel.send({'new-ice-candidate': event.candidate});
    }
});

// Listen for remote ICE candidates and add them to the local RTCPeerConnection
signalingChannel.addEventListener('message', async message => {
    if (message.iceCandidate) {
        try {
            await peerConnection.addIceCandidate(message.iceCandidate);
        } catch (e) {
            console.error('Error adding received ice candidate', e);
        }
    }
});
 

تم تأسيس الاتصال

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

 // Listen for connectionstatechange on the local RTCPeerConnection
peerConnection.addEventListener('connectionstatechange', event => {
    if (peerConnection.connectionState === 'connected') {
        // Peers connected!
    }
});
 

وثائق RTCPeerConnection API