libdatachannel — это отдельная реализация каналов данных WebRTC, медиатранспорта WebRTC и WebSockets на C++17 с привязками C для платформ POSIX (включая GNU/Linux, Android, FreeBSD, Apple macOS и iOS) и Microsoft Windows. WebRTC — это стандарт W3C и IETF, обеспечивающий одноранговый обмен данными и мультимедиа в реальном времени между двумя устройствами.
Библиотека стремится быть одновременно простой и легкой с минимальными внешними зависимостями, чтобы обеспечить прямую связь между собственными приложениями и веб-браузерами без необходимости импортировать раздутую справочную библиотеку Google. Интерфейс состоит из несколько упрощенных версий API JavaScript WebRTC и WebSocket, присутствующих в браузерах, чтобы упростить разработку межсредовых приложений.
Его можно скомпилировать с несколькими бэкэндами:
Стек WebRTC полностью совместим с такими браузерами, как Firefox и Chromium, см. раздел «Совместимость» ниже. Кроме того, код, использующий каналы данных и веб-сокеты из библиотеки, можно скомпилировать в 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-echoes). Транспортировка мультимедиа не является обязательной и может быть отключена во время компиляции.
Стек протоколов:
Функции:
Обратите внимание, что для мультиплексирования мультимедиа поддерживается только режим SDP BUNDLE (RFC8843). Поведение эквивалентно политике только для пакетов JSEP: библиотека всегда согласовывает один уникальный сетевой компонент, где медиапотоки SRTP мультиплексируются с управляющими пакетами SRTCP (RFC5761) и трафиком данных SCTP/DTLS (RFC8261).
WebSocket — протокол выбора для сигнализации WebRTC. Поддержка необязательна и может быть отключена во время компиляции.
Стек протоколов:
Функции:
Спасибо Streamr, Vagon, Shiguredo, Deon Botha и Michael Cho за спонсирование этой работы!