接(一百五十五)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 命令下发的失败

可以看到这个扫描命令流程下发一直会有个执行成功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

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

  1. Android开发笔记(一百六十八)为应用绑定通知渠道并展示消息角标

    为了分清消息通知的轻重缓急,从Android8开始新增了通知渠道,并且必须指定通知渠道才能正常推送消息.一个应用允许拥有多个通知渠道,每个渠道的重要性各不相同,有的渠道消息在通知栏被折叠成小行,有的渠 ...

  2. 计算机网络 - 练习(一百三十八)

    计算机网络 练习(一百三十八) 关于网络安全,以下说法中正确的是(). A. 使用无线传输可以防御网络监听 B. 木马是一种蠕虫病毒 C. 使用防火墙可以有效地防御病毒 D. 冲击波病毒利用 Wind ...

  3. 教你一百二十八个说话的技巧(气质很内涵)(有霸气不霸道)

    教你一百二十八个说话的技巧(气质很内涵)(有霸气不霸道) 1.说话不要有攻击性,不要有杀伤力,不夸已能,不扬人恶,自然能化敌为友.  2.一个常常看别人缺点的人,自己本身就不够好,因为他没有时间检讨他 ...

  4. Android开发笔记(一百六十六)H5通过WebView录像上传

    前面的博文< Android开发笔记(一百五十二)H5通过WebView上传图片>介绍了如何拍照上传给网页,不料客户又要求再加个摄像上传给网页.既然如此,那么再探讨一下如何实现这个摄像上传 ...

  5. Android开发笔记(一百二十八)手机制式适配

    查看运营商与网络类型 虽然现在4G网络很普及了,但是我国幅员辽阔,4G信号在某些地方接收不良,手机连接很容易掉到3G甚至2G网络.为了让用户在低速环境也能使用App的基础功能,而不至于还在老牛破车地缓 ...

  6. flutter 获取android 还是ios_Flutter完整开发实战详解(二十、 Android PlatformView 和键盘问题)...

    作为系列文章的第二十篇,本篇将结合官方的技术文档科普 Android 上 PlatformView 的实现逻辑,并且解释为什么在 Android 上 PlatformView 的键盘总是有问题. 为什 ...

  7. android 十八 蓝牙及Wi-Fi

    视频课:https://edu.csdn.net/course/play/7621 学习内容 Ø 蓝牙的基本概念 Ø Android中蓝牙的应用 能力目标 Ø 了解蓝牙的基本概念 Ø 掌握Androi ...

  8. Android开发笔记(一百六十二)蓝牙设备的连接与配对

    蓝牙是一种短距离无线通信技术,它由爱立信公司于1994年创制,原本想替代连接电信设备的数据线,但是后来发现它也能用于移动设备之间的数据传输,所以蓝牙技术在手机上获得了长足发展. 因为手机内部的通讯芯片 ...

  9. wifi动不动就断开_手机信号满格,但是WIFI经常掉线!我来教你怎么办

    原标题:手机信号满格,但是WIFI经常掉线!我来教你怎么办 一 WiFi信号好却掉线 大家遇到这种情况一般都是由于手机中设置了休眠模式而导致的,因为手机考虑到功耗的问题,在待机一段时间后就会断开WiF ...

最新文章

  1. robot framework环境搭建
  2. python开源代码-mtcnn python 开源代码详细图解
  3. 快速了解Scala技术栈
  4. 管理员请注意 一条后门病毒攻击链正在针对服务器发起入侵
  5. Codeforces732D Exams
  6. Java代码格式化算法_一个时间格式化的工具类:TimeUtil
  7. 罗技无线网卡linux,linux(debian)安装USB无线网卡(tp-link TL-WN725N rtl8188eu )
  8. 伪元素在父元素中居中_从ArrayList中移除元素
  9. 单向链表存储方式下插入、删除、搜索
  10. Windows10系统打开程序应用提示『不支持此接口』的解决方案
  11. 测试技术-易用性测试
  12. 骨科手术ICD编码主要缺陷与原因分析
  13. 华为语音解锁设置_华为解锁屏(华为语音解锁屏幕)
  14. ‼ gifsicle pre-build test failed
  15. 人工神经网络分为哪两类,人工神经网络包括哪些
  16. ApacheCon Asia: Keynote 以及流处理专场大咖详细介绍
  17. Elasticsearch+Hbase实现海量数据秒回查询
  18. calcite是什么
  19. 将后台的图像数据传回前台并显示出来
  20. 怎么去视频水印?一键去除视频水印

热门文章

  1. 学习Java: Queue
  2. 前端如何进行日志驱动开发
  3. HTML中confirm替换,Javascript直接Confirm()函数替换
  4. cla c 语言编译器,第九章 CLA_C2000_C_Compiler.pdf
  5. linux下php可以实现哪些功能,基于Linux的远程管理系统的设计与实现(PHP)
  6. c++ 经典代码_C语言经典100题(31)
  7. discuz安装_手动搭建 Discuz! 论坛
  8. antd From 中 Form.Item里含有自己封装的组件,获取不到值的解决方法
  9. 深入学习jQuery选择器系列第六篇——过滤选择器之状态选择器
  10. AJAX跨域问题解决方法(1)——禁止浏览器进行跨域限制