去除webrtc中的signalserver

--------------------------------------json文件改为png图片,例如LocationJson.json文件改为LocaltionJson.png,其他文件同理。

    根据项目需求,将webrtc中的signalserver和IM服务器合并,所以在编写webrtc P2P文件传输模块的接口时要将signalserver剔除出去,只提供sdp和icecandiate信息交换的接口!解决方案: 本端A在InitializePeerConnection()后,再通过CreateOffer触发底层获取本地的session sdp信息,然后将会回调OnSuccess()函数,在OnSuccess中将参数webrtc::SessionDescriptionInterface*参数通过SetLocalDescription设置本端的sdp消息,然后将本地的sdp信息中再添加一个“type”的属性为“offer”,再将整个sdp信息转化为字符串保存到json文件LocaltionJson.json中,因为SetLocalDescription()函数同时也会触发本端A对本端icecandiadte信息的收集,收集icecandidate成功后会回调OnIceCandidate()函数,此函数的参数包含收集到的一条icecandidate信息(icecandidate的信息的一般会有多条,正常情况条数是四条以上),OnIceCandidate函数在回调多次后,再将收集到的本端的icecandidate信息保存到LocaltionJson.json中,最后LocaltionJson.json中的内容形如下:

{
   "icecandidate" : [
      "{\n   \"candidate\" : \"candidate:1660588956 1 udp 2122260223 192.168.5.133 61207 typ host generation 0 ufrag aw2DyRWg9U43N6k7 network-id 3\",\n   \"sdpMLineIndex\" : 0,\n   \"sdpMid\" : \"data\"\n}\n",
      "{\n   \"candidate\" : \"candidate:3820131624 1 udp 1686052607 27.47.6.146 61207 typ srflx raddr 192.168.5.133 rport 61207 generation 0 ufrag aw2DyRWg9U43N6k7 network-id 3\",\n   \"sdpMLineIndex\" : 0,\n   \"sdpMid\" : \"data\"\n}\n",
      "{\n   \"candidate\" : \"candidate:1756999046 1 udp 41885439 58.63.39.43 49622 typ relay raddr 27.47.6.146 rport 61207 generation 0 ufrag aw2DyRWg9U43N6k7 network-id 3\",\n   \"sdpMLineIndex\" : 0,\n   \"sdpMid\" : \"data\"\n}\n",
      "{\n   \"candidate\" : \"candidate:746155884 1 tcp 1518280447 192.168.5.133 64145 typ host tcptype passive generation 0 ufrag aw2DyRWg9U43N6k7 network-id 3\",\n   \"sdpMLineIndex\" : 0,\n   \"sdpMid\" : \"data\"\n}\n"
   ],
   "sdp" : "{\n   \"sdp\" : \"v=0\\r\\no=- 7717535530657010817 2 IN IP4 127.0.0.1\\r\\ns=-\\r\\nt=0 0\\r\\na=msid-semantic: WMS\\r\\nm=application 9 DTLS/SCTP 5000\\r\\nc=IN IP4 0.0.0.0\\r\\nb=AS:30\\r\\na=ice-ufrag:aw2DyRWg9U43N6k7\\r\\na=ice-pwd:TWsP6dwoGcl9o//vO6prjvXF\\r\\na=fingerprint:sha-256 6D:AB:89:7F:F8:DE:9A:A0:43:A2:18:18:46:E1:80:C6:E8:6A:FB:69:92:CF:18:DA:85:FD:11:49:C0:BD:E1:BA\\r\\na=setup:active\\r\\na=mid:data\\r\\na=sctpmap:5000 webrtc-datachannel 1024\\r\\n\",\n   \"type\" : \"answer\"\n}\n"
}

    相关的实例文件我将在附件中给出!这样本端的sdp和icecandidate信息收集完毕,然后我们将LocaltionJson.json文件传给对端B(通过ftp或者qq等文件传输工具都可以),并将之命名为LocaltionJson_p.json,对端B在收到LocaltionJson.json文件前是没有做peerconnection初始化之类的事情的,对端B解析收集到的LocationJson.json文件,从中提取出A的sdp和icecandidate信息,InitializePeerConnection初始化PeerConnectionFactoryInterface和PeerConnectionInterface,在初始化SessionConnection的相关参数后,通过sdp信息创建SessionDescriptionInterface对象C,再将端C通过SetRemoteDescription()设置为端B的远端sdp信息,如果从文件中收集到的sdp信息是"offer"类型的,那么还需要CreateAnswer()触发对端B的本地sdp信息的收集,同理通过AddIceCandidate()设置端A的icecandidate信息为本端B的remoteIceCandidate信息,同样端B在收集成功本段的sdp信息后将会回调OnSuccess()函数,在SetLocalDescription()后也会触发对本段icecandidate信息的收集,将这些信息作为字符串保存在B端的LocaltionJson.json文件中(此时的sdp信息中的type为“answer”),在回调OnIcecandidate()中将端B的icecandidate信息作为字符串保存在LocaltionJson.json文件中,A端和B端的localtionJson.json和localtionJson_p.json文件的格式是一样的,端B在收集完本端的sdp和icecandidate信息后,将localtionJson.json信息传给端A(任何网络文件传输的方式)。端A收到B发来的localtionJson.json文件信息将文件重命名为localtionJson_p.json,这样端A和端B中都存在localtionJson.json和localtionJson_p.json文件了,接下来端A解析LocaltionJson_p.json文件,从中提取出端B的sdp和icecandidate信息,端A根据此sdp信息创建IceCandidateInterface对象,最后一步AddIceCandidate(),如果网络稳定、路由没做特殊限制的话,端A和端B的SessionConnection将这么建立成功了!在端A通过SendData()发送文本给对面,经过测试端B是能够收到的!

