wifi和AP共存方案研究--Android8.0

2023-11-01

 

目录

Android原生不支持Wifi和AP同时打开

Android对同时开Wifi和AP的限制地方

1.设置:

2.framework

3.Fwk与HAL层的代理

4.HAL层部分

可能遇到的问题

附:


想象这样一个场景:你的手机通过某种方式连接上了一个wifi,有时你无法把连接上的wifi密码告诉别人,所以你决定用手机开个热点给别人使用。如果你运气好,你手机能同时打开wifi和ap,如果运气不好,打开热点的时候,wifi就断开了。那么Android 到底能不能同时支持wifi和ap同时打开呢?

 

Android原生不支持Wifi和AP同时打开

Android原生是不支持开Wifi的同时,打开AP供其他设备连接的。目前市场上有部分手机支持两者同时打开使用了,比如小米8 。 如果我们想实现Wifi共存的功能要怎么处理呢?

(首先当然是你的wifi芯片得支持此功能,接着你得把驱动调好。本人不搞驱动,这块不了解。这里不多说)

 

Android原生为什么不支持同时打开wifI和AP? 让我们先看下打开AP的流程,可参考https://blog.csdn.net/sinat_20059415/article/details/82556109,主要是要熟悉一下Wifi状态机这块。

 

Android对同时开Wifi和AP的限制地方

下面从应用到底层说明下Wifi和ap不能同时打开的限制地方。

1.设置:

在WifiEnabler.java 中打开wifi时,会做下面的判断去关闭热点。

if (mayDisableTethering(isChecked)) {
     mConnectivityManager.stopTethering(ConnectivityManager.TETHERING_WIFI);
}

 

2.framework

如果你已经把之前的链接大致看了一遍,这里会好理解些。核心在这里,在WifiController.java 和WifiStateMachine.java 中有一些XXXState(比如DefaultState)是表示Wifi当前所处状态的,但是google原生把wifi和热点设置成了2种互斥的状态,即不能同时处于wifi和热点打开的状态。我们要做的就是想办法把wifi和ap的状态给分隔开。

比如对于WifiController.java你可以用一个WifiStaController 和WifiApController分别去表示wifi和热点的状态。然后把使用到WifiController的地方根据其是wifi还是热点,分别使用WifiStaController和WifiApController去代替。

在WifiStateMachine中AP状态只有一种,即SoftApState。进入到SoftApState后,热点的状态具体是由SoftApManager.java 中的SoftApStateMachine进行管理的,这里只有IdleState和StartedState两种状态。这里倒没什么要改的。

 

3.Fwk与HAL层的代理

在设置Wifi或AP的过程中,都是通过WifiVendorHal,HalDeviceManager去操作底层芯片啥的。这两个文件中也有些地方对2种状态做了互斥处理,我们也需要放开。这个部分的核心是为了给wifi或ap获取对应的interface接口。

 

4.HAL层部分

在hardware\interfaces\wifi\1.1\default\wifi_chip.cpp 中的createApIfaceInternal和handleChipConfiguration函数中也有些互斥。hardware\interfaces\wifi\1.1\default\wifi_legacy_hal.cpp中的start函数处的CHECK 我本地调试时不去掉会执行出错,这个应该是检查芯片配置啥的。

 

可能遇到的问题

至此wifi和AP不能同时打开的互斥条件就算处理完了。如果你运气不好,你可能遇到了下面这些问题:

  1. 把驱动修改为共存模式后,设置中wifi扫描不到wifi,但命令可以扫描到。
  2. 用ifconfig 查看时,wlan0 和ap0处于同一个网段下192.168.43.1(如果你连接的是路由器,说不定不会遇到此问题),然后同时开了wifi和ap后连接上了wifi,但上不了网。
  3. 有时你设置的ap 用其他手机搜索不到。

 

关于问题一:

应该是扫描命令下发到ap0去了,所有在fwk层获取interface时,需要把interface_name作为参数传下去,以便获取到正确的interface,这个应该算google原生的一个bug。

可以试着把https://android.googlesource.com/platform/frameworks/opt/net/wifi/+/c7685b40d77b12820c5b04013592834025086cef 和 

https://github.com/FredProject/platform_system_connectivity_wificond/commit/47443838f760908b9a6571aed4f4fa4e93ad37bc 这两个 patch 合进去试试。

关于问题二:

android源码中默认的wifi共享的网段就是192.168.43.

你可以试着修改frameworks\base\services\core\java\com\android\server\connectivity\tethering\TetheringConfiguration.java 中DHCP_DEFAULT_RANGE的192.168.43.X 改为其他的。

frameworks\base\services\core\java\com\android\server\connectivity\tethering\TetherInterfaceStateMachine.java 中的WIFI_HOST_IFACE_ADDR 也改掉。

关于问题三:

可搜下kernel log, 是否有类似

[wlan][273]p2pRoleFsmRunEventStartAP:(P2P INFO) p2pRoleFsmRunEventStartAP: start AP at CH 14 NSS=2.

这种log,上面的Channel是14.

在frameworks\base\wifi\java\android\net\wifi\WifiConfiguration.java 中的apChannel 中默认是0。 0代表会自动选择一个可用的信道,但是国内只支持1~11 信道,因此它自动选择的信道可能在国内用不了。(我觉得这个问题芯片厂商应该要做个控制能设置自由选择的信道的范围的,可惜了有时厂商不给力。。。。)

 

至此,我想应该就改好了。如果你走到了这一步,你会发现,你弄了应用到fwk到HAL层,就差驱动没有涉猎了。你说你牛不牛B,值不值得吹嘘一波。你说这篇文章值不值得点赞收藏加关注!

然而另一方面你会发现,网络通信的核心其实你没搞。出了任何问题,你依然提心吊胆,就问你怕不怕。。。


附:

修改默认AP名:frameworks\opt\net\wifi\service\java\com\android\server\wifi\WifiApConfigStore.java 中的getDefaultApConfiguration

设置AP默认不自动关闭:在packages\apps\SettingsProvider\src\com\android\providers\settings\DatabaseHelper.java  中的 loadSystemSettings 函数里面添加 loadSetting(stmt, "wifi_hotspot_auto_disable", 0);

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

wifi和AP共存方案研究--Android8.0 的相关文章

