WEBRTC DataChannel 数据通道的 使用
Webrtc DataChannel 有2中数据传输协议DCT_RTP-不可靠 ,DCT_SCTP-可靠
前者必须加密SDES,当然可以去掉加密,后者必须DTLS,还没有去掉过,正在尝试...
以DCT_RTP传输为例
1.设置参数 rtc_configuration.enable_rtp_data_channel = true;
2.发起端 创建数据通道,必须在发SDP之前
如可在例子 Conductor::AddStreams()
std::string lable = "mydata";
webrtc::DataChannelInit init;
rtc::scoped_refptr<DataChannelInterface> pDataChannel;= (peer_connection_->CreateDataChannel(lable, &init));
3.发送数据,必须在会话建立成功后才可以发送,具体
可参考代码
bool DataChannel::Send(const DataBuffer& buffer) {
if (state_ != kOpen) {
return false;
}
const std::string message = "hello datachannel";
bool b = false;
if (pDataChannel)
b = pDataChannel->Send(webrtc::DataBuffer(message));
4.接收端必须实现DataChannelObserver
class FakeDataChannelObserver;
std::unique_ptr<FakeDataChannelObserver> observer_;
class FakeDataChannelObserver : public webrtc::DataChannelObserver {
public:
FakeDataChannelObserver()
: messages_received_(0),
on_state_change_count_(0),
on_buffered_amount_change_count_(0) {}
void OnStateChange() {
++on_state_change_count_;
}
void OnBufferedAmountChange(uint64_t previous_amount) {
++on_buffered_amount_change_count_;
}
void OnMessage(const webrtc::DataBuffer& buffer) {
++messages_received_;
printf("==================================messages_received_=%d=data=%s\n",(int)messages_received_,buffer.data. data());
}
size_t messages_received() const {
return messages_received_;
}
void ResetOnStateChangeCount() {
on_state_change_count_ = 0;
}
void ResetOnBufferedAmountChangeCount() {
on_buffered_amount_change_count_ = 0;
}
size_t on_state_change_count() const {
return on_state_change_count_;
}
size_t on_buffered_amount_change_count() const {
return on_buffered_amount_change_count_;
}
private:
size_t messages_received_;
size_t on_state_change_count_;
size_t on_buffered_amount_change_count_;
};
5.处理回调函数PeerConnectionObserver::OnDataChannel(DataChannelInterface* data_channel) = 0;
参考例子condutor.cc 重新实现如下:
void Conductor::OnDataChannel(webrtc::DataChannelInterface* channel)
{
observer_.reset(new FakeDataChannelObserver());
channel->RegisterObserver(observer_.get());//注册数据观察者
std::string lable = channel->label();
printf("==============lable=%s reliable=%d!\n",lable.c_str(),channel->reliable());
}