JumpingYang001 / webrtc

webrtc source code from https://chromium.googlesource.com/external/webrtc
BSD 3-Clause "New" or "Revised" License
369 stars 284 forks source link

DataChannel断网重连 #3

Open tc214 opened 6 years ago

tc214 commented 6 years ago

杨前辈,你好! 我想在android中用DataChannel来发送数据进行文本聊天,由于手机网络不稳定,IceConnection连接状态会改变:->disconnect->failed->closed。如果要重新建立连接的话,比较麻烦,交换信令有好几个步骤,有没有机制进行自动重连呢? 我期望的最终效果是:手机网络断了后,在制定时间内恢复了,DataChannel仍然可用。 请多多指点,谢谢!

JumpingYang001 commented 6 years ago

参考这个:https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Session_lifetime#ICE_restart

ICE重启 有时,在WebRTC会话的生命周期中,网络状况会发生变化。例如,其中一个用户可能会从蜂窝网络过渡到WiFi网络,或者网络可能会拥塞。发生这种情况时,ICE代理可能会选择执行ICE重新启动。这是网络连接重新协商的过程,与初始ICE协商执行的方式完全相同,但有一个例外:媒体继续在原始网络连接上流动,直到新的网络连接启动并运行。然后媒体转移到新的网络连接,旧的关闭。

不同的浏览器在不同的条件下支持ICE重启。例如,由于网络拥塞,并非所有浏览器都会执行ICE重启。

有两个级别的ICE重新启动:完全ICE重新启动会导致会话中的所有媒体流重新协商。部分ICE重新启动允许ICE重新协商特定媒体流,而不是一次性重新谈判所有媒体流。但是,有些浏览器还不支持部分ICE重启。 <<<你如何触发每个?>>>

如果您需要以某种方式更改连接的配置(例如更改为不同的ICE服务器集),则可以在重新启动ICE之前通过使用更新的RTCConfiguration字典调用RTCPeerConnection.setConfiguration()来重新启动ICE之前完成此操作。

要显式触发ICE重新启动,只需调用RTCPeerConnection.createOffer(),指定iceRestart选项的值为true,即可启动协商过程。然后像以往一样处理连接过程。

tc214 commented 6 years ago

@JumpingYang001 多谢指点,今天试了好几次发现重启不了,我先在两个手机之间建立RTCPeerConnection,然后让一个手机断开WiFi,立马又恢复,程序大概5秒回调IceConnectState(),Ice状态变为disconnected,然后再过了6-7s,又回调IceConnectState(),Ice状态变为failed。我尝试在disconnected状态下,调用RTCPeerConnection.createOffer()来重启ICE,但是没有成功,offer已经创建成功了,没有回调onCandidate()。 如果通过这样的方式来恢复连接的话,TCP连接(交换SDP)还不能断开,感觉比较繁琐。

Janron commented 6 years ago

@JumpingYang001 我在iOS端实现一个客户端断网重连视频通话,在ice状态变为failed时,通过iceRestart设置为true执行createOffer后,能够重连上,但是有一个问题就是,断网的一端的视频不能实时传出给对方,但可以接收到对方的视频,然后双方的语音是ok的,不知道为什么之前断网端的视频媒体为啥不能重新传给对方,对方现在只显示了最后一次断网前的静止的一祯,请问有什么解决思路或方案吗?

Janron commented 6 years ago

说清楚下:一个客户端断网一段时间直到变为failed时再重新连上网络后发送iceRestart

JumpingYang001 commented 6 years ago

@Janron let me check.

JumpingYang001 commented 6 years ago

@janron , 你可以试下这个demo:https://webrtc.github.io/samples/src/content/peerconnection/restart-ice/ 如果demo没问题,那就是你的代码写得有问题。 如果demo有问题,那可能是bug,类似这个:https://github.com/webrtc/samples/issues/863

Janron commented 6 years ago

谢谢,我马上看看

caoMingLiang commented 5 years ago

@Janron 您好,针对断网重连的问题,我最近也在研究,我负责的也是iOS端,能不能跟您交流一下呢? QQ:903103242

smile525 commented 4 years ago

@JumpingYang001 您好,请问用 sip+webrtc打电话的场景下,呼叫端断网重连如何处理呢,该如何重启ICE,保持还是同一个通话,不重复创建会话?多谢指点