随机推荐

  • hive库操作示例

    hive库操作示例 1 常规表 创建数据库 CREATE DATABASE mydatabase 使用数据库 USE mydatabase 创建表 CREATE TABLE mytable id INT name STRING age IN
  • Linux卸载home独立分区

    最近编译了一个新的Linux内核 安装的时候如果直接make install 那么镜像文件会和原来的系统放在一块 登录的时候账户 桌面配置等都是一样的 只是内核不一样 其它都是共享的 看不出两个内核有啥区别 因此想在一个独立的分区放置新的内
  • Spring Web MVC和Hibernate的集成

    网上看到很多关于Spring与Hibernate的集成的文章 奈何由于那些文章写作时间较早 很多都是Spring 3 和Hibernate 4等较旧的版本 所以我在这里使用更新的版本来说明一下 添加项目依赖 首先我们需要一个Java Web
  • egg框架(用户鉴权,token验证,以及前端简略配置)

    最近在研究阿里出的egg 想写一个后台管理系统 但是用了egg nunjucks之后 感觉它的模板渲染很僵硬 模板页面无法直接调用service的方法来操作数据库 但是用常规的form表单提交到路由 感觉又很奇怪 还是要请求api 那我为什
  • Ubuntu显示美化 优化 常用插件

    Ubuntu显示美化 优化 常用插件 1 安装 Extension Manager 2 网速显示 不显示总流量记得关掉 3 顶部透明度 4 左侧dock导航透明度 5 过渡动画 2022 01 22 毛玻璃效果 和 程序启动背景墙效果 20
  • TortoiseGit提示No supported authentication methods available异常

    TortoiseGit他属于git的客户端 可有可无 说白了就是将git命令给我们整理成了可直接操作的按钮 本地代码是使用了SSH的方式去拉取的代码 但是通过TortoiseGit pull代码的时候发生了如下异常 而GitBash却可以正
  • 蓝桥杯单片机第14届模拟题第三套

    总的来说14届省赛的模拟题都是考串口通信的 都做完基本没什么问题了 题目 代码 main函数 include stc15f2k60s2 h include intrins h include iic h include stdio h sb
  • 安卓手机硬改软件介绍。改机软件 改手机参数

    https www bilibili com video BV1Pp4y1S7hK 视频地址 硬改无需root权限 改完就是新机 手机端能一键操作的都是软改 就好比你女朋友化妆了还是你女朋友 硬改相当于换了一个新的女朋友
  • 初学者应该这样看盘

    首先在 开盘 时要看集合 竞价 的股价和成交额 看是高开还是低开 就是说 和昨天的收盘价相比价格是高了还是低了 它表示出市场的意愿 期待今天的股价是上涨还是下跌 成交量的大小则表示参与买卖的人的多少 它往往对一天之内成交的活跃程度有很大的影
  • Unity3D Glow Effect 自发光 颜色溢出效果

    unity自带的image effect中的一个摄像机特效 但它是针对全屏幕渲染的 而且我们要明确一点 只需你知道我们场景中的GameObject的材质shader通过alpha通道进行控制这个光晕的 也就是说将alpha变成0那么将是原来
  • 合工大 编译原理 实验

    目前仅有实验一二三四 Windows桌面应用程序项目 开发语言 c 开发环境 Visual Studio 实验一 GitHub 实验二 传送门 实验三 传送门 实验四 传送门 实验一大致功能 支持程序运行时输入关键词 支持已保存关键词的表格
  • Ethereum私有网络的搭建

    好久没有弄以太坊 因为工作需要 需要搭建一个以太坊的私有网络 private network 0 实验环境 3台阿里云服务器 Ubuntu 16 04 分别简称为ali1 ali2 ali3 1 Ethereum节点的编译 安装 这一点无需
  • DAY40:贪心算法(九)单调递增的数字(贪心的思路)

    文章目录 738 单调递增的数字 暴力解也需要看一下 暴力解写法 注意 必须引入 isIncreasing 变量的原因 贪心思路 遍历顺序 最开始的写法 debug测试 逻辑错误 修改版 debug测试 int转化为字符串的原因 to st
  • QMap的排序

    QMap排序方法运用实例 QMap的升序排序 巧妙避开默认排序规则 QMap 如何根据value排序 QMap排序方法运用实例 QMap排序方法运用实例 Music 爱好者的博客 CSDN博客 QVector
  • MsSqlServerJdbcUrl encrypt、trustServerCertificate、trustStore、trustStorePassword hostNameInCertif

    原文链接 为了允许应用程序使用 TLS 加密 从 1 2 版开始 Microsoft JDBC Driver for SQL Server 引入了以下连接属性 encrypt trustServerCertificate trustStor
  • 用CH340给STM32C8T6和野火stm32F103Mini板下载程序需要注意的三个问题

    一 给stm32c8t6下载 1 CH340的引脚RX TX的接法 CH340模块与stm32的串口引脚关系为 RX对应TX TX对应RX 通过串口给stm32烧录程序时要用串口1 即用A9和A10脚 其中A9为TX引脚 A10为RX引脚
  • oracle vm virtualbox右ctrl切换显示模式

    virtualbox里面有个HOME键 注意这个HOME键不一定是键盘上的HOME 而是设定的某一个键 默认的右CTRL 就是所说的HOME 有时候设置的自己不知道怎么切换回来或者找不到控制栏了 就可以按快捷切换 快捷键就是右边的Ctrl
  • C++类模板中的友元函数的声明和定义分别放在哪里

    前面提到了模板的声明和定义推荐都放在头文件中 那么该类中的友元函数的声明和定义该放在哪里呢 因为友元函数并不属于这个类 按照习惯 我们一般把声明放在类中 而把定义放在类的外面 但对于类模板来说 这样就出问题了 很多编译器并不支持将友元函数的
  • 生信笔记

    第一个问题 研究最热门的基因是什么 在NCBI的ftp里面关于人的一些基因信息 在 ftp ftp ncbi nlm nih gov gene 下载即可 其中 gene2pubmed gz 这个是NCBI的entrez ID号对应着该基因发
  • wifi和AP共存方案研究--Android8.0

    目录 Android原生不支持Wifi和AP同时打开 Android对同时开Wifi和AP的限制地方 1 设置 2 framework 3 Fwk与HAL层的代理 4 HAL层部分 可能遇到的问题 附 想象这样一个场景 你的手机通过某种方式