libdatachannel هو تطبيق مستقل لقنوات بيانات WebRTC وWebRTC Media Transport وWebSockets في C++ 17 مع روابط C لمنصات POSIX (بما في ذلك GNU/Linux وAndroid وFreeBSD وApple macOS وiOS) وMicrosoft Windows. WebRTC هو معيار W3C وIETF يتيح تبادل البيانات والوسائط من نظير إلى نظير في الوقت الفعلي بين جهازين.
تهدف المكتبة إلى أن تكون واضحة وخفيفة الوزن مع الحد الأدنى من التبعيات الخارجية، لتمكين الاتصال المباشر بين التطبيقات الأصلية ومتصفحات الويب دون عناء استيراد مكتبة Google المرجعية المتضخمة. تتكون الواجهة من إصدارات مبسطة إلى حد ما من JavaScript WebRTC وWebSocket APIs الموجودة في المتصفحات، وذلك لتسهيل تصميم التطبيقات عبر البيئات.
يمكن تجميعها مع واجهات خلفية متعددة:
إن حزمة WebRTC متوافقة تمامًا مع متصفحات مثل Firefox وChromium، راجع التوافق أدناه. بالإضافة إلى ذلك، قد يتم تجميع التعليمات البرمجية باستخدام Data Channels وWebSockets من المكتبة كما هو الحال في WebAssembly للمتصفحات التي تحتوي على datachannel-wasm.
تم ترخيص libdatachannel بموجب MPL 2.0 منذ الإصدار 0.18، راجع الترخيص (تم ترخيص الإصدارات السابقة بموجب LGPLv2.1 أو الأحدث).
قناة libdatachannel متاحة على منافذ AUR، وvcpkg، وFreeBSD. الروابط متاحة لـ Rust وNode.js.
راجع BUILDING.md للحصول على تعليمات البناء.
راجع الأمثلة للحصول على أمثلة الاستخدام الكاملة مع خادم الإشارات (تحت MPL 2.0).
بالإضافة إلى ذلك، قد ترغب في إلقاء نظرة على وثائق C API.
# include " rtc/rtc.hpp "
rtc::Configuration config;
config.iceServers.emplace_back( " mystunserver.org:3478 " );
rtc::PeerConnection pc (config);
pc.onLocalDescription([](rtc::Description sdp) {
// Send the SDP to the remote peer
MY_SEND_DESCRIPTION_TO_REMOTE ( std::string (sdp));
});
pc.onLocalCandidate([](rtc::Candidate candidate) {
// Send the candidate to the remote peer
MY_SEND_CANDIDATE_TO_REMOTE (candidate. candidate (), candidate. mid ());
});
MY_ON_RECV_DESCRIPTION_FROM_REMOTE ([&pc](std::string sdp) {
pc. setRemoteDescription ( rtc::Description (sdp));
});
MY_ON_RECV_CANDIDATE_FROM_REMOTE ([&pc](std::string candidate, std::string mid) {
pc. addRemoteCandidate ( rtc::Candidate (candidate, mid));
});
pc.onStateChange([](rtc::PeerConnection::State state) {
std::cout << " State: " << state << std::endl;
});
pc.onGatheringStateChange([](rtc::PeerConnection::GatheringState state) {
std::cout << " Gathering state: " << state << std::endl;
});
auto dc = pc.createDataChannel( " test " );
dc-> onOpen ([]() {
std::cout << " Open " << std::endl;
});
dc-> onMessage ([](std::variant<rtc::binary, rtc::string> message) {
if (std::holds_alternative<rtc::string>(message)) {
std::cout << " Received: " << get<rtc::string>(message) << std::endl;
}
});
std::shared_ptr<rtc::DataChannel> dc;
pc.onDataChannel([&dc](std::shared_ptr<rtc::DataChannel> incoming) {
dc = incoming;
dc-> send ( " Hello world! " );
});
rtc::WebSocket ws;
ws.onOpen([]() {
std::cout << " WebSocket open " << std::endl;
});
ws.onMessage([](std::variant<rtc::binary, rtc::string> message) {
if (std::holds_alternative<rtc::string>(message)) {
std::cout << " WebSocket received: " << std::get<rtc::string>(message) << endl;
}
});
ws.open( " wss://my.websocket/service " );
تطبق المكتبة بروتوكولات الاتصال التالية:
يسمح WebRTC بتبادل البيانات والوسائط في الوقت الفعلي بين جهازين من خلال اتصال نظير (أو RTCPeerConnection)، وهو اتصال نظير إلى نظير مُشار إليه يمكنه حمل كل من قنوات البيانات ومسارات الوسائط. وهو متوافق مع المتصفحات Firefox وChromium وSafari ومكتبات WebRTC الأخرى (انظر أصداء webrtc). يعد نقل الوسائط اختياريًا ويمكن تعطيله في وقت الترجمة.
مكدس البروتوكول:
سمات:
ملاحظة: يتم دعم وضع SDP BUNDLE فقط لتعدد إرسال الوسائط (RFC8843). السلوك مكافئ لسياسة حزمة JSEP فقط: تتفاوض المكتبة دائمًا مع مكون شبكة فريد واحد، حيث يتم مضاعفة تدفقات وسائط SRTP مع حزم التحكم SRTCP (RFC5761) وحركة بيانات SCTP/DTLS (RFC8261).
WebSocket هو البروتوكول المفضل لإشارات WebRTC. الدعم اختياري ويمكن تعطيله في وقت الترجمة.
مكدس البروتوكول:
سمات:
شكرًا لـ Streamr وVagon وShiguredo وDeon Botha وMichael Cho لرعاية هذا العمل!