版权声明:本文为博主原创文章,博客地址:https://blog.csdn.net/h784707460/article/details/79702275,未经博主允许不得转载。

一、 Android O wifi扫描机制

Android O的扫面场景可以归结为以下四种:

详见 Android wifi扫描机制(Android O)

1、 亮屏情况下,在Wifi settings界面,固定扫描,时间间隔为10s。

2、 亮屏情况下,非Wifi settings界面,二进制指数退避扫描,退避:interval*(2^n), 最小间隔min=20s, 最大间隔max=160s.
3、 灭屏情况下,有保存网络时,若已连接,不扫描,否则,PNO扫描,即只扫描已保存的网络。最小间隔min=20s,最大间隔max=20s*3.
4、 无保存网络情况下,固定扫描,间隔为5分钟,用于通知用户周围存在可用开放网络。
其中场景1/2/4中的扫描是全信道扫描,扫描控制逻辑在Android framework,涉及模块依次是WifiTracker、WifiConnectivityManager、WifiStateMachine。场景3中的扫描是PNO扫描,即只扫描已保存的网络,PNO扫描的控制逻辑涉及较广,从上到下(Qcom平台):WifiConnectivityManager、WifiScanner、WifiScanningServiceImpl、WifiNative、wificond、wifi driver、firmware。

二、 Android O wifi PNO扫描流程

灭屏时,WifiConnectivityManager中handleScreenStateChanged函数会判断是否触发PNO扫描。并且进行PNO扫描列表设置、PNO扫描间隔(20s)设置等PNO扫描的参数设置。

1>. WifiConnectivityManager.java
public void handleScreenStateChanged
startConnectivityScan(SCAN_ON_SCHEDULE); //开关屏幕时会触发对应的扫描
 
private void startConnectivityScan(boolean scanImmediately)
if (mScreenOn) {
startPeriodicScan(scanImmediately);
} else {
if (mWifiState == WIFI_STATE_DISCONNECTED && !mPnoScanStarted) {
startDisconnectedPnoScan(); //灭屏无连接时启动PNO扫描,不重复启动
}
 
private void startDisconnectedPnoScan()
if (listSize == 0) {
// No saved network
return; // 无保存网络时,不PNO扫描
}
 
//获取已保存网络列表。
//发送到firmware的PNO网络列表是受限的,如果已保存网络较多,该列表会被截断。选择网络的策略是根据连接频率排序及最后一次扫描到的网络中优先选择.
List<PnoSettings.PnoNetwork> pnoNetworkList = mConfigManager.retrievePnoNetworkList();
 
//设置PNO扫描间隔,20s
scanSettings.periodInMs = DISCONNECTED_PNO_SCAN_INTERVAL_MS;
 
//启动PNO扫描
mScanner.startDisconnectedPnoScan(scanSettings, pnoSettings, mPnoScanListener);  
mPnoScanStarted = true;
 
WifiScanner启动PNO扫描流程
2>. WifiScanner.java
public void startDisconnectedPnoScan(ScanSettings scanSettings, PnoSettings pnoSettings, PnoScanListener listener)
startPnoScan(scanSettings, pnoSettings, key);
 
private void startPnoScan(ScanSettings scanSettings, PnoSettings pnoSettings, int key)  
Bundle pnoParams = new Bundle();
scanSettings.isPnoScan = true;
pnoParams.putParcelable(PNO_PARAMS_SCAN_SETTINGS_KEY, scanSettings);
pnoParams.putParcelable(PNO_PARAMS_PNO_SETTINGS_KEY, pnoSettings);
mAsyncChannel.sendMessage(CMD_START_PNO_SCAN, 0, key, pnoParams);
 
WifiScanningServiceImpl中状态机中实现处理相关消息的逻辑
3>. WifiScanningServiceImpl.java
WifiPnoScanStateMachine //5个状态
-Default State
-Started State
-Hw Pno Scan state
-Single Scan state
-Sw Pno Scan state
 
StartedState
case WifiScanner.CMD_START_PNO_SCAN:
if (mScannerImpl.isHwPnoSupported(pnoSettings.isConnected)) {
    transitionTo(mHwPnoScanState);//@1 mHwPnoScanState=true
} else {
    transitionTo(mSwPnoScanState);
}
 
@1: mHwPnoScanSupported = mContext.getResources().getBoolean(
        R.bool.config_wifi_background_scan_support); //ture
 
HwPnoScanState
case WifiScanner.CMD_START_PNO_SCAN:
addHwPnoScanRequest(ci, msg.arg2, scanSettings, pnoSettings)
 
addHwPnoScanRequest
WifiNative.PnoSettings nativePnoSettings = convertSettingsToPnoNative(scanSettings, pnoSettings); //传递PNO scan settings参数
 
addPnoScanRequest(ci, handler, scanSettings, pnoSettings);
 
if (mScannerImpl.shouldScheduleBackgroundScanForHwPno()) { //@2 false
addBackgroundScanRequest(scanSettings);
}
 
@2: public boolean shouldScheduleBackgroundScanForHwPno() {
    return false;
} //WificondScannerImpl.java
 
addPnoScanRequest(ClientInfo ci, int handler, ScanSettings scanSettings,PnoSettings pnoSettings)
mActivePnoScans.addRequest(ci, handler, WifiStateMachine.WIFI_WORK_SOURCE, Pair.create(pnoSettings, scanSettings));
addInternalClient(ci);
 
4>. WificondScannerImpl.java
handleMessage
case WifiMonitor.SCAN_RESULTS_EVENT:
processPendingScans();
 
Wait for the active scan result to come back to reschedule other scans, unless if HW pno scan is running. Hw PNO scans are paused it if there are other pending scans,
 
// 等待主动扫描的结果来安排其他扫描,除非PNO扫描正在运行。如果有其他扫描HW PNO扫描会被暂停.
private void processPendingScans()
// If the PNO network list has changed from the previous request, ensure that
// we bypass the debounce logic and restart PNO scan.
if (isDifferentPnoScanSettings(newScanSettings)) {
    status = restartHwPnoScan(mPnoSettings);
} else {
    status = startHwPnoScan(mPnoSettings);
}
 
private boolean restartHwPnoScan(WifiNative.PnoSettings pnoSettings) or
private boolean startHwPnoScan(WifiNative.PnoSettings pnoSettings)
return mHwPnoDebouncer.startPnoScan(pnoSettings, mHwPnoDebouncerListener);
 
public boolean startPnoScan(WifiNative.PnoSettings pnoSettings, Listener listener)  
setPnoState(true)
 
private boolean setPnoState(boolean enable)
isSuccess = startPnoScanInternal();
 
private boolean startPnoScanInternal()
mWifiNative.startPnoScan(mPnoSettings)
 
5>. WifiNative.java
public boolean startPnoScan(PnoSettings pnoSettings)
return mWificondControl.startPnoScan(pnoSettings);
 
6>. WificondControl.java
public boolean startPnoScan(WifiNative.PnoSettings pnoSettings)
boolean success = mWificondScanner.startPnoScan(settings);
 
7>. /wificond/scanning/scanner_impl.cpp
ScannerImpl::startPnoScan
if (offload_scan_supported_ && StartPnoScanOffload(pno_settings)) {
    // scanning over offload succeeded
    *out_success = true;
} else {
    *out_success = StartPnoScanDefault(pno_settings);
}
 
ScannerImpl::StartPnoScanDefault
scan_utils_->StartScheduledScan(interface_index_,
                                       GenerateIntervalSetting(pno_settings),
                                       pno_settings.min_5g_rssi_,
                                       request_random_mac,
                                       scan_ssids,
                                       match_ssids,
                                       freqs,
                                       &error_code)
 
SchedScanIntervalSetting ScannerImpl::GenerateIntervalSetting
// {{20s, 3}, 3}, min=20s, max=20s*3
return SchedScanIntervalSetting{
{{fast_scan_interval, PnoSettings::kFastScanIterations}},
fast_scan_interval * PnoSettings::kSlowScanIntervalMultiplier};
 
8>. scan_utils.cpp
bool ScanUtils::StartScheduledScan

将PNO Scan参数传入kernel driver处理。

9>. Qcom WCN3990中, wifi driver将参数传入firmware,由firmware根据min=20s, max=20s*3的时间间隔控制扫描。
抓空口log发现,PNO扫描时间间隔为:20s、20s、60s、60s、....、60s

Android wifi PNO扫描流程(Andriod O)相关推荐

  1. Wi-Fi PNO扫描流程(Android P)

    简介:当手机灭屏情况下,有保存网络时,若已连接,不扫描,否则,PNO扫描,即只扫描已保存的网络.最小间隔min=20s,最大间隔max=20s*3=60s PNO 即Preferred Network ...

  2. Android-O wifi PNO扫描流程

    一. Android O wifi扫描机制 Android O的扫面场景可以归结为以下四种: 1. 亮屏情况下,在Wifi settings界面,固定扫描,时间间隔为10s. 2. 亮屏情况下,非Wi ...

  3. Android 9 wifi PNO 扫描

    PNO 即Preferred Network Offload,用于系统在休眠的时候连接WiFi 四种场景 亮屏情况: 在WiFi Settings界面,无论WiFi是否有连接,固定扫描时间间隔为10s ...

  4. Android WIFI认证的流程

    一.背景介绍   当用户打开wifi,扫描完成之后,当用户点击AP列表中一项并输入正确的密码后,就可以开始AP的连接过程了.点击连接到最终连接成功,这个过程中具体流程是如何实现的,这篇文章,将介绍一下 ...

  5. Android WiFi 打开关闭流程

    本文简单介绍下WiFi打开与关闭流程,参考源码Android P. 一.WiFi 开机自动打开流程 系统服务启动的时候会启动WifiService,在SystemService.PHASE_SYSTE ...

  6. android静态代码扫描,Android 静态代码扫描流程及工具说明

    1. 静态扫描流程 1.1 版本发布流程 大致分为5个阶段,静态代码扫描的工作在第3步进行,如图: 版本发布流程图 1.2 典型案例分析 [空指针]空指针引用 [内存泄露]Stream资源关闭 [性能 ...

  7. Android Wifi 主动扫描 被动扫描

    介绍主动扫描,被动扫描以及连接的wifi的扫描过程 参考文档 <802.11无线网络权威指南> <80_Y0513_1_QCA_WCN36X0_SOFTWARE_ARCHITECTU ...

  8. [转]Android Wifi 主动扫描 被动扫描

    介绍主动扫描,被动扫描以及连接的wifi的扫描过程 参考文档 <802.11无线网络权威指南> <80_Y0513_1_QCA_WCN36X0_SOFTWARE_ARCHITECTU ...

  9. Android wifi列表扫描 密码连接 多个wifi切换登录 广播状态等都在这里

    Wi-Fi 前言 需求 实现 扫描wifi列表 wifi广播 wifi连接登录 总结 前言 app里有个需求就是在应用内部开发一个wifi设置的功能,避免用户跳到手机wifi设置界面操作,之前没开发过 ...

最新文章

  1. 不得不知的小程序基本知识
  2. spring web参数传递
  3. 新书《活用UML-需求分析高手》 序
  4. 如何清除aspx网页中的flash缓存
  5. 牛X的web报表设计工具Grid++Report
  6. element隐藏组件滚动条scrollbar使用
  7. KMM+Compose 开发一个Kotlin多平台应用
  8. strtok(), strtok_s() 字符串分割函数
  9. OA(part2)--Outlier Evaluation Techniques
  10. python处理字符串数组慢_Python字符串处理 - str/bytes
  11. WordPress网站迁移数据最佳解决方案
  12. Mac os x 系统的发展史
  13. python requests网页爬取初探
  14. unicode编码表查询
  15. 离散数学 习题篇 —— 谓词公式练习
  16. LM317 电阻表格 电阻计算
  17. UVM 中的消息机制
  18. Lesson 3 Please send me a card 请给我寄一张明信片
  19. Qgis教程3:数据美化
  20. 信息熵与压缩编码基础

热门文章

  1. MS office二级错题记录【3】
  2. 阿里程序员试用期被淘汰,原因竟是?
  3. C++ 获取特定进程的CPU使用率转
  4. [2011JMAA]Remarks on the regularity criteria for generalized MHD equations
  5. 02-表格基本格式以及各个标签的属性、boder/cellpadding/cellspacing的区分、th标签、caption标签
  6. TinkerBoard-S 上手体验
  7. c语言位运算的妙用-程序优化
  8. 酷客scrm发布:陌生人扫码进群原来是这么回事
  9. Python学习笔录(四)--- 数据结构
  10. Python爬虫学习笔记(实例:淘宝商品信息定向爬虫)