WebRTC Android移动应用程序如何实现重连机制

很多因素都会阻碍网络连接,无论是人为错误、设备故障还是环境事件,尤其是在移动设备上。可靠的连接对于 WebRTC 应用程序中视频、音频和数据的成功传输至关重要。因此,当连接受到影响时,您需要快速找出问题并无缝地重新建立连接。

在这篇文章中,我们将看看如何为移动WebRTC应用实现一个重新连接机制。我们将这个机制称为 “看门狗”。

虽然 iOS 的前提是一样的,但下面的代码是针对Android应用程序的。

了解重连机制

我们的“看门狗”重新连接机制的工作原理是密切关注 WebRTC 流程中的两个重要元素:信令和IceConnectionStateChange 事件进入断开连接或失败状态。

信令涉及交换信息以建立连接,一旦建立连接,就允许交换其他消息。这在妥协情况下非常有用,例如网络事件发生变化,需要执行新的协商以保持对等连接。例如,用户已转移到移动网络或当前连接已被限制性防火墙终止。

在这方面,即使在建立对等连接之后也保持此通信开放至关重要。同样重要的是检测中断,例如终止的 WebSocket 连接或无响应的 REST 端点(假设这些是用于信令的方法),因为它们可能表明网络问题,因此有必要重置信令或完全重新连接 WebRTC。

IceConnectionChangeEvent 是一个发生在连接协商过程中的 PeerConnection 事件,更确切地说,它在每次ICE连接状态改变时被触发。一个健康的连接将从一个新的状态开始,通过检查过渡,然后连接,最后完成。

但是,在某些条件下可能会出现其他状态。Failed disconnected 是应用程序代码需要特别注意的两个状态,因为这些状态表明可能存在连接问题。 

对于任何这些事件,目标是拥有适当的侦听器来相应地更新用户界面。他们还必须注册网络更改广播接收器,以便应用程序知道连接何时恢复,然后尝试自动重新连接。 

这个过程如下图所示。

WebRTC Android移动应用程序如何实现重连机制
重连机制的描述

实现重连机制 

如上所述,下面的代码仅适用于 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

(0)

相关推荐

发表回复

登录后才能评论