WEBRTC 如何建立P2P连接

WEBRTC 如何建立P2P连接

媒体通道建立和信令通道建立

一.搜集候选地址

 

调用顺序

PeerConnection::SetLocalDescription->WebRtcSession::SetLocalDescription->

WebRtcSession::CreateChannels[创建传输通道和媒体通道,以视频为例]->

ChannelManager::CreateVideoChannel-> BaseChannel::Init_w->BaseChannel::InitNetwork_n->

BaseChannel::SetTransport_n-> TransportController::CreateTransportChannel_n->

TransportController::GetOrCreateTransport_n()->TransportController::CreateTransport_n()->

Transport::CreateChannel[创建P2PTransportChannel]->BaseChannel::SetTransportChannel_n->

BaseChannel::ConnectToTransportChannel[绑定P2P通道读写数据信号]->

WebRtcSession::MaybeStartGathering()[启动收集]->

TransportController::MaybeStartGathering_n()->Transport::MaybeStartGathering()->

P2PTransportChannel::MaybeStartGathering()->P2PTransportChannel::AddAllocatorSession[创建BasicPortAllocatorSession]->BasicPortAllocatorSession::StartGettingPorts-> BasicPortAllocatorSession::DoAllocate()[创建AllocationSequence]->AllocationSequence::CreateUDPPorts()[UDPPort::Create]|AllocationSequence::CreateStunPorts()[StunPort::Create]|AllocationSequence::CreateRelayPorts()[TurnPort::Create]|AllocationSequence::CreateTCPPorts()[TCPPort::Create]->BasicPortAllocatorSession::AddAllocatedPort()->

PortInterface:: PrepareAddress()[搜集候选地址UDPPort::PrepareAddress| TCPPort::PrepareAddress| TurnPort::PrepareAddress]->

TransportController::SetLocalTransportDescription->Transport::SetLocalTransportDescription->

Transport::ConnectChannels-> Transport::CallChannels->P2PTransportChannel::Connect()->

P2PTransportChannel::OnCheckAndPing()[向对方发起PING,但此时还未接收对方候选地址,还未调用P2PTransportChannel::AddConnection,PING定时触发执行]

 

a创建SOCKET并接收PEER数据

WEBRTC所有提供服务的都是以抽象接口形式提供.

以创建UDP为例

  1. 创建AsyncPacketSocket对象(实际是AsyncUDPSocket的抽象类), 并对外暴露SignalReadPacket信号,并绑定到

    TurnPort::OnReadPacketUDPPort:: OnReadPacketTCPPort::OnReadPacket

     

    AsyncPacketSocket* PacketSocketFactory:: CreateUdpSocket()

    由具体类BasicPacketSocketFactory实现,并在PeerConnectionFactory::Initialize()实例化

  2. 创建SocketFactory对象

    SocketServer::CreateDefault()在创建网络线程(network_thread_)时初始化,具体类为PhysicalSocketServer

  3. 创建AsyncSocket对象(实际SOCKET PhysicalSocket的抽象类),并对外暴露SignalReadEvent信号

    AsyncSocket* SocketFactory:: CreateAsyncSocket(int family, int type)->

    PhysicalSocketServer::CreateAsyncSocket->SocketDispatcher::Create->

    PhysicalSocket::Create(int family, int type)->

    SocketDispatcher::Initialize()->PhysicalSocketServer::Add(Dispatcher*pdispatcher)

     

    绑定SignalReadEvent信号

    AsyncUDPSocket::AsyncUDPSocket(AsyncSocket*socket) : socket_(socket) {

      socket_->SignalReadEvent.connect (this,&AsyncUDPSocket::OnReadEvent);

    }

     

     

b建立连接对象

  1. Connection对外暴露SignalReadPacket信号

  2. P2PTransportChannel::OnReadPacket绑定SignalReadPacket信号(P2PTransportChannel::AddConnection)

  3. TransportChannel (P2PTransportChannel抽象类),对外暴露SignalReadPacket信号

  4. BaseChannel::ConnectToTransportChannel(TransportChannel* tc)

    绑定TransportChannel 中的SignalReadPacket信号:

     tc->SignalReadPacket.connect(this, &BaseChannel::OnChannelRead);

     



二.发起连接对方

  1. 调用顺序

    PeerConnection::AddIceCandidate-> WebRtcSession::ProcessIceMessage->WebRtcSession::UseCandidate-> TransportController::AddRemoteCandidates-> Transport::AddRemoteCandidates->P2PTransportChannel::AddRemoteCandidate->

    P2PTransportChannel::CreateConnections-> P2PTransportChannel::CreateConnection->

    PortInterface:: CreateConnection()[UDPPort::CreateConnection|TCPPort::CreateConnection| TurnPort::CreateConnection]->Port::AddConnection-> P2PTransportChannel::AddConnection[绑定连接对象的数据接收信号]->P2PTransportChannel::OnCheckAndPing()[定时由MSG_CHECK_AND_PING触发]


Connection::Ping[对方PEER响应Connection::ReceivedPingResponse()完成P2P连接成功


{  set_receiving(true); set_write_state(STATE_WRITABLE);set_state(STATE_SUCCEEDED); }]




  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WebRTC (Web Real-Time Communication) 是一种用于实时通信的技术,特别适用于浏览器和移动设备之间的点对点(P2P)连接,比如视频聊天、文件共享等。在安卓应用中实现WebRTC P2P,你需要使用Google的开源库,如libjitsi-mobix(基于Jitsi Meet)或Janus Gateway。 以下是一个简单的步骤概述: 1. 添加依赖:在你的项目中引入WebRTC相关的库,例如`org.webrtc:webrtc:2.0.x`(具体版本根据Android Studio的要求选择)。 2. 初始化:在你的Activity或Fragment中初始化WebRTC引擎,创建PeerConnection实例,这通常在`onCreate`或`onResume`方法中完成。 ```java WebRtcEngineFactory engineFactory = new WebRtcEngineFactory(context); WebRtcEngine engine = engineFactory.createWebRtcEngine(); PeerConnectionFactory peerConnectionFactory = PeerConnectionFactory.createDefaultPeerConnectionFactory(); ``` 3. 创建VideoCapturer:如果你的应用需要获取本地视频流,你需要创建一个`VideoCapturer`。 4. 建立连接:创建`RTCPeerConnection`,加入媒体流,然后调用`createOffer()`生成SDP offer。 ```java SessionDescriptionDescription offer = peerConnectionFactory.createOffer(); peerConnection.setLocalDescription(offer); ``` 5. 处理ICE候选:接收并处理对端发送的ICE候选,使用`addIceCandidate()`方法。 6. 加入/接听呼叫:对于接收呼叫,需要调用`setRemoteDescription()`,然后可能需要进行SDP协商。 7. 实现数据通道:如果需要双向数据传输,使用DataChannel。 8. 关闭连接:在不需要的时候,记得调用`close()`方法释放资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值