libdatachannel เป็นการใช้งานแบบสแตนด์อโลนของ WebRTC Data Channels, WebRTC Media Transport และ WebSockets ใน C++17 พร้อมการเชื่อมโยง C สำหรับแพลตฟอร์ม POSIX (รวมถึง GNU/Linux, Android, FreeBSD, Apple macOS และ iOS) และ Microsoft Windows WebRTC เป็นมาตรฐาน W3C และ IETF ที่ช่วยให้สามารถแลกเปลี่ยนข้อมูลและสื่อระหว่างอุปกรณ์ทั้งสองแบบเรียลไทม์ได้
ไลบรารีมีเป้าหมายที่จะตรงไปตรงมาและมีน้ำหนักเบาโดยมีการพึ่งพาภายนอกน้อยที่สุด เพื่อให้สามารถเชื่อมต่อโดยตรงระหว่างแอปพลิเคชันดั้งเดิมและเว็บเบราว์เซอร์โดยไม่ต้องลำบากในการนำเข้าไลบรารีอ้างอิงที่ล้นหลามของ Google อินเทอร์เฟซประกอบด้วย JavaScript WebRTC และ WebSocket API ในเวอร์ชันที่ค่อนข้างเรียบง่ายซึ่งมีอยู่ในเบราว์เซอร์ เพื่อความสะดวกในการออกแบบแอปพลิเคชันข้ามสภาพแวดล้อม
สามารถคอมไพล์ได้หลายแบ็กเอนด์:
สแตก 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-echoes) การขนส่งสื่อเป็นทางเลือกและสามารถปิดใช้งานได้ในขณะคอมไพล์
สแต็คโปรโตคอล:
คุณสมบัติ:
โปรดทราบว่าเฉพาะโหมด SDP BUNDLE เท่านั้นที่รองรับสื่อมัลติเพล็กซ์ (RFC8843) ลักษณะการทำงานนี้เทียบเท่ากับนโยบายชุดรวม JSEP เท่านั้น: ไลบรารีจะเจรจาองค์ประกอบเครือข่ายที่ไม่ซ้ำกันเสมอ โดยที่สตรีมสื่อ SRTP จะถูกมัลติเพล็กซ์ด้วยแพ็กเก็ตควบคุม SRTCP (RFC5761) และการรับส่งข้อมูล SCTP/DTLS (RFC8261)
WebSocket เป็นโปรโตคอลทางเลือกสำหรับการส่งสัญญาณ WebRTC การสนับสนุนเป็นทางเลือกและสามารถปิดใช้งานได้ในขณะคอมไพล์
สแต็คโปรโตคอล:
คุณสมบัติ:
ขอขอบคุณ Streamr, Vagon, Shiguredo, Deon Botha และ Michael Cho ที่สนับสนุนงานนี้!