一、 概要
还记得刚开始接触android wifi的时候,由于上一任离职很快,只留下了一周的时间来给我做这个模块的对接,一周的时间能把一些文件交接好就已经是万事大吉,何谈wifi具体的功能如何去实现。
所以,在刚开始进入到android wifi学习的时候,一脸懵逼,代码我该从哪里开始看起,我该从什么地方去了解这些知识点。
这里我将以一个过来人的身份来给大家阐述andriod wifi这个模块的相关内容。
二、 整体架构
首先,我们在学习一个模块时,不能一开始就去坑代码,要先以宏观俯视的角度来查看这个模块,不然我们两眼一抹黑,就进入到代码的时候,发现这里不懂哪里也不懂,只有先了解事务的一个宏观情况,然后再到代码里面去深挖才能慢慢对模块真正掌握。
先贴上android的wifi架构图,然后再慢慢细品
如上是GOOGLE官方给wifi功能做的一个基本数据流向的框架,如果要细分其中的功能模块,其实关于wifi 感知(WifiAware)和wifi 往返时间 (WifiRtt)功能,是分别从android8 和9 分别引入的,且后者是为了增强前者而开发出来的功能。
这两个功能可以看成是一个功能wifi感知,该功能支持设备可以直接使用感知协议发现其他设备、与其他设备互连,以及将覆盖范围扩展到其他设备(wifi RTT),而无需链接到互联网或移动网络。此功能支持在断开网络的情况下,在可信设备与应用之间轻松共享高吞吐量数据。
这两个功能本文就不细讲,只做一个简单的功能介绍。
其实在google官方的这个图里面,并不能很好的体现整个wifi提供的架构,他是根据他android和hal的架构做了一个简单的框架图。
补充一点小知识,wifi 感知和wifi p2p技术的区别:
- wifi 感知可以在设备发现阶段在设备之间发送数据(255个bytes),并且在需要时可以打开设备之间的链接以发送更大的数据量;
- wifi P2P必须执行身份认证后,建立起套接字后,才能在设备之间发送数据。
三、 wifi 模块细分
wifi整体功能分为三个功能模块:
- AP(Acess Point)也就是热点模式,相当于家里路由器,但是一般在wifi的功能模块里面我们叫他热点或者host ap。
- STA(Station)也就是路由模式,也就相当于手机,作为一个去连接热点的设备,一般手机开启wifi时,默认就是这个模式。
- P2P(point to point)也就是wifi直连模式,这个功能用的最多的是手机投屏功能,一般android手机使用的miracast进行投屏。
如下是划分几个常用功能模块细分后的wifi功能框架图。
以上,三个板块就是wifi的功能具体划分,至于前面所说的wifi感知和wifi RTT这些功能不是重点功能,如需了解请自行查看相关资料,这里不做重点介绍。下面就图示内容做一个简单模块介绍。
- 最上层是APP应用层,会wifimanager会直接暴露相关接口给到app去使用,当然如果要使用p2p功能需要对应wifip2pmanager的接口。
- framework层,manager下来就是各个具体功能的serivce了,wifiserviceImpl.java就是管理AP和STA两种模式,wifiP2PserivceImpl.java就是管理wifi直连功能的。
- 再下来就是wificond、HIDL和HAL层,这层东西有点多分开细讲:
- wifi驱动在安装后,会向network那边注册生成一个iface节点,节点会在HAL层被扫描到,并保存在HAL的list里面。
- 上层APP在开启wifi(STA)或AP或P2P功能时,会通过HIDL的service去对接HAL,这里的HAL和HIDL是使用callback的方式解耦的,HAL又各个vendor提供,HIDL是统一的,但在编译时,会把这两块编译成一个bin去执行。
- Wificond的作用是用来做扫描和AP的启动用,这个组件是通过AIDL的方式连接到framework的,在wifi(STA)打开后,会自动去scan周围是否有可用AP可用接入,并且将结果返回给到framework层。
- hostapd,这个组件主要是用于AP热点使用的的组件,负责控制管理外来STA连接和认证。
- Wpa_supplicant,这个组件是进行身份认证的中间件实现安全保护的,由HIDL直接调用Wpa_supplicant的接口,wifi发起连接,认证和结果返回都需要经过这里进行校验,在手机里面体现在于选WPA/WPA3等身份认证选项,就是这个模块的工作。(WPA是一个独立的单独的进程,且有且仅有一个主线程在驱动工作,该进程是基于event驱动来进行的,很有编程学习价值)
- netlink,这个组件是直接通过socket套接字与内核进行通讯,使用AF_INIT的方式做为对接kernel的Netlink,通过对应cmd结构体进行发送数据到kernel,由net模块调用NL80211驱动的回调,经过CFG80211然后传递给注册过来的wifi驱动模块。
四、 小结
以上便是本文的内容,主要介绍wifi总体的架构,后面会再出几期文章来讲述每个模块的具体的实现。如有错误还请指正,感谢!!