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.mzph.cn/news/371722.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

带有ActiveMQ的JMS

带有ActiveMQ的JMS JMS是Java Message Service的缩写&#xff0c;它提供了一种以松散耦合&#xff0c;灵活的方式集成应用程序的机制。 JMS以存储和转发的方式跨应用程序异步传递数据。 应用程序通过充当中介的MOM&#xff08;面向消息的中间件&#xff09;进行通信&#xff0c…

用户故事排球教练助手

计划&#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…

关于inline-block 元素之间为何会产生间隔

关于inline-block 元素之间为何会产生间隔 现象&#xff1a; <body><input type"text"><input type"text"> </body> 在浏览器中的表现&#xff1a; 实时上不仅仅是 inline-block 会导致这种现象。 inline 也会导致。 那问题来了&a…

数据库备份 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…

python socket模块实现udp通信_Python基于socket模块实现UDP通信功能示例

Python基于socket模块实现UDP通信功能示例本文实例讲述了Python基于socket模块实现UDP通信功能。分享给大家供大家参考&#xff0c;具体如下&#xff1a;一 代码1、接收端import socket#使用IPV4协议&#xff0c;使用UDP协议传输数据ssocket.socket(socket.AF_INET, socket.SOC…

创建Java动态代理

Java动态代理机制提供了一种有趣的方式来创建代理实例。 不过&#xff0c;创建动态代理的步骤有些繁琐&#xff0c;请考虑将代理用于审核服务实例的方法调用所花费的时间– public interface InventoryService {public Inventory create(Inventory inventory);public List<I…

java udp丢包_linux 系统 UDP 丢包问题分析思路

最近工作中遇到某个服务器应用程序 UDP 丢包&#xff0c;在排查过程中查阅了很多资料&#xff0c;总结出来这篇文章&#xff0c;供更多人参考。在开始之前&#xff0c;我们先用一张图解释 linux 系统接收网络报文的过程。● 首先网络报文通过物理网线发送到网卡● 网络驱动程…

java lambda 多个参数_Java Lambda行为参数化

Java Lambda行为参数化我们可以将lambda表达式作为参数传递给方法。例子以下代码创建了一个名为Calculator的函数接口。在Calculator中有一个称为calculate的方法&#xff0c;它接受两个int参数并返回一个int值。在Main类中有一个引擎方法&#xff0c;它接受函数接口Calculator…

java main test_java调用main自动执行testng方法一

主方法import com.com.utlis.createTestngXml;import org.testng.TestNG;import java.util.ArrayList;import java.util.List;/*** author lw* createTime 2019/3/30 15:35* description testng调试类*/public class inittet {private static final String ESCAPE_PROPERTY &q…

ADF:动态视图对象

今天&#xff0c;我想写有关动态视图对象的文章&#xff0c;它允许我在运行时更改其数据源&#xff08;SQL查询&#xff09;和属性。 我将使用oracle.jbo.ApplicationModule :: createViewObjectFromQueryStmt方法来解决此问题。 我将逐步介绍如何执行此操作 创建视图对象和应…

java stack list_JAVA自己实现List接口Stack

package 集合.Stack;import java.util.Arrays;import java.util.EmptyStackException;import java.util.Vector;public class MyStack {//底层数组默认长度为10private Object[] myStack new Object[10];//sizeprivate int size 0;public MyStack() {}//pushpublic Object pu…

I / O神秘化

由于对高度可扩展的服务器设计的所有炒作以及对nodejs的狂热&#xff0c;我一直想重点研究IO设计模式&#xff0c;直到现在为止都没有足够的时间进行投资。 现在已经做了一些研究&#xff0c;我认为最好记下我遇到的东西&#xff0c;作为对我以及可能遇到这篇文章的任何人的未来…

java三大特性 继承_java基础(二)-----java的三大特性之继承

在《Think in java》中有这样一句话&#xff1a;复用代码是Java众多引人注目的功能之一。但要想成为极具革命性的语言&#xff0c;仅仅能够复制代码并对加以改变是不够的&#xff0c;它还必须能够做更多的事情。在这句话中最引人注目的是“复用代码”,尽可能的复用代码使我们程…

delphi用TAdoStoredProc调用存储过程,兼容sql2005、2008、2014的远程事务问题

delphi7写的程序&#xff0c;在sql2000里没问题&#xff0c;调用sql2008、2014里的存储过程时&#xff0c;如果存储过程里操作了大量数据&#xff0c;很容易会莫名其妙的自己撤销掉&#xff0c;但是程序还识别不到&#xff0c;认为还在正常执行。今天尝试换了个控件&#xff1a…

8、SpringCloud高频面试题-版本1

1、SpringCloud组件有哪些 SpringCloud 是一系列框架的有序集合。它利用 SpringBoot 的开发便利性巧妙地简化了分布式系统基础设施的开发&#xff0c;如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等&#xff0c;都可以用 SpringBoot 的开发风格做到一键启…

JavaOne 2012:Java策略主题演讲和IBM主题演讲

与 JavaOne 2010 相似&#xff0c;我对JavaOne 2012的开始也很艰难。由于“计算机和打印机技术上的困难”&#xff0c;办理登机手续的人花了70分钟为我提供JavaOne徽章。 尽管我不是世界上最有耐心的人&#xff0c;但比等待更令人失望的是&#xff0c;我错过了参加“社区会议&a…