WIFI Architecture Overview
Wi-Fi(Wireless Fidelity)是一个无线网络通信技术的品牌,由Wi-Fi联盟(Wi-Fi Alliance,缩写为WFA)拥有。
WFA专门负责Wi-Fi认证与商标授权工作。严格地说,Wi-Fi是一个认证的名称,该认证用于测试无线网络设备是否符合IEEE802.11系列协议规范。
通过该认证的设备将被授予一个名为Wi-Fi CERTIFIED的商标,其目的就是为了保证无线设备之间的互通性。
不过,随着获得Wi-Fi认证设备的普及,人们也就习以为常地称无线网络为Wi-Fi网络了。
相关名词解释
- LAN(Local Area Network):局域网,是路由和主机组成的内部局域网,一般为有线网络
- WAN(Wild Area Network):广域网,是外部一个更大的局域网
- WLAN(Wireless Local Area Network):无线局域网,指应用无线通信技术将计算机设备互联起来,构成可以互相通信和实现资源共享的网络体系
- IEEE802.11协议规范:由IEEE协会针对无线局域网通信在网络通信协议层中的MAC(Media Access Control)和PHY(Physical Layer)两层制定的规范
- AP(Access Point):无线访问接入点,将各个无线网络客户端连接到一起并接入以太网
- SSID:标识一个无线网络
- Band:频率范围,一般ap支持5g或2.4g两个频率范围的无线信号
- Channel:信道,对频段的进一步划分
- Channel Width:信道宽度,即信道带宽,影响吞吐量
- RTS/CTS:通信握手协议,一旦待传送数据大于设置的上限字节数就启动该协议,以解决“隐藏终端”问题
- WPA/EAP:加密认证协议
- RSSI(Receive Signal Strength Indication):接收信号强度指示,反映了无线网络质量的好坏
代码结构
应用层
/packages/apps/Settings/wifi
WifiSettings.java
用户对wifi功能的直接控制,触发相关流程开启,包括wifi启用/关闭,连接/断开,扫描等;
通过注册receiver接收底层上传的wifi状态变化消息,并在UI上体现出来。WifiEnable.java
通过控制switch bar,调用WifiManager对应接口发送命令给底层。
Framework层
/frameworks/opt/net/wifi/service
/frameworks/base/wifi/java/android/net/wifi
WifiManager.java
Wifi Client端提供了管理wifi连接的主要接口,通过Context.getSystemService(Context.WIFI_SERVICE)
获得实例。
用于管理已配置的网络列表,获取当前处于连接状态的网络信息。WifiServiceImpl.java
实现了WifiManager对wifi远程操作的请求。Framework层的核心控制类。WifiStateMachine.java
跟踪wifi连接状态,初始化各wifi状态并处理相应的事件。
wifi支持三种模式:Client,SoftAp和p2p,WifiStateMachine处理Client和SoftAp的动作,WifiP2pService处理p2p的动作。WifiMonitor.java
监听wpa_supplicant服务端的事件并传递给相应StateMachine处理。WifiNative.java
调用本地方法启用/终止wpa_supplicant守护进程并向其发送请求。
WifiMonitor监听wpa_supplicant事件的线程调用了WifiNative的waitForEvent()
方法。com_android_server_wifi_WifiNative.cpp
通过JNI调用本地函数,实现了对wpa_supplicant硬件抽象层函数调用的封装。
HAL层
/hardware/libhardware_legacy/wifi/
- wifi.c
wifi硬件抽象层部分,与wpa_supplicant守护进程通信,实现了驱动加载、wpa_supplicant启动、命令发送、消息监听等功能。
通过insmod加载驱动,通过android属性系统的property_set("ctl.start", supplicant_name)
启动wpa_supplicant,
通过包含wpa_ctrl.h头文件函数实现wpa_ctrl_request发送命令等功能与wpa_supplicant通信。
wpa_supplicant
/external/wpa_supplicant_8/
- wpa_ctrl.c
提供给外部程序与wpa_supplicant进程通信的接口,由socket实现跨进程通信。
主要方法有wpa_ctrl_open()打开连接,wpa_ctrl_request()发送命令,wpa_ctrl_recv()接收消息。