Android框架WiFi架构

Posted 短距(connectivity)知识分享

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android框架WiFi架构相关的知识,希望对你有一定的参考价值。

同学,别退出呀,我可是全网最牛逼的 WIFI/BT/GPS/NFC分析博主,我写了上百篇文章,请点击下面了解本专栏,进入本博主主页看看再走呗,一定不会让你后悔的,记得一定要去看主页置顶文章哦。

一、wpa_supplicant:wpa_supplicant本身开源项目源码,被谷歌收购之后加入android

动平台,它主要是用来支持WEP,WPA/WPA2和WAPI无线协议和加密认证的,而实际上工作内容是通过socket(不管是wpa_supplicant与上层还是wpa_spplicant与驱动都采用socket通讯)与驱动交互上报数据给用户,而用户可以通过socket发送命令给wpa_supplicant调试来对wifi芯片操作,简单的说,wpa_supplicant就是wifi驱动和用户的中转站外加对协议和机密认证的支持

二、android wifi 系统架构:andtoid wifi 系统引入了wpa_supplicant,它的整个wifi系统

以wpa_supplicant为核心来定义上层用用户接口和下层驱动接口,整个WiFi系统架构如图所示:

Android网络框架

WifiManager

WifiManager用于暴露给用户操作WIFI,上层APP通常可以按照下面的方法获取WifiManager,然后就可以根据开放的函数操作WIFI。

val mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE)

上面的获取函数我们可以跟踪它的实现,发现它就是从一个map中根据Context.WIFI_SERVICE取出WifiManger对象的:

ContextImpl.java

SystemServiceRegistry.java​

 同样的,我们可以发现WifiManager对象的创建也是再这个类里面,在一个static代码段里面运行了下面这段代码,即在类被加载到时就创建了WifiManager并且注册到了上面的map中,我们可以看到在WifiManger创建时把WifiService的引用传了进去,实际上用户调用WifiManger时,所有对WIFI的操作都是走到了WifiService(WifiServiceImpl)。

 WifiService

WifiService是在SystemService中被启动的,我们可以在SystemService中看到main函数,然后一直走到创建WifiService:main() -> run() -> startOtherService() -> startService(WIFI_SERVICE_CLASS)。

SystemServer.java

 WifiService实际就是个简单的包装类,真正的实现都是由WifiServiceImpl类来实现,并且发布到ServiceManager中的也是WifiServiceImpl类,所以上面WifiManager中持有的是WifiServiceImpl,对Wifi的调用也都是走到的WifiServiceImpl。

WifiService.java

 WifiServiceImpl

上面说到了WifiManager暴露出来的所有关于wifi的操作都是由WifiServiceImpl实现的,这里我们先看一下他们的通信方式,第一种是是远程服务的直接调用,跟平时使用AIDL是一样的。

 第二种是通过AsyncChannel的方式,这种方式可以很方便的实现跨进程互相调用。

WifiManager.java

 上面的Message会发送到WifiServiceImpl,而WifiServiceImpl处理好又会回调到WifiManager。

WifiServiceImpl.java

 上面的回调的消息会在WifiManager的内部类ServiceHandler中收到并处理。

WifiServiceImpl对Wifi的操作,主要是通过WifiController实现,WifiController是一个状态机(TODO状态改变怎么发送到底层)。

以上是关于Android框架WiFi架构的主要内容,如果未能解决你的问题,请参考以下文章

Android学习笔记一之第一个Android程序

Android网络框架

android开发-获取wifi列表

Android基于wifi的无线HID设备实现

如何抓取 android app 的 http 请求

WiFi-Direct 在游戏开发中的使用 (Android)