libdatachannel est une implémentation autonome de WebRTC Data Channels, WebRTC Media Transport et WebSockets en C++17 avec des liaisons C pour les plates-formes POSIX (y compris GNU/Linux, Android, FreeBSD, Apple macOS et iOS) et Microsoft Windows. WebRTC est une norme du W3C et de l'IETF permettant l'échange de données et de médias peer-to-peer en temps réel entre deux appareils.
La bibliothèque vise à être à la fois simple et légère avec un minimum de dépendances externes, pour permettre une connectivité directe entre les applications natives et les navigateurs Web sans avoir à importer la bibliothèque de référence volumineuse de Google. L'interface se compose de versions quelque peu simplifiées des API JavaScript WebRTC et WebSocket présentes dans les navigateurs, afin de faciliter la conception d'applications multi-environnements.
Il peut être compilé avec plusieurs backends :
La pile WebRTC est entièrement compatible avec les navigateurs comme Firefox et Chromium, voir Compatibilité ci-dessous. De plus, le code utilisant les canaux de données et les WebSockets de la bibliothèque peut être compilé tel quel dans WebAssembly pour les navigateurs avec datachannel-wasm.
libdatachannel est sous licence MPL 2.0 depuis la version 0.18, voir LICENCE (les versions précédentes étaient sous licence LGPLv2.1 ou ultérieure).
libdatachannel est disponible sur les ports AUR, vcpkg et FreeBSD. Les liaisons sont disponibles pour Rust et Node.js.
Voir BUILDING.md pour les instructions de construction.
Voir exemples pour des exemples d'utilisation complets avec un serveur de signalisation (sous MPL 2.0).
De plus, vous souhaiterez peut-être consulter la documentation de l’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 " );
La bibliothèque implémente les protocoles de communication suivants :
WebRTC permet l'échange de données et de médias en temps réel entre deux appareils via une connexion homologue (ou RTCPeerConnection), une connexion peer-to-peer signalée qui peut transporter à la fois des canaux de données et des pistes multimédias. Il est compatible avec les navigateurs Firefox, Chromium et Safari, ainsi qu'avec d'autres bibliothèques WebRTC (voir webrtc-echoes). Le transport multimédia est facultatif et peut être désactivé au moment de la compilation.
Pile de protocoles :
Caractéristiques:
Notez que seul le mode SDP BUNDLE est pris en charge pour le multiplexage multimédia (RFC8843). Le comportement est équivalent à la politique de bundle JSEP uniquement : la bibliothèque négocie toujours un composant réseau unique, où les flux multimédias SRTP sont multiplexés avec les paquets de contrôle SRTCP (RFC5761) et le trafic de données SCTP/DTLS (RFC8261).
WebSocket est le protocole de choix pour la signalisation WebRTC. La prise en charge est facultative et peut être désactivée au moment de la compilation.
Pile de protocole :
Caractéristiques:
Merci à Streamr, Vagon, Shiguredo, Deon Botha et Michael Cho pour avoir sponsorisé ce travail !