android p wifi一直在掃描_(一百六十八)Android P wifi 掃描失敗結果上報流程梳理-掃描上報梳理②...

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

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 命令下發成功后的失敗

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

/**

* 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 命令下發的失敗

49da5f5ea51b398f227d25d57de67a49.png

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

2.總結

掃描失敗分

掃描命令下發失敗

掃描過程中失敗

掃描結果獲取超時

掃描命令下發成功其實就是打個log,后續失敗一直會上報給上層,上層會以廣播的形式告知,命令下發后kernel去掃描,掃描到結果后會告訴上層來取,上層這時會再下發命令將掃描結果取上來,而不是之前想的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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371722.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371722.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371722.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

(五)什么是RDD-JavaPython版Spark

什么是RDD 視頻教程&#xff1a; 1、優酷 2、YouTube RDD是個抽象類&#xff0c;全稱為Resilient Distributed Datasets&#xff0c;是一個容錯的、并行的數據結構&#xff0c;可以讓用戶顯式地將數據存儲到磁盤和內存中&#xff0c;并能控制數據的分區。同時&#xff0c;RDD還…

LazyInitializationException的四種解決方案–第1部分

在今天的帖子中&#xff0c;我們將討論常見的LazyInitializationException錯誤。 我們將看到四種避免該錯誤的方法&#xff0c;以及每種方法的優缺點。在本文的最后&#xff0c;我們將討論EclipseLink如何處理該異常。 為了看到LazyInitializationException錯誤并進行處理&…

linux驅動

jeffies hz xtime 每秒鐘系統時鐘節拍數 prco < 內核內存視窗 include/linux/list.h < 內核的數據結構&#xff0c;鏈表 workques_struct 工作隊列轉載于:https://www.cnblogs.com/asreg/p/7148606.html

java 條碼識別_條碼識別示例代碼

package api.jisuapi.barcode;import api.util.HttpUtil;import net.sf.json.JSONArray;import net.sf.json.JSONObject;public class Read {public static final String APPKEY "your_appkey_here";// 你的appkeypublic static final String URL "https://ap…

終極JPA查詢和技巧列表–第2部分

這一部分是該系列文章的第一部分 。 JPA&#xff1a;NamedQuery&#xff0c;使用日期查詢&#xff0c;有關getSingleResult方法的警告 為了避免重復查詢代碼&#xff0c;提高性能并簡化維護查詢&#xff0c;我們可以使用NamedQueries。 NamedQuery使用JPQL作為語法&#xff0c…

設置UITableView設置contentsize

由于UITableView是繼承自UIScrollView的&#xff0c;所以他是可以設置contentsize的。 但是&#xff0c;我在試驗的過程中&#xff0c;初始化UITableView實例后&#xff0c;直接設置它的contentsize是不起作用&#xff0c;在搜尋相關資料得知&#xff0c;UITableView會自動設置…

java 線程什么時候結束_java線程什么時候讓出cpu?

Thread.sleep();sleep就是正在執行的線程主動讓出cpu&#xff0c;cpu去執行其他線程&#xff0c;在sleep指定的時間過后&#xff0c;cpu才會回到這個線程上繼續往下執行&#xff0c;如果當前線程進入了同步鎖&#xff0c;sleep方法并不會釋放鎖&#xff0c;即使當前線程使用sle…

Hibernate配置方式

Hibernate配置方式 Hibernate給人的感受是靈活的&#xff0c;要達到同一個目的&#xff0c;我們可以使用幾種不同的辦法。就拿Hibernate配置來說&#xff0c;常用的有如下三種方式&#xff0c;任選其一。 在 hibernate.cfg.xml 中加入元素 <property>、<mapping>&a…

js中 javascript:void(0) 用法詳解

javascript:void(0)表示不做任何動作。如&#xff1a; 復制代碼代碼如下:<a href"javascript:void(0);" οnclick"alert(ok);"></a> 這里表示這個鏈接不做跳轉動作&#xff0c;執行onClick事件。 我想使用過ajax的都常見這樣的代碼&#xff1…

帶有ActiveMQ的JMS

帶有ActiveMQ的JMS JMS是Java Message Service的縮寫&#xff0c;它提供了一種以松散耦合&#xff0c;靈活的方式集成應用程序的機制。 JMS以存儲和轉發的方式跨應用程序異步傳遞數據。 應用程序通過充當中介的MOM&#xff08;面向消息的中間件&#xff09;進行通信&#xff0c…

矩陣分解 java_使用矩陣分解為推薦系統

矩陣分解假設“潛在因素”&#xff0c;例如對用戶的意大利食物的偏好和項目食物的意外性與矩陣中的評級有關 .因此&#xff0c;整個問題類型轉變為矩陣重構問題&#xff0c;存在許多不同的解決方案 . 一個簡單的&#xff0c;可能很慢的解決方案是(除了ALS和其他一些矩陣重建的可…

用戶故事排球教練助手

計劃&#xff1a;估計這個任務需要一周時間 需求分析&#xff1a;作為一名排球教練助手&#xff0c;我需要了解每場每位隊員的技術動作&#xff0c;每場比賽每位隊員的得分情況&#xff0c;以便教練更好的了解到每位隊員的發揮情況和特長。 設計文檔&#xff1a;用戶進入此界面…

TMS320DM642學習----第一篇(硬件連接)

DSP設備型號&#xff1a;SEED-DTK-VPM642&#xff08;目前實驗室用途&#xff1a;視頻處理&#xff0c;圖像處理方向&#xff0c;預計搭載目標跟蹤以及云臺防抖等算法&#xff09; 官網鏈接&#xff1a;http://www.seeddsp.com/index.php/Home/Product/detail/name/1/id/174.ht…

字符串內存內部

本文基于我對StackOverflow的回答 。 我正在嘗試解釋String類如何存儲文本&#xff0c;內部存儲和常量池如何工作。 這里要理解的要點是String Java對象與其內容– private value字段下的char[]之間的區別。 String基本上是char[]數組的包裝器&#xff0c;將其封裝并使其無法修…

關于inline-block 元素之間為何會產生間隔

關于inline-block 元素之間為何會產生間隔 現象&#xff1a; <body><input type"text"><input type"text"> </body> 在瀏覽器中的表現&#xff1a; 實時上不僅僅是 inline-block 會導致這種現象。 inline 也會導致。 那問題來了&a…

java 入參 是 枚舉_java 枚舉 參數傳遞

展開全部這樣做是不行的&#xff0c;原因是&#xff1a;Java中的對象實例化都是在堆中&#xff0c;如果是普通的類實例變量&#xff0c;比如在方法636f707962616964757a686964616f313333376166371中定義的普通類實例變量&#xff0c;傳到了方法2中&#xff0c;由于方法1和方法2…

loadView的使用總結

一、loadView 1. loadView什么時候被調用&#xff1f; 每次訪問UIViewController的view&#xff08;如 controller.view、self.view&#xff09;并且view為nil&#xff0c;loadView方法就會被調用 2. 有什么作用 loadView 方法是用來負責創建UIViewController的view 3. 默認實…

數據庫備份 java jar_Java實現數據庫備份并利用ant導入SQL腳本

?數據備份對于經常在運維部署方面的工作者來說&#xff0c;是一件相對簡單的事情&#xff0c;都可以通過某一個SQL工具進行備份&#xff0c;但是如果在項目運行當中&#xff0c;我們需要對數據進行實時&#xff0c;或者是每隔一星期&#xff0c;一個月&#xff0c;等等進行數據…

JSF簡單Ajax示例

今天&#xff0c;我們將看到一些使用JSF的Ajax簡單樣本。 如果要查看有關JSF / Web應用程序的其他文章&#xff0c;請單擊以下鏈接&#xff1a; 重定向后的JSF持久化對象和消息 &#xff0c; 使用JAAS和JSF進行用戶登錄驗證 &#xff0c; JSF&#xff1a;Converter and Bean Au…

常用的好用的window工具

1. FastStone Capture截圖錄屏軟件 百度軟件中心&#xff1a;http://rj.baidu.com/soft/detail/13504.html?ald 注冊企業版&#xff1a; 用戶名&#xff1a;c1ikm 注冊碼&#xff1a;AXMQX-RMMMJ-DBHHF-WIHTV 中文輸入亂碼解決方法&#xff1a; 2. Notepad文本編輯器&#xff…