日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android p wifi一直在扫描_(一百六十八)Android P wifi 扫描失败结果上报流程梳理-扫描上报梳理②...

發(fā)布時間:2023/12/1 Android 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android p wifi一直在扫描_(一百六十八)Android P wifi 扫描失败结果上报流程梳理-扫描上报梳理②... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

接(一百五十五)Android P wifi 掃描失敗結果上報流程梳理-掃描上報梳理?掃描失敗上報梳理發(fā)現梳理的差了很多,特補充

1.WificondScannerImpl

@Override

public boolean startSingleScan(WifiNative.ScanSettings settings,

WifiNative.ScanEventHandler eventHandler) {

if (eventHandler == null || settings == null) {

Log.w(TAG, "Invalid arguments for startSingleScan: settings=" + settings

+ ",eventHandler=" + eventHandler);

return false;

}

synchronized (mSettingsLock) {

if (mLastScanSettings != null) {

Log.w(TAG, "A single scan is already running");

return false;

}

ChannelCollection allFreqs = mChannelHelper.createChannelCollection();

boolean reportFullResults = false;

for (int i = 0; i < settings.num_buckets; ++i) {

WifiNative.BucketSettings bucketSettings = settings.buckets[i];

if ((bucketSettings.report_events

& WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT) != 0) {

reportFullResults = true;

}

allFreqs.addChannels(bucketSettings);

}

Set hiddenNetworkSSIDSet = new HashSet<>();

if (settings.hiddenNetworks != null) {

int numHiddenNetworks =

Math.min(settings.hiddenNetworks.length, MAX_HIDDEN_NETWORK_IDS_PER_SCAN);

for (int i = 0; i < numHiddenNetworks; i++) {

hiddenNetworkSSIDSet.add(settings.hiddenNetworks[i].ssid);

}

}

mLastScanSettings = new LastScanSettings(

mClock.getElapsedSinceBootMillis(),

reportFullResults, allFreqs, eventHandler);

boolean success = false;

Set freqs;

if (!allFreqs.isEmpty()) {

freqs = allFreqs.getScanFreqs();

success = mWifiNative.scan(

mIfaceName, settings.scanType, freqs, hiddenNetworkSSIDSet);

if (!success) {

Log.e(TAG, "Failed to start scan, freqs=" + freqs);

}

} else {

// There is a scan request but no available channels could be scanned for.

// We regard it as a scan failure in this case.

Log.e(TAG, "Failed to start scan because there is no available channel to scan");

}

if (success) {

if (DBG) {

Log.d(TAG, "Starting wifi scan for freqs=" + freqs);

}

mScanTimeoutListener = new AlarmManager.OnAlarmListener() {

@Override public void onAlarm() {

handleScanTimeout();

}

};

mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,

mClock.getElapsedSinceBootMillis() + SCAN_TIMEOUT_MS,

TIMEOUT_ALARM_TAG, mScanTimeoutListener, mEventHandler);

} else {

// indicate scan failure async

mEventHandler.post(new Runnable() {

@Override public void run() {

reportScanFailure();

}

});

}

return true;

}

}

1.1 命令下發(fā)成功后的失敗

下發(fā)掃描命令成功后會設立一個15s的倒計時,若15s沒有失敗或者成功上報就會上報一個失敗,最終觸發(fā)廣播通知

/**

* Duration to wait before timing out a scan.

*

* The expected behavior is that the hardware will return a failed scan if it does not

* complete, but timeout just in case it does not.

*/

private static final long SCAN_TIMEOUT_MS = 15000;

private void handleScanTimeout() {

synchronized (mSettingsLock) {

Log.e(TAG, "Timed out waiting for scan result from wificond");

reportScanFailure();

mScanTimeoutListener = null;

}

}

@Override

public boolean handleMessage(Message msg) {

switch(msg.what) {

case WifiMonitor.SCAN_FAILED_EVENT:

Log.w(TAG, "Scan failed");

cancelScanTimeout();

reportScanFailure();

break;

case WifiMonitor.PNO_SCAN_RESULTS_EVENT:

pollLatestScanDataForPno();

break;

case WifiMonitor.SCAN_RESULTS_EVENT:

cancelScanTimeout();

pollLatestScanData();

break;

default:

// ignore unknown event

}

return true;

}

另外掃描結果獲取失敗也會回調上來告訴上層獲取掃描結果失敗

與掃描結果成功對應的有個失敗的回調

scanner_impl.java

void ScannerImpl::OnScanResultsReady(uint32_t interface_index, bool aborted,

vector>& ssids,

vector& frequencies) {

if (!scan_started_) {

LOG(INFO) << "Received external scan result notification from kernel.";

}

scan_started_ = false;

if (scan_event_handler_ != nullptr) {

// TODO: Pass other parameters back once we find framework needs them.

if (aborted) {

LOG(WARNING) << "Scan aborted";

scan_event_handler_->OnScanFailed();

} else {

scan_event_handler_->OnScanResultReady();

}

} else {

LOG(WARNING) << "No scan event handler found.";

}

}

http://androidxref.com/9.0.0_r3/xref/frameworks/opt/net/wifi/service/java/com/android/server/wifi/WificondControl.java#97

83 private class ScanEventHandler extends IScanEvent.Stub {

84 private String mIfaceName;

85

86 ScanEventHandler(@NonNull String ifaceName) {

87 mIfaceName = ifaceName;

88 }

89

90 @Override

91 public void OnScanResultReady() {

92 Log.d(TAG, "Scan result ready event");

93 mWifiMonitor.broadcastScanResultEvent(mIfaceName);

94 }

95

96 @Override

97 public void OnScanFailed() {

98 Log.d(TAG, "Scan failed event");

99 mWifiMonitor.broadcastScanFailedEvent(mIfaceName);

100 }

101 }

http://androidxref.com/9.0.0_r3/xref/frameworks/opt/net/wifi/service/java/com/android/server/wifi/scanner/WificondScannerImpl.java#268

265 @Override

266 public boolean handleMessage(Message msg) {

267 switch(msg.what) {

268 case WifiMonitor.SCAN_FAILED_EVENT:

269 Log.w(TAG, "Scan failed");

270 cancelScanTimeout();

271 reportScanFailure();

272 break;

1.2 命令下發(fā)的失敗

可以看到這個掃描命令流程下發(fā)一直會有個執(zhí)行成功or失敗的返回值,這會告訴上層執(zhí)行命令的成功與否。

2.總結

掃描失敗分

掃描命令下發(fā)失敗

掃描過程中失敗

掃描結果獲取超時

掃描命令下發(fā)成功其實就是打個log,后續(xù)失敗一直會上報給上層,上層會以廣播的形式告知,命令下發(fā)后kernel去掃描,掃描到結果后會告訴上層來取,上層這時會再下發(fā)命令將掃描結果取上來,而不是之前想的kernel掃描到結果后就直接將結果報上來上層直接就用了,上層并沒有用回調上來的結果,而是自己知道結果好了又向kernel要了下結果。

這段邏輯在

http://androidxref.com/9.0.0_r3/xref/frameworks/opt/net/wifi/service/java/com/android/server/wifi/scanner/WificondScannerImpl.java#276

http://androidxref.com/9.0.0_r3/xref/system/connectivity/wificond/scanning/scan_utils.cpp#77

總結

以上是生活随笔為你收集整理的android p wifi一直在扫描_(一百六十八)Android P wifi 扫描失败结果上报流程梳理-扫描上报梳理②...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。