libdatachannel es una implementación independiente de WebRTC Data Channels, WebRTC Media Transport y WebSockets en C++17 con enlaces C para plataformas POSIX (incluyendo GNU/Linux, Android, FreeBSD, Apple macOS e iOS) y Microsoft Windows. WebRTC es un estándar W3C e IETF que permite el intercambio de medios y datos peer-to-peer en tiempo real entre dos dispositivos.
La biblioteca pretende ser sencilla y liviana con dependencias externas mínimas, para permitir la conectividad directa entre aplicaciones nativas y navegadores web sin la molestia de importar la biblioteca de referencia inflada de Google. La interfaz consta de versiones algo simplificadas de las API JavaScript WebRTC y WebSocket presentes en los navegadores, para facilitar el diseño de aplicaciones entre entornos.
Se puede compilar con múltiples backends:
La pila WebRTC es totalmente compatible con navegadores como Firefox y Chromium; consulte Compatibilidad a continuación. Además, el código que utiliza canales de datos y WebSockets de la biblioteca se puede compilar tal cual en WebAssembly para navegadores con datachannel-wasm.
libdatachannel tiene licencia MPL 2.0 desde la versión 0.18, consulte LICENCIA (las versiones anteriores tenían licencia LGPLv2.1 o posterior).
libdatachannel está disponible en los puertos AUR, vcpkg y FreeBSD. Los enlaces están disponibles para Rust y Node.js.
Consulte BUILDING.md para obtener instrucciones de construcción.
Consulte ejemplos para ver ejemplos de uso completos con el servidor de señalización (en MPL 2.0).
Además, es posible que desee consultar la documentación de la API de C.
# 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 " );
La biblioteca implementa los siguientes protocolos de comunicación:
WebRTC permite el intercambio de datos y medios en tiempo real entre dos dispositivos a través de una conexión de igual a igual (o RTCPeerConnection), una conexión de igual a igual señalizada que puede transportar tanto canales de datos como pistas de medios. Es compatible con los navegadores Firefox, Chromium y Safari, y otras bibliotecas WebRTC (consulte webrtc-echoes). El transporte de medios es opcional y se puede desactivar en el momento de la compilación.
Pila de protocolos:
Características:
Tenga en cuenta que solo se admite el modo SDP BUNDLE para la multiplexación de medios (RFC8843). El comportamiento es equivalente a la política de solo paquete JSEP: la biblioteca siempre negocia un componente de red único, donde los flujos de medios SRTP se multiplexan con paquetes de control SRTCP (RFC5761) y tráfico de datos SCTP/DTLS (RFC8261).
WebSocket es el protocolo elegido para la señalización WebRTC. El soporte es opcional y se puede desactivar en el momento de la compilación.
Pila de protocolos:
Características:
¡Gracias a Streamr, Vagon, Shiguredo, Deon Botha y Michael Cho por patrocinar este trabajo!