很多因素都会阻碍网络连接,无论是人为错误、设备故障还是环境事件,尤其是在移动设备上。可靠的连接对于 WebRTC 应用程序中视频、音频和数据的成功传输至关重要。因此,当连接受到影响时,您需要快速找出问题并无缝地重新建立连接。
在这篇文章中,我们将看看如何为移动WebRTC应用实现一个重新连接机制。我们将这个机制称为 “看门狗”。
虽然 iOS 的前提是一样的,但下面的代码是针对Android应用程序的。
了解重连机制
我们的“看门狗”重新连接机制的工作原理是密切关注 WebRTC 流程中的两个重要元素:信令和IceConnectionStateChange 事件进入断开连接或失败状态。
信令涉及交换信息以建立连接,一旦建立连接,就允许交换其他消息。这在妥协情况下非常有用,例如网络事件发生变化,需要执行新的协商以保持对等连接。例如,用户已转移到移动网络或当前连接已被限制性防火墙终止。
在这方面,即使在建立对等连接之后也保持此通信开放至关重要。同样重要的是检测中断,例如终止的 WebSocket 连接或无响应的 REST 端点(假设这些是用于信令的方法),因为它们可能表明网络问题,因此有必要重置信令或完全重新连接 WebRTC。
IceConnectionChangeEvent 是一个发生在连接协商过程中的 PeerConnection 事件,更确切地说,它在每次ICE连接状态改变时被触发。一个健康的连接将从一个新的状态开始,通过检查过渡,然后连接,最后完成。
但是,在某些条件下可能会出现其他状态。Failed
和disconnected
是应用程序代码需要特别注意的两个状态,因为这些状态表明可能存在连接问题。
对于任何这些事件,目标是拥有适当的侦听器来相应地更新用户界面。他们还必须注册网络更改广播接收器,以便应用程序知道连接何时恢复,然后尝试自动重新连接。
这个过程如下图所示。
实现重连机制
如上所述,下面的代码仅适用于 Android 应用程序。
首先要做的是创建连接恢复后执行重连的任务。TimerTask类是实现此目的的好方法。此类任务的模板如下所示。
private var connectivityTask: TimerTask? = object : TimerTask() {
override fun run() {
//logic to re establish the Signaling Socket and initialize the PeerConnection
}
}
下一步是在代码中创建适当的事件侦听器。这将使应用程序知道网络何时不可用。例如,下面的代码显示了监听IceConnectionStateChange
事件并注册Broadcast Receiver
从 Android 系统接收网络变化消息的示例。这样,当连接恢复时,应用程序将收到通知。
override fun onIceConnectionChange
(
iceConnectionState: PeerConnection.IceConnectionState
) {
super.onIceConnectionChange(iceConnectionState)
// Check the state of the ICE connection
if (iceConnectionState == PeerConnection.IceConnectionState.DISCONNECTED) {
// use a counter to limit the attempts
if(attempt<10){
// initialize Connectivity Check Broadcast Receiver
val intentFilter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)
registerReceiver(connectivityReceiver, intentFilter)
// increase attempts counter
attempt++
} else {
// A permanent error: move user to login screen and display error message, etc
}
}
}
在广播接收器中,下面的代码显示了如何检查连接是否可用,如果可用,则安排重新建立 WebRTC 连接的连接任务。如果情况并非如此,则需要更新 UI 以反映网络的当前状态。
class ConnectivityReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
// get the information from the network state
val connManager = context.getSystemService(
Context.CONNECTIVITY_SERVICE
) as ConnectivityManager
val networkCapabilities = connManager.activeNetwork ?: return
val capabilities = connManager.getNetworkCapabilities(networkCapabilities)
// check if network is available
val isConnected = capabilities != null &&
(
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) ||
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
)
if (isConnected) {
// schedule Connectivity Task Here, after Android M
val connectivityWatchDog = Timer()
connectivityWatchDog.schedule(connectivityTask,0)
} else {
// internet is not available
}
}
}
一旦会话再次连接,请确保重置尝试计数器:
attempt=0
结论
正确处理连接丢失事件以及连接恢复后自我修复的能力对于任何 WebRTC 应用程序来说都是无价的。通过遵循本文中概述的方法,开发人员可以轻松地将此功能添加到他们的应用程序中,即使在网络故障的情况下也能提供强大的用户体验,同时还增加了弹性。
作者:JawadZeb
原文:https://webrtc.ventures/2023/06/implementing-a-reconnection-mechanism-for-webrtc-mobile-applications/
本文为原创稿件,版权归作者所有,如需转载,请注明出处:https://www.nxrte.com/jishu/webrtc/28327.html