去除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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章