WEBRTC DataChannel使用



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());	
}



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值