Google is committed to advancing racial equity for Black communities. See how.
این صفحه به‌وسیله ‏Cloud Translation API‏ ترجمه شده است.
Switch to English

شروع به کار با اتصالات همتا

اتصالات همکار بخشی از مشخصات WebRTC است که به اتصال دو برنامه در رایانه های مختلف برای برقراری ارتباط با استفاده از پروتکل همتا به همسالان می پردازد. ارتباط بین همسالان می تواند داده های باینری ویدیویی ، صوتی یا دلخواه باشد (برای مشتریانی که از RTCDataChannel پشتیبانی می کنند). برای کشف چگونگی اتصال دو همتا ، هر دو مشتری باید پیکربندی سرور ICE را ارائه دهند. این یا یک STUN یا یک سرور TURN است ، و وظیفه آنها ارائه نامزدهای ICE به هر مشتری است که سپس به همسالان از راه دور منتقل می شود. این انتقال نامزدهای ICE معمولاً سیگنالینگ نامیده می شود.

سیگنالینگ

مشخصات WebRTC شامل API ها برای برقراری ارتباط با سرور ICE (اتصال به اینترنت) است ، اما مؤلفه سیگنالینگ بخشی از آن نیست. سیگنالینگ لازم است تا دو همتا نحوه اتصال آنها را به اشتراک بگذارند. معمولاً این مسئله از طریق یک API وب معمولی مبتنی بر 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 به عنوان پارامتر خود استفاده می کند. این شیء چگونگی تنظیم اتصال همتا را تعریف می کند و باید حاوی اطلاعاتی در مورد سرورهای ICE برای استفاده باشد.

پس از ایجاد RTCPeerConnection ، بستگی به این دارد که آیا فرد تماس دهنده یا دریافت کننده همتا هستیم ، یک پیشنهاد یا پاسخ SDP ایجاد کنیم. پس از ایجاد یا ارائه پیشنهاد SDP ، باید از طریق کانال دیگری به همکار از راه دور ارسال شود. انتقال اشیاء SDP به همسالان از راه دور سیگنالینگ نامیده می شود و تحت پوشش مشخصات WebRTC نیست.

برای شروع راه اندازی اتصال همتا از طرف فراخوانی ، ما یک شیء RTCPeerConnection ایجاد می کنیم و سپس با createOffer() ایجاد createOffer() ایجاد createOffer() ایجاد) یک شیء RTCSessionDescription می 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 منتظر یک پیشنهاد ورودی هستیم. پس از setRemoteDescription() کار ، ما پیشنهاد دریافت شده را با استفاده از setRemoteDescription() . در مرحله بعدی ، برای ایجاد پاسخ به پیشنهاد دریافت شده ، با ایجاد ایجاد پاسخ createAnswer() تماس می 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 مخفف Session Traversal Utilities برای NAT است و معمولاً به طور غیر مستقیم در بیشتر برنامه های WebRTC استفاده می شود.

TURN (Traversal با استفاده از Relay NAT) راه حل پیشرفته تری است که پروتکل های STUN را در خود جای داده و بیشتر سرویس های تجاری مبتنی بر WebRTC از یک سرور TURN برای برقراری ارتباط بین همسالان استفاده می کنند. WebRTC API از STUN و TURN به طور مستقیم پشتیبانی می کند ، و تحت عنوان کامل تر اتصال به اینترنت جمع آوری می شود. هنگام ایجاد یک اتصال WebRTC ، ما معمولاً یک یا چند سرور ICE را در پیکربندی شیء RTCPeerConnection می دهیم.

ترفند ICE

هنگامی که یک شی RTCPeerConnection ایجاد شود ، چارچوب اصلی از سرورهای ICE ارائه شده برای جمع آوری نامزدها برای ایجاد اتصال (نامزدهای ICE) استفاده می کند. رویداد icegatheringstatechange در سیگنال های RTCPeerConnection در چه وضعیتی از گردهمایی ICE ( new ، gathering یا complete ) است.

در حالی که ممکن است یک فرد همکار منتظر بمانند تا جمع ICE تمام شود ، معمولاً استفاده از یک تکنیک "یخ برقی" بسیار مفیدتر است و هر یک از نامزدهای ICE را به محض کشف منتقل می کند. با این کار زمان تنظیم اتصال همسالان به طور قابل توجهی کاهش می یابد و اجازه می دهد تماس ویدیویی با تاخیر کمتری شروع شود.

برای جمع آوری نامزدهای ICE ، به سادگی یک شنونده را برای رویداد 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!
    }
});
 

مستندات API RTCPeerConnection