android wifi扫描间隔,Android 8 wifi 扫描时间间隔

wifi setting界面扫描时间间隔:10s

不在wifi setting界面,扫描时间间隔,最小20s,然后按找2倍的间隔进行递增,40s,60s..., 最大160s

PNO 即Preferred Network Offload,用于系统在休眠的时候连接WiFi

1. wifi setting界面

packages\apps\Settings\src\com\android\settings\wifi\WifiSettings.java

public void onStart() {

mWifiTracker.startTracking();

frameworks\base\packages\SettingsLib\src\com\android\settingslib\wifi\WifiTracker.java

public void startTracking() {

synchronized (mLock) {

registerScoreCache();

// 是否显示wifi评分的UI

mNetworkScoringUiEnabled =

Settings.Global.getInt(

mContext.getContentResolver(),

Settings.Global.NETWORK_SCORING_UI_ENABLED, 0) == 1;

// 是否显示wifi速度

mMaxSpeedLabelScoreCacheAge =

Settings.Global.getLong(

mContext.getContentResolver(),

Settings.Global.SPEED_LABEL_CACHE_EVICTION_AGE_MILLIS,

DEFAULT_MAX_CACHED_SCORE_AGE_MILLIS);

resumeScanning();

if (!mRegistered) {

mContext.registerReceiver(mReceiver, mFilter);

// NetworkCallback objects cannot be reused. http://b/20701525 .

mNetworkCallback = new WifiTrackerNetworkCallback();

mConnectivityManager.registerNetworkCallback(mNetworkRequest, mNetworkCallback);

mRegistered = true;

}

}

}

扫描服务

public void resumeScanning() {

if (mScanner == null) {

mScanner = new Scanner();

}

mWorkHandler.sendEmptyMessage(WorkHandler.MSG_RESUME);

if (mWifiManager.isWifiEnabled()) {

mScanner.resume(); // 发送扫描消息

}

}

//

class Scanner extends Handler {

static final int MSG_SCAN = 0;

private int mRetry = 0;

void resume() {

if (!hasMessages(MSG_SCAN)) {

sendEmptyMessage(MSG_SCAN);

}

}

void forceScan() {

removeMessages(MSG_SCAN);

sendEmptyMessage(MSG_SCAN);

}

void pause() {

mRetry = 0;

removeMessages(MSG_SCAN);

}

@VisibleForTesting

boolean isScanning() {

return hasMessages(MSG_SCAN);

}

@Override

public void handleMessage(Message message) {

if (message.what != MSG_SCAN) return;

if (mWifiManager.startScan()) { // 启动扫描

mRetry = 0;

} else if (++mRetry >= 3) {

mRetry = 0;

if (mContext != null) {

Toast.makeText(mContext, R.string.wifi_fail_to_scan, Toast.LENGTH_LONG).show();

}

return;

}

// 扫描界面扫描间隔。

sendEmptyMessageDelayed(MSG_SCAN, WIFI_RESCAN_INTERVAL_MS);

}

}

//private static final int WIFI_RESCAN_INTERVAL_MS = 10 * 1000;

2. 不在wifisetting界面,亮屏情况下。

frameworks\opt\net\wifi\service\java\com\android\server\wifi\WifiConnectivityManager.java

public void handleScreenStateChanged(boolean screenOn) {

localLog("handleScreenStateChanged: screenOn=" + screenOn);

mScreenOn = screenOn;

mOpenNetworkNotifier.handleScreenStateChanged(screenOn);

startConnectivityScan(SCAN_ON_SCHEDULE);

}

private void startConnectivityScan(boolean scanImmediately) {

localLog("startConnectivityScan: screenOn=" + mScreenOn

+ " wifiState=" + stateToString(mWifiState)

+ " scanImmediately=" + scanImmediately

+ " wifiEnabled=" + mWifiEnabled

+ " wifiConnectivityManagerEnabled="

+ mWifiConnectivityManagerEnabled);

if (!mWifiEnabled || !mWifiConnectivityManagerEnabled) {

return;

}

// Always stop outstanding connecivity scan if there is any

stopConnectivityScan();

// Don't start a connectivity scan while Wifi is in the transition

// between connected and disconnected states.

if (mWifiState != WIFI_STATE_CONNECTED && mWifiState != WIFI_STATE_DISCONNECTED) {

return;

}

if (mScreenOn) {

startPeriodicScan(scanImmediately);

} else {

if (mWifiState == WIFI_STATE_DISCONNECTED && !mPnoScanStarted) {

startDisconnectedPnoScan();

}

}

}

// Start a periodic scan when screen is on

private void startPeriodicScan(boolean scanImmediately) {

// 从新设置PNO扫描的时间间隔。

// 当扫描的网络,Rssi比较低时,将会进行从新扫描

mPnoScanListener.resetLowRssiNetworkRetryDelay();

// 漫游关闭时,不进行扫描

// No connectivity scan if auto roaming is disabled.

if (mWifiState == WIFI_STATE_CONNECTED && !mEnableAutoJoinWhenAssociated) {

return;

}

// Due to b/28020168, timer based single scan will be scheduled

// to provide periodic scan in an exponential backoff fashion.

if (scanImmediately) {

resetLastPeriodicSingleScanTimeStamp();

}

mPeriodicSingleScanInterval = PERIODIC_SCAN_INTERVAL_MS;

startPeriodicSingleScan();

}

@VisibleForTesting

public static final int PERIODIC_SCAN_INTERVAL_MS = 20 * 1000; // 20 seconds

// Start a single scan and set up the interval for next single scan.

private void startPeriodicSingleScan() {

long currentTimeStamp = mClock.getElapsedSinceBootMillis();

if (mLastPeriodicSingleScanTimeStamp != RESET_TIME_STAMP) {

long msSinceLastScan = currentTimeStamp - mLastPeriodicSingleScanTimeStamp;

if (msSinceLastScan < PERIODIC_SCAN_INTERVAL_MS) {

localLog("Last periodic single scan started " + msSinceLastScan

+ "ms ago, defer this new scan request.");

schedulePeriodicScanTimer(PERIODIC_SCAN_INTERVAL_MS - (int) msSinceLastScan);

return;

}

}

boolean isFullBandScan = true;

// 判断wifi使用率是不是比较高,比较高只进行一部分扫描

// 通过发送和接收速率判断

// If the WiFi traffic is heavy, only partial scan is initiated.

if (mWifiState == WIFI_STATE_CONNECTED

&& (mWifiInfo.txSuccessRate > mFullScanMaxTxRate

|| mWifiInfo.rxSuccessRate > mFullScanMaxRxRate)) {

localLog("No full band scan due to ongoing traffic");

isFullBandScan = false;

}

// 再次判断,如果发送接收速率超过最大值,将不进行扫描。

mLastPeriodicSingleScanTimeStamp = currentTimeStamp;

if (mWifiState == WIFI_STATE_CONNECTED

&& (mWifiInfo.txSuccessRate

> MAX_TX_PACKET_FOR_PARTIAL_SCANS

|| mWifiInfo.rxSuccessRate

> MAX_RX_PACKET_FOR_PARTIAL_SCANS)) {

Log.e(TAG,"Ignore scan due to heavy traffic");

} else {

startSingleScan(isFullBandScan, WIFI_WORK_SOURCE);

}

schedulePeriodicScanTimer(mPeriodicSingleScanInterval);

// 设置下一次扫描时间间隔,是当前的2倍。

// 最大扫描时间间隔160s

// public static final int MAX_PERIODIC_SCAN_INTERVAL_MS = 160 * 1000; // 160 seconds

// Set up the next scan interval in an exponential backoff fashion.

mPeriodicSingleScanInterval *= 2;

if (mPeriodicSingleScanInterval > MAX_PERIODIC_SCAN_INTERVAL_MS) {

mPeriodicSingleScanInterval = MAX_PERIODIC_SCAN_INTERVAL_MS;

}

}

3. pno扫描

private void startDisconnectedPnoScan() {

// TODO(b/29503772): Need to change this interface.

// Initialize PNO settings

PnoSettings pnoSettings = new PnoSettings();

List pnoNetworkList = mConfigManager.retrievePnoNetworkList();

int listSize = pnoNetworkList.size();

if (listSize == 0) {

// No saved network

localLog("No saved network for starting disconnected PNO.");

return;

}

pnoSettings.networkList = new PnoSettings.PnoNetwork[listSize];

pnoSettings.networkList = pnoNetworkList.toArray(pnoSettings.networkList);

pnoSettings.min5GHzRssi = mMin5GHzRssi;

pnoSettings.min24GHzRssi = mMin24GHzRssi;

pnoSettings.initialScoreMax = mInitialScoreMax;

pnoSettings.currentConnectionBonus = mCurrentConnectionBonus;

pnoSettings.sameNetworkBonus = mSameNetworkBonus;

pnoSettings.secureBonus = mSecureBonus;

pnoSettings.band5GHzBonus = mBand5GHzBonus;

// Initialize scan settings

ScanSettings scanSettings = new ScanSettings();

scanSettings.band = getScanBand();

scanSettings.reportEvents = WifiScanner.REPORT_EVENT_NO_BATCH;

scanSettings.numBssidsPerScan = 0;

scanSettings.periodInMs = DISCONNECTED_PNO_SCAN_INTERVAL_MS; // 20s

mPnoScanListener.clearScanDetails();

mScanner.startDisconnectedPnoScan(scanSettings, pnoSettings, mPnoScanListener);

mPnoScanStarted = true;

}

待续。。。

原文:https://www.cnblogs.com/helloworldtoyou/p/9667229.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值