libdatachannel é uma implementação autônoma de canais de dados WebRTC, WebRTC Media Transport e WebSockets em C++17 com ligações C para plataformas POSIX (incluindo GNU/Linux, Android, FreeBSD, Apple macOS e iOS) e Microsoft Windows. WebRTC é um padrão W3C e IETF que permite dados ponto a ponto em tempo real e troca de mídia entre dois dispositivos.
A biblioteca pretende ser simples e leve, com dependências externas mínimas, para permitir a conectividade direta entre aplicativos nativos e navegadores da web sem o incômodo de importar a inchada biblioteca de referência do Google. A interface consiste em versões um tanto simplificadas das APIs JavaScript WebRTC e WebSocket presentes nos navegadores, a fim de facilitar o design de aplicações em vários ambientes.
Ele pode ser compilado com vários backends:
A pilha WebRTC é totalmente compatível com navegadores como Firefox e Chromium, consulte Compatibilidade abaixo. Além disso, o código usando canais de dados e WebSockets da biblioteca pode ser compilado como está no WebAssembly para navegadores com datachannel-wasm.
libdatachannel está licenciado sob MPL 2.0 desde a versão 0.18, consulte LICENSE (versões anteriores eram licenciadas sob LGPLv2.1 ou posterior).
libdatachannel está disponível nas portas AUR, vcpkg e FreeBSD. As ligações estão disponíveis para Rust e Node.js.
Consulte BUILDING.md para obter instruções de construção.
Veja exemplos completos de uso com servidor de sinalização (em MPL 2.0).
Além disso, você pode querer dar uma olhada na documentação da API 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 " );
A biblioteca implementa os seguintes protocolos de comunicação:
O WebRTC permite a troca de dados e mídia em tempo real entre dois dispositivos por meio de uma conexão ponto a ponto (ou RTCPeerConnection), uma conexão ponto a ponto sinalizada que pode transportar canais de dados e trilhas de mídia. É compatível com os navegadores Firefox, Chromium e Safari e outras bibliotecas WebRTC (consulte webrtc-echoes). O transporte de mídia é opcional e pode ser desabilitado em tempo de compilação.
Pilha de protocolos:
Características:
Observe que apenas o modo SDP BUNDLE é compatível com multiplexação de mídia (RFC8843). O comportamento é equivalente à política somente de pacote JSEP: a biblioteca sempre negocia um componente de rede exclusivo, onde os fluxos de mídia SRTP são multiplexados com pacotes de controle SRTCP (RFC5761) e tráfego de dados SCTP/DTLS (RFC8261).
WebSocket é o protocolo preferido para sinalização WebRTC. O suporte é opcional e pode ser desabilitado em tempo de compilação.
Pilha de protocolos:
Características:
Obrigado a Streamr, Vagon, Shiguredo, Deon Botha e Michael Cho por patrocinarem este trabalho!