跑狗图2019每期更新 > 扫描流程 >

Wifi扫描流程解析

2019-08-03 22:40 来源: 震仪

  HI,欢迎来到裴智飞的《每周一博》。今天是十二月第一周,我给大家介绍一下安卓系统WiFi的扫描过程。

  为什么要走读Wifi源码,因为定位离不开Wifi,之前在解答问题的时候,总是会有用户报无法获取Wifi的问题,包括发起Wifi扫描,获取Wifi结果和系统缓存的一系列问题,所以我决定带着这些疑问去看一下Wifi的基本流程到底是什么样的,如何发起了扫描,获得结果什么时候用的是缓存,究竟是否有3分钟清缓存的限制。

  Wifi的工作过程使用了状态机,为了了解Wifi工作过程,我特意先学习了一下状态机,否则真不懂,关于状态机我写了一篇文章《状态机工作原理》来介绍。

  这里再简单介绍下帮助理解,状态机主要用到了状态模式,不同的状态行为也不同。状态树有很多节点,子节点继承自父亲节点,状态都有enter,exit,processMessage方法,如果当前状态不处理消息,就会由父状态去处理。状态机有deferMessage,transitTo,sendMessage方法,分别是把消息推迟到下一状态执行,切换到某个状态,发送消息方法。状态机内部是通过Handler来实现发送接收消息的。

  在WifiStateMachine里面就有几十个状态机,每个状态机处理的消息类型和处理方法都不一样,这就需要搞清楚当前是什么状态,当前要处理什么消息,如何处理,处理完之后变成了什么状态。

  和WifiNative交互的是wpa_supplicant,它是Linux上的一个开源项目,被谷歌修改后加入Android移动平台,用来支持WEP,WPA/WPA2和WAPI无线协议和加密认证,而实际上的工作内容是通过socket(不管是与上层还是与驱动)与驱动交互上报数据给用户,而用户可以通过socket发送命令给wpa_supplicant调动驱动来对WiFi芯片操作。 简单的说,wpa_supplicant就是WiFi驱动和用户的中转站外加对协议和加密认证的支持。

  只是发送了一个指令CMD_START_SCAN,那我们看一下不同状态对该指令的行为是什么;

  可以想象这个过程是异步的,不是一发起扫描就会立刻得到结果,所以需要有一个不断的去监听事件。在WifiMonitor里面有一个MonitorThread线程在不断的监听WifiNative上报的事件,这是个无限循环,当接收到事件时会做解析,然后根据不同的类型去调用dispatchEvent(eventStr)来分发事件。

  当事件类型是扫描结果时,会执行handleEvent方法,在这里把消息发出去;

  这里对结果ScanResult做个说明,它描述了AP的信息,具体包含以下字段;

  D. int level:信号等级,单位是dBm,也被称作RSSI,一般是个负数,越大信号越强,比如-50强过-100

  F. long timestamp:从启动开始到该扫描记录最后一次被发现经过的微秒数。

  至此一个发起wifi扫描的流程就算是走完了,从6.0开始发送结果的广播增加了EXTRA_RESULTS_UPDATED新字段,如果是true表示结果可用。

  所以我们在监听广播的时候先判断下系统版本,如果高于M,取出EXTRA_RESULTS_UPDATED字段,如果为true,再取结果。

  上面说到扫描到wifi结果后会把结果存到全局变mScanResults中,所以这里直接把该变量里的值返回去,比较简单。

  所以8.0新加了一个3分钟的时间限制,即只返回3分钟内的缓存结果,这点在定制Wifi策略的时候需要考虑一下。

  本文介绍了wifi扫描和获得结果的流程,我觉得wifi源码要比网络定位复杂一些,网络定位主要是两层client-server调用,而wifi主要是先得搞懂状态模式,状态机这些东西,这样才能知道wifi各种状态是如何切换的,发送了一个消息该由哪个状态去执行。走读源码是深入学习的必经之路,阅读安卓源码的过程,也是学习设计模式的过程,比如谷歌为什么这么设计,为什么需要这么多的类,它是如何做到面向抽象,保持类的功能单一的,这些都值得我们去掌握。感谢大家的阅读,我们下周再见。

  最近在解决wifi的一些问题,故研究下wifi源码。该源码是基于Android4.3,其他版本略有改动,大致流程一样。这篇主要说一下wifi的启动流程。 WifiManager 先从wifi的开启来看,WifiManager中提供了接口用来控制wifi开关,setWifiE...

  1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时间app再启动时花费的时间 例如:app启动时可能包含操作: 1.检查版本更新 2.初始化三方地图环信(可能还有登录)分享统计 3.游客身...

  “它数着深蓝夜空中闪着微光的星星,突然心疼那两年的自己,脆弱,破碎,孤单,无处安置,只能向黑夜坦露对阳光的渴望……”“我最喜欢春天啦,很温柔;但为何,烈日、风暴、雷电,也吸引着那时的我?”“它回忆着,是小的孱弱的病态的美在夜里维系着它的生机,像月光,阴晴圆缺,它也反复无常—...

  大年初九,雾霾严重,鸡年上班的第一天,本来要自己开车的,感谢老爸的保驾护航,原来有一种父爱,是这样深沉和宽广,原来我真的不是捡来的,哈哈哈。 照常的例会,习以为常的布置,似乎宣告着日复一日的生活,三点一线的生活,波澜不惊的生活,看得见老得生活,就这样又拉响了警报。我...

  阿瑟·库斯勒说:过但凡我们在自然界找到有序稳定的系统,必然可以找到基层级结构,原因很简单,不把复杂的系统分解成次级的结构,就没有秩序和稳定可言,即便有也是一种死气沉沉的宇宙秩序,充盈着混纯钧一一的大气。人人都知道,做事有一定的条理性是好的,至少他们承认如果没有调理做起事来就...

  看了看时间,原来我已经有这么久没有在群里打卡了 可是我每天都学习,却不来打卡?开什么玩笑,哪里有这么忙呢?我觉得有必要梳理清楚下自己的思路以便提醒自己我并不是一无所获。 在没有打卡的这几天里,我学习到了所有发布出来的课程,当然,只是理论,我只是想把实践的时间用在刀刃上,毕竟...

  在师傅那里学的本领抢占了师傅的生意。 抖音里有其他的,师傅开店,开厂,徒弟二话不说帮忙的。 为了……生计?这种让人不屑。做到对面就太过分了。开店也好,摆摊也罢。靠手艺吃饭可以。饮水思源,不至于做成这样啊。 是的,摆摊开店要看地段,看人流量。可人再艰难,也不能忘本。 若是规范...