Android Webrtc使用Wifi Direct无法建立P2P连接

问题描述:

两个安卓设备之间已经完成WiFi直连,但是依旧无法使用webrtc建立peer connection连接,也就无法实时传输媒体数据。

原因:

根据log调查后发现,主要的失败的原因在于此处:

basic_port_allocator.cc kr.ac.jejunu.ncl.wifi_direct_webrtc I (line 1360):Net[p2p-p2p0-13:192.168.49.x/24:Unknown:id=3]: Allocation Phase=Udp
port.cc kr.ac.jejunu.ncl.wifi_direct_webrtc I (line 186):Port[bf634000::1:0:local:Net[p2p-p2p0-13:192.168.49.x/24:Unknown:id=3]]: Port created with network cost 50
android_ne…monitor.cc kr.ac.jejunu.ncl.wifi_direct_webrtc I (line 377): Find network handle.
physical_s…_server.cc kr.ac.jejunu.ncl.wifi_direct_webrtc W (line 203): Binding socket to network address failed; result: -3
basic_pack…factory.cc kr.ac.jejunu.ncl.wifi_direct_webrtc E (line 54): UDP bind failed with error 101
stun_port.cc kr.ac.jejunu.ncl.wifi_direct_webrtc W (line 221): Port[bf634000::1:0:local:Net[p2p-p2p0-13:192.168.49.x/24:Unknown:id=3]]: UDP socket creation failed

p2p网口(WiFi直连所用到的网口)所对应的ice candidate收集过程失败(查看完整log可以看到ice candidate的收集过程从udp–>relay–>tcp依次都失败了),导致最终没有任何可用的ice candidate被收集到,因此无法进一步建立peer connection。
类似的问题在webrtc论坛里有讨论,点这里,即开启"IncludeWifiDirect/Enabled/"字段,然而这一字段开启后我的代码依旧无法收集到任何ice candidate。

错误相关源码

我主要从Binding socket to network address failed; result: -3这个错误码入手,到webrtc源码中进一步调查原因。
错误码-3,表示rtc::NetworkBindingResult::ADDRESS_NOT_FOUND,只有FindNetworkHandleFromAddress()返回为空时,才会报错错误码-3。
在这里插入图片描述
在这里插入图片描述

接着去看FindNetworkHandleFromAddress()为什么会返回空。该函数包括if-else两部分,if部分find_network_handle_without_ipv6_temporary_part_为field_trial,我们没有设置,默认为false。因此直接看else部分,else部分使用输入ip地址在network_handle_by_address_(类型为map)中查找network_handle。
在这里插入图片描述
继续通过Log发现,在我的实验中,network_handle_by_address_的size始终为0,这意味着没有任何network_handle被获取到。

继续去查看network_handle_by_address_在哪里添加了元素,下图中看到会在函数OnNetworkConnected_w()中进行赋值
关于的函数流调大致如下:
OnNetworkConnected_w() --> called by
OnNetworkConnected() --> called by
NotifyOfNetworkConnect() --> 作为JNI method called by
NetworkMonitor.java notifyObserversOfNetworkConnect() --> called by
NetworkMonitorAutoDetect.java的onNetworkConnect() callback
在这里插入图片描述
因此继续阅读NetworkMonitorAutoDetect.java中的wifi-p2p代码可能能发现相关的问题。在NetworkMonitorAutoDetect.java中,最终通过onWifiP2pGroupChange()回调函数通过WifiP2pGroup wifiP2pGroup参数将wifi-direct相关网络接口参数传递给onNetworkConnect()回调,使得底层最终获取到wifi-direct相关的network_handle。onWifiP2pGroupChange()回调函数由WifiP2pManager调用requestGroupInfo后,当GroupInfo available时会被触发。
在这里插入图片描述
在这里插入图片描述
然而,目前的问题在于,此回调函数作为参数传入的wifiP2pGroup始终为null,导致后面的network_handle不会继续传递给下层。
此处,WifiP2pManager、requestGroupInfo等接口都来自于Android SDK,Android SDK并没有返回我们期望的结果,因此可以推断猜测是Android相关设置没有正确设置。

最终检查的结果是,要正确使用wifi direct,除了在AndroidManifest.xml中申请权限:

 <uses-permission android:required="true" android:name="android.permission.ACCESS_FINE_LOCATION"/>
 <uses-permission android:required="true" android:name="android.permission.CoarseFineLocation"/>
 <uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES"/>

还要在代码中主动请求权限,这样就可以正确wifi direct相关的ice candidate地址了。

if (ActivityCompat.checkSelfPermission(mActivity, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
      // Request the missing permission
      ActivityCompat.requestPermissions(mActivity,
              new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
              50);
      ActivityCompat.requestPermissions(mActivity,
              new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
              51);
      ActivityCompat.requestPermissions(mActivity,
              new String[]{Manifest.permission.ACCESS_MEDIA_LOCATION},
              49);
}

最后吐槽:老版本android还是老版本webrtc库似乎不需要主动请求权限,webrtc也能正常gather到ice candidate,真的让我很迷惑。。。。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值