-------------------------------------------------------------------------

----------------------------------------------------------------------------------------

  在通过signalserver中转信令的过程中,本端A发起CreateOffer()经过一系列的处理后,通过signalserver将SDP、Candidate信息中转给对端B,B在SetRemoteDescription()、CreateAnswer()后又将触发端B对本地sdp信息的收集。进而生成一个“Answer”类型的sdp信息,这个sdp信息将会在CreateSessionDescriptionObserver::OnSuccess()回调函数中传给外面,使用json格式加工后转发给signalserver,据我了解端B本地sdp信息收集的过程如下:

   A中CreateAnswer()->代理回调->PeerConnection::CreateAnswer()->WebRtcSession::CreateAnswer()->WebRtcSessionDescriptionFactory::CreateAnswer()->WebRtcSessionDescriptionFactory::SetCertificate()->WebRtcSessionDescriptionFactory::InternalCreateAnswer()->WebRtcSessionDescriptionFactory::PostCreateSessionDescriptionSucceeded()-> WebRtcSessionDescriptionFactory::SetCertificate()->WebRtcSessionDescriptionFactory::OnMessage()->A中OnSuccess()。

--------------------------------------------------------------------------

   将signalserver完全砍掉之后,制作了一个只有turnserver服务器的demo程序,demo分为发送方client1和接收方client2, client1和client2之间通过交换彼此的sdp和icecandidate信息后建立P2P连接动作,之前在本机上和另外一台机子上运行的时候,没问题,能够进行文字和文件的交互,后来在一台新的电脑上测试的时候,问题就出来了,各种文件操作都无效!刚开始还以为是程序代码问题,后来才知道原来是用户对文件操作的权限问题,就比如c++中的ifstream::open和ifstream::is_open操作,如果你没有权限对目标文件进行处理,那么你所使用的一些有关文件的操作将会失效,这势必会造成业务逻辑的紊乱,在此做记----------小心用户权限问题不知不觉让你找好久!

发布了47 篇原创文章 · 获赞 17 · 访问量 11万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章