(一百七十八)WiFi扫描结果framework和app共享么?

2023-12-19 07:32

本文主要是介绍(一百七十八)WiFi扫描结果framework和app共享么?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.流程回顾

WifiScanningServiceImpl

                    case WifiScanner.CMD_START_SINGLE_SCAN:mWifiMetrics.incrementOneshotScanCount();int handler = msg.arg2;Bundle scanParams = (Bundle) msg.obj;if (scanParams == null) {logCallback("singleScanInvalidRequest",  ci, handler, "null params");replyFailed(msg, WifiScanner.REASON_INVALID_REQUEST, "params null");return HANDLED;}scanParams.setDefusable(true);ScanSettings scanSettings =scanParams.getParcelable(WifiScanner.SCAN_PARAMS_SCAN_SETTINGS_KEY);WorkSource workSource =scanParams.getParcelable(WifiScanner.SCAN_PARAMS_WORK_SOURCE_KEY);if (validateScanRequest(ci, handler, scanSettings)) {logScanRequest("addSingleScanRequest", ci, handler, workSource,scanSettings, null);replySucceeded(msg);// If there is an active scan that will fulfill the scan request then// mark this request as an active scan, otherwise mark it pending.// If were not currently scanning then try to start a scan. Otherwise// this scan will be scheduled when transitioning back to IdleState// after finishing the current scan.if (getCurrentState() == mScanningState) {if (activeScanSatisfies(scanSettings)) {mActiveScans.addRequest(ci, handler, workSource, scanSettings);} else {mPendingScans.addRequest(ci, handler, workSource, scanSettings);}} else {mPendingScans.addRequest(ci, handler, workSource, scanSettings);tryToStartNewScan();}} else {logCallback("singleScanInvalidRequest",  ci, handler, "bad request");replyFailed(msg, WifiScanner.REASON_INVALID_REQUEST, "bad request");mWifiMetrics.incrementScanReturnEntry(WifiMetricsProto.WifiLog.SCAN_FAILURE_INVALID_CONFIGURATION, 1);}return HANDLED;

1.1 扫描命令下发

首先scan有个scanSettings的设定,即扫描不是都是一样的,有细致差别,具体是在scanSettings里携带的

如果scan设定当前的囊括新来的,那么就认为是一个类别的扫描,可以一起等刚刚下发的扫描命令返回上来的扫描结果,否则进入等待队列等下一次扫描

        boolean activeScanSatisfies(ScanSettings settings) {if (mActiveScanSettings == null) {return false;}if (!activeScanTypeSatisfies(getNativeScanType(settings.type))) {return false;}// there is always one bucket for a single scanWifiNative.BucketSettings activeBucket = mActiveScanSettings.buckets[0];// validate that all requested channels are being scannedChannelCollection activeChannels = mChannelHelper.createChannelCollection();activeChannels.addChannels(activeBucket);if (!activeChannels.containsSettings(settings)) {return false;}// if the request is for a full scan, but there is no ongoing full scanif ((settings.reportEvents & WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT) != 0&& (activeBucket.report_events & WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT)== 0) {return false;}if (!ArrayUtils.isEmpty(settings.hiddenNetworks)) {if (ArrayUtils.isEmpty(mActiveScanSettings.hiddenNetworks)) {return false;}List<WifiNative.HiddenNetwork> activeHiddenNetworks = new ArrayList<>();for (WifiNative.HiddenNetwork hiddenNetwork : mActiveScanSettings.hiddenNetworks) {activeHiddenNetworks.add(hiddenNetwork);}for (ScanSettings.HiddenNetwork hiddenNetwork : settings.hiddenNetworks) {WifiNative.HiddenNetwork nativeHiddenNetwork = new WifiNative.HiddenNetwork();nativeHiddenNetwork.ssid = hiddenNetwork.ssid;if (!activeHiddenNetworks.contains(nativeHiddenNetwork)) {return false;}}}return true;}

会判断扫描的

  • type(WifiNative.SCAN_TYPE_LOW_LATENCY WifiNative.SCAN_TYPE_LOW_POWER WifiNative.SCAN_TYPE_HIGH_ACCURACY)
  • channel(settings用的是WIFI_BAND_BOTH_WITH_DFS即2.4+5+dfs)
  • full scan
  • hiddenNetworks

是否包含这次请求的扫描,这样不是返回上来的扫描结果会比要求的多么?没必要担心,后续有过滤

1.2 扫描结果过滤

                    case CMD_SCAN_RESULTS_AVAILABLE:mWifiMetrics.incrementScanReturnEntry(WifiMetricsProto.WifiLog.SCAN_SUCCESS,mActiveScans.size());reportScanResults(mScannerImpl.getLatestSingleScanResults());mActiveScans.clear();transitionTo(mIdleState);return HANDLED;void reportScanResults(ScanData results) {if (results != null && results.getResults() != null) {if (results.getResults().length > 0) {mWifiMetrics.incrementNonEmptyScanResultCount();} else {mWifiMetrics.incrementEmptyScanResultCount();}}ScanData[] allResults = new ScanData[] {results};for (RequestInfo<ScanSettings> entry : mActiveScans) {ScanData[] resultsToDeliver = ScanScheduleUtil.filterResultsForSettings(mChannelHelper, allResults, entry.settings, -1);WifiScanner.ParcelableScanData parcelableResultsToDeliver =new WifiScanner.ParcelableScanData(resultsToDeliver);logCallback("singleScanResults",  entry.clientInfo, entry.handlerId,describeForLog(resultsToDeliver));entry.reportEvent(WifiScanner.CMD_SCAN_RESULT, 0, parcelableResultsToDeliver);// make sure the handler is removedentry.reportEvent(WifiScanner.CMD_SINGLE_SCAN_COMPLETED, 0, null);}WifiScanner.ParcelableScanData parcelableAllResults =new WifiScanner.ParcelableScanData(allResults);for (RequestInfo<Void> entry : mSingleScanListeners) {logCallback("singleScanResults",  entry.clientInfo, entry.handlerId,describeForLog(allResults));entry.reportEvent(WifiScanner.CMD_SCAN_RESULT, 0, parcelableAllResults);}if (results.isAllChannelsScanned()) {mCachedScanResults.clear();mCachedScanResults.addAll(Arrays.asList(results.getResults()));}}List<ScanResult> getCachedScanResultsAsList() {return mCachedScanResults;}}

这边的filterResultsForSettings会将扫描结果按扫描settings过滤一遍再返回回来,这样既考虑了扫描效率,又考虑了扫描Setting。

    /*** Returns a filtered version of the scan results from the chip that represents only the data* requested in the settings. Will return null if the result should not be reported.** If a ScanData indicates that the bucket the settings were placed in was scanned then it* will always be included (filtered to only include requested channels). If it indicates that* the bucket was definitely not scanned then the scan data will not be reported.* If it is not possible to determine if the settings bucket was scanned or not then a* ScanData will be included if the scan was empty or there was at least one scan result that* matches a requested channel (again the results will be filtered to only include requested* channels.*/public static ScanData[] filterResultsForSettings(ChannelHelper channelHelper,ScanData[] scanDatas, ScanSettings settings, int scheduledBucket) {List<ScanData> filteredScanDatas = new ArrayList<>(scanDatas.length);List<ScanResult> filteredResults = new ArrayList<>();for (ScanData scanData : scanDatas) {// only report ScanData if the settings bucket could have been scannedif (isBucketMaybeScanned(scheduledBucket, scanData.getBucketsScanned())) {filteredResults.clear();for (ScanResult scanResult : scanData.getResults()) {if (channelHelper.settingsContainChannel(settings, scanResult.frequency)) {filteredResults.add(scanResult);}if (settings.numBssidsPerScan > 0&& filteredResults.size() >= settings.numBssidsPerScan) {break;}}// will include scan results if the scan was empty, there was at least one// one result that matched the scan request or we are sure that all the requested// channels were scanned.if (filteredResults.size() == scanData.getResults().length) {filteredScanDatas.add(scanData);} else if (filteredResults.size() > 0 || isBucketDefinitlyScanned(scheduledBucket,scanData.getBucketsScanned())) {filteredScanDatas.add(new ScanData(scanData.getId(),scanData.getFlags(),filteredResults.toArray(new ScanResult[filteredResults.size()])));}}}if (filteredScanDatas.size() == 0) {return null;} else {return filteredScanDatas.toArray(new ScanData[filteredScanDatas.size()]);}}

 

2.总结

WiFi扫描结果framework和app共享这个要看是否这两者的扫描settings处于包含关系,比如framework的扫描settings包含app的,那么它们可以共一次扫描的扫描结果,但是app拿到的扫描结果后续会按照scansettings过滤一下。

这样既考虑效率又考虑特殊需求的处理很符合逻辑了。

举例Settings的扫描是TYPE_HIGH_ACCURACY + WIFI_BAND_BOTH_WITH_DFS,而framework比如WifiConnectivityManager的扫描TYPE_HIGH_ACCURACY,但WIFI_BAND_BOTH_WITH_DFS不能保证。

另外扫描结果依赖注册的listener回调,即即使scan Settings一样,settings还没下发扫描,framework的扫描结果settings也是拿不到的,上层应用是从ScanRequestProxy下发扫描命令和获取扫描结果的,而WifiConnectivityManager是自己下发到WiFiscanner并且自己注册监听器的。

这篇关于(一百七十八)WiFi扫描结果framework和app共享么?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/511371

相关文章

怎么让1台电脑共享给7人同时流畅设计

在当今的创意设计与数字内容生产领域,图形工作站以其强大的计算能力、专业的图形处理能力和稳定的系统性能,成为了众多设计师、动画师、视频编辑师等创意工作者的必备工具。 设计团队面临资源有限,比如只有一台高性能电脑时,如何高效地让七人同时流畅地进行设计工作,便成为了一个亟待解决的问题。 一、硬件升级与配置 1.高性能处理器(CPU):选择多核、高线程的处理器,例如Intel的至强系列或AMD的Ry

Spring Framework系统框架

序号表示的是学习顺序 IoC(控制反转)/DI(依赖注入): ioc:思想上是控制反转,spring提供了一个容器,称为IOC容器,用它来充当IOC思想中的外部。 我的理解就是spring把这些对象集中管理,放在容器中,这个容器就叫Ioc这些对象统称为Bean 用对象的时候不用new,直接外部提供(bean) 当外部的对象有关系的时候,IOC给它俩绑好(DI) DI和IO

# VMware 共享文件

VMware tools快速安装 VMware 提供了 open-vm-tools,这是 VMware 官方推荐的开源工具包,通常不需要手动安装 VMware Tools,因为大多数 Linux 发行版(包括 Ubuntu、CentOS 等)都包含了 open-vm-tools,并且已经优化以提供与 VMware 环境的兼容性和功能支持。 建议按照以下步骤安装 open-vm-tools 而不

企业安全之WiFi篇

很多的公司都没有安全团队,只有运维来负责整个公司的安全,从而安全问题也大打折扣。我最近一直在给各个公司做安全检测,就把自己的心得写下来,有什么不足之处还望补充。 0×01  无线安全 很多的公司都有不怎么注重公司的无线电安全,有钱的公司买设备,没钱的公司搞人力。但是人的技术在好,没有设备的辅助,人力在牛逼也没有个卵用。一个好的路由器、交换机、IDS就像你装备了 无尽、狂徒、杀人书一

未来工作趋势:零工小程序在共享经济中的作用

经济在不断发展的同时,科技也在飞速发展。零工经济作为一种新兴的工作模式,正在全球范围内迅速崛起。特别是在中国,随着数字经济的蓬勃发展和共享经济模式的深入推广,零工小程序在促进就业、提升资源利用效率方面显示出了巨大的潜力和价值。 一、零工经济的定义及现状 零工经济是指通过临时性、自由职业或项目制的工作形式,利用互联网平台快速匹配供需双方的新型经济模式。这种模式打破了传统全职工作的界限,为劳动

[环境配置]ubuntu20.04安装后wifi有图标但是搜不到热点解决方法

最近刚入手一台主机,暗影精灵8plus电竞主机,安装ubuntu后wifi怎么都搜不到热点,前后重装系统6次才算解决问题。这个心酸历程只有搞技术人才明白。下面介绍我解决过程。 首先主机到手后是个windows10系统,我用无线网连接了一下,可以正常上网,说明主机有无限网卡且正常。然后我就直接开始安装Ubuntu20.04了,安装成功后发现wifi有图标但是搜不到热点,我想是不是无线网卡驱动有没有

【C++】作用域指针、智能指针、共享指针、弱指针

十、智能指针、共享指针 从上篇文章 【C++】如何用C++创建对象,理解作用域、堆栈、内存分配-CSDN博客 中我们知道,你的对象是创建在栈上还是在堆上,最大的区别就是对象的作用域不一样。所以在C++中,一旦程序进入另外一个作用域,那其他作用域的对象就自动销毁了。这种机制有好有坏。我们可以利用这个机制,比如可以自动化我们的代码,像智能指针、作用域锁(scoped_lock)等都是利用了这种机制。

MFC中App,Doc,MainFrame,View各指针的互相获取

纸上得来终觉浅,为了熟悉获取方法,我建了个SDI。 首先说明这四个类的执行顺序是App->Doc->Main->View 另外添加CDialog类获得各个指针的方法。 多文档的获取有点小区别,有时间也总结一下。 //  App void CSDIApp::OnApp() {      //  App      //  Doc     CDocument *pD

OpenStack:Glance共享与上传、Nova操作选项解释、Cinder操作技巧

目录 Glance member task Nova lock shelve rescue Cinder manage local-attach transfer backup-export 总结 原作者:int32bit,参考内容 从2013年开始折腾OpenStack也有好几年的时间了。在使用过程中,我发现有很多很有用的操作,但是却很少被提及。这里我暂不直接

基于springboot+vue+uniapp的“共享书角”图书借还管理系统小程序

开发语言:Java框架:springboot+uniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9 系统展示 后台登录界面 管理员功能界面 出借者管理 图书信息管理 图书归还管理 出租收入管理