Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DataChannel断网重连 #3

Open
tc214 opened this issue May 14, 2018 · 9 comments
Open

DataChannel断网重连 #3

tc214 opened this issue May 14, 2018 · 9 comments

Comments

@tc214
Copy link

tc214 commented May 14, 2018

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

@JumpingYang001
Copy link
Owner

参考这个: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
Copy link
Author

tc214 commented May 15, 2018

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

@Janron
Copy link

Janron commented Jun 11, 2018

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

@Janron
Copy link

Janron commented Jun 11, 2018

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

@JumpingYang001
Copy link
Owner

@Janron let me check.

@JumpingYang001
Copy link
Owner

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

@Janron
Copy link

Janron commented Jun 11, 2018

谢谢,我马上看看

@caoMingLiang
Copy link

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

@smile525
Copy link

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants