问题描述:

两个安卓设备之间已经完成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 permissionActivityCompat.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,真的让我很迷惑。。。。

Android Webrtc使用Wifi Direct无法建立P2P连接相关推荐

  1. WebRTC实时通信系列教程8 打通P2P连接和信令通信

    [转载请注明出处: http://blog.csdn.net/leytton/article/details/76836265]  PS:如果本文对您有帮助,请点个赞让我知道哦~ <WebRTC ...

  2. android wifi布局,Android使用 WiFi 建立 P2P 连接

    Wi-Fi 点对点(P2P)API 允许应用程序在无需连接到网络和热点的情况下连接到附近的设备.(Android Wi-Fi P2P 使用 Wi-Fi Direct™ 验证程序进行编译).Wi-Fi ...

  3. android官方的wifi direct demo.....,Android WIFI Direct开发实例演示

    实例 WIFIDirectDemo 改编 Android SDK 提供的实例,演示了通过 WIFI 搜寻连接点,建立连接,并进行数据传输的过程. 该实例包含 5 个类,说明说下: WIFIDirect ...

  4. Android网络通信之WiFi Direct

    使用Wi-Fi Direct技术可以让具备硬件支持的设备在没有中间接入点的情况下进行直接互联.Android 4.0(API版本14)及以后的系统都提供了对Wi-Fi Direct的API支持.通过对 ...

  5. Android 通过局域网udp广播自动建立socket连接

    Android开发中经常会用到socket通讯.由于项目需要,最近研究了一下这方面的知识. 需求是想通过wifi实现android移动设备和android平台的电视之间的文件传输与控制. 毫无疑问这中 ...

  6. Android Wifi Direct 安卓手机间wifi直连

    Wi-Fi Direct™的API允许应用程序不通过网络或热点,直接与周围的设备进行连接.应用程序可以迅速地查找附近的设备,交换信息.并且与蓝牙相比,Wi-Fi Direct的通讯范围更大. 通过Wi ...

  7. WiFi Direct详解(p2p使能,扫描,连接流程)基于Android8.1.0

    如果你也是年轻的程序员,关注我一起学习探讨 简介:Wi-Fi Direct技术的目的是在没有Wi-Fi AP的情况下由两个或者多个Wi-Fi设备互相之间进行高速的数据通信.通信完全基于TCP/IP 协 ...

  8. WiFi P2P, WiFi Direct, WFD

    1. WiFi P2P WiFi P2P,  Wi-Fi联盟推出的一项重要技术规范, 它支持多个Wi-Fi设备在没有AP的情况下相互连接.该规范的商品名为Wi-Fi Direct. 2. WiFi D ...

  9. Wifi P2p连接步骤整理

    原文:http://developer.android.com/training/connect-devices-wirelessly/wifi-direct.html 标题:Creating P2P ...

最新文章

  1. glusterfs初步实践一(类似NFS)
  2. leetcode算法题--Integer to Roman
  3. sql和mysql语法_SQL 与MySQL-基本语法介绍
  4. Mysql 存储引擎有哪些以及MyISAM和InnoDB区别
  5. 装载向导_麦德美爱法:异构集成时代的高阶封装载板金属化工艺
  6. MYSQL查表的字段名称,字段类型,字段长度,字段注释的SQL语句
  7. appweb ejs_具有快速路线的EJS
  8. 基于套接字SOCKET的及时聊天
  9. 6-2 函数式编程例一
  10. flink checkpoint 重启_Flink进阶教程:Checkpoint机制原理剖析与参数配置
  11. FFmpeg常用命令
  12. 车载一体机凯立德导航升级
  13. Linux虚拟网络基础 — Bridge
  14. 【golang】aws s3 go sdk
  15. 基于Python、scrapy爬取软考在线题库
  16. WhatsApp API介绍
  17. @SpringBootTest与@RunWith注解的区别
  18. uml 菱形_UML图符号的含义
  19. springboot+thymeleaf访问绝对路径图片、springboot配置虚拟路径
  20. easyUI可编辑表格编辑器添加事件

热门文章

  1. telnet 不是内部或外部命令,也不是可运行的程序解决方案:Windows 安装Telnet客户端
  2. 2021年煤矿井下爆破考试内容及煤矿井下爆破考试资料
  3. tunnel和channel区别
  4. 独立思考的迷失很可怕!!!
  5. REVIT建模如何 一键生成局部三维视图
  6. 机器人的雅克比矩阵、海森矩阵、可操作度雅克比矩阵
  7. 如何防范SQL注入式攻击?
  8. Pygame详解(十七):joystick 模块
  9. 医疗健康大数据基础知识
  10. Android Studio 3.0 多渠道打包 解决All flavors must now belong to a named flavor dimension