wifi
源代码位于:/frameworks/base/wifi/java/com/android/net/wifi。
WifiNative通过JNI封装Wifi HAL函数。大部分方法通过doTypeCommandNative发送命令,接收应答实现。Type可以是Boolean、Int或者String。每个WifiNative实例与一个网络Interface对应。发送的命令要加上“IFNAME=<name> ”前缀(p2p0除外)。
WifiMonitor监听并处理网络Interface的事件,但是实际上只绑定WifiNative和StateMachine,具体的工作由WifiMonitorSingleton完成。
WifiMonitorSingleton管理多个WifiMonitor,但是只使用第一个注册的WifiNative接收事件。创建一个内部线程,通过WifiNative等待事件,并处理。接收的事件带有前缀“IFNAME=<name> ”,根据name找到对应的WifiMonitor(没有名字的是p2p0),事件发送给其WifiStateMachine处理。
事件 | 说明 | |||||||
WPA: | 状态机处理“验证失败” | |||||||
WPS- | SUCCESS | 状态机 | ||||||
FAIL | 提取失败原因:config_error和reason | |||||||
OVERLAP-DETECTED | 状态机 | |||||||
TIMEOUT | 状态机 | |||||||
P2P- | DEVICE-FOUND | 创建WifiP2pDevice,状态机 | ||||||
DEVICE-LOST | ||||||||
FIND-STOPPED | 状态机 | |||||||
GO-NEG- | REQUEST | 创建WifiP2pConfig,状态机 | ||||||
SUCCESS | 状态机 | |||||||
FAILURE | p2pError提取status,状态机 | |||||||
GROUP-FORMATION- | SUCCESS | 状态机 | ||||||
FAILURE | p2pError提取status,状态机 | |||||||
GROUP- | STARTED | 创建WifiP2pGroup,状态机 | ||||||
REMOVED | ||||||||
INVITATION- | RECEIVED | |||||||
RESULT | p2pError提取status,状态机 | |||||||
PROV-DISC- | PBC-REQ | 创建WifiP2pProvDiscEvent,状态机 | ||||||
PBC-RESP | ||||||||
ENTER-PIN | ||||||||
SHOW-PIN | ||||||||
FAILURE | 状态机 | |||||||
SERV-DISC-RESP | 创建List<WifiP2pServiceResponse>,状态机 | |||||||
AP-STA- | CONNECTED | 创建WifiP2pDevice,状态机 | ||||||
DISCONNECTED | ||||||||
CTRL-EVENT- | CONNECTED | 提取id、SSID,状态机 | ||||||
DISCONNECTED | ||||||||
STATE-CHANGE | 提取id、SSID、BSSID、state,创建StateChangeResult,状态机 | |||||||
SCAN-RESULTS | 状态机 | |||||||
LINK-SPEED | 【未处理】 | |||||||
TERMINATING | 累计10次recv error错误,状态机,退出线程 | |||||||
DRIVER-STATE | 状态机,只处理HANGED | |||||||
EAP-FAILURE | 状态机处理“验证失败” | |||||||
ASSOC-REJECT | 状态机 | |||||||
SupplicantStateTracker跟踪处理wap_supplicant后台服务的状态变化。
WifiStateMachine创建NetworkInfo、WifiNative、、WifiConfigStore、WifiMonitor、SupplicantStateTracker。与WifiP2pManager(实为WifiP2pService.P2pStateMachine)建立AsyncChannel连接,发送P2P状态切换。
WifiStateMachine状态:
状态 | enter | processMessage |
Default | ||
Initial | ||
SupplicantStarting | ||
SupplicantStarted | ||
DriverStarting | ||
DriverStarted | ||
ScanMode | ||
ConnectMode | ||
L2Connected | ||
ObtainingIp | ||
VerifyingLink | ||
CaptivePortalCheck | ||
Connected | ||
Disconnecting | ||
Disconnected | ||
WpsRunning | ||
WaitForP2pDisable | ||
DriverStopping | ||
DriverStopped | ||
SupplicantStopping | ||
SoftApStarting | ||
SoftApStarted | ||
Tethering | ||
Tethered | ||
Untethering |
WifiStateMachine事件源:
事件源 | 事件 | 说明 |
WifiService | WifiManager.* CMD_* | 客户端AsyncChannel 接口被调用 |
WifiMonitor | WifiMonitor.* | |
WifiController | CMD_START_SUPPLICANT CMD_STOP_SUPPLICANT CMD_SET_OPERATIONAL_MODE CMD_START_DRIVER CMD_STOP_DRIVER CMD_START_AP CMD_STOP_AP CMD_SET_HIGH_PERF_MODE CMD_RELOAD_TLS_AND_RECONNECT | |
NetworkManagementService | CMD_IP_ADDRESS_UPDATED CMD_IP_ADDRESS_REMOVED | 通过InterfaceObserver监视 |
ConnectivityManager | CMD_TETHER_STATE_CHANGE | ACTION_TETHER_STATE_CHANGED |
UNKNOWN | CMD_START_SCAN | ACTION_START_SCAN |
CMD_SET_SUSPEND_OPT_ENABLED | Intent.ACTION_SCREEN_ON Intent.ACTION_SCREEN_OFF | |
CMD_START_NEXT_BATCHED_SCAN | ACTION_REFRESH_BATCHED_SCAN | |
CMD_DELAYED_STOP_DRIVER | ACTION_DELAYED_DRIVER_STOP | |
CMD_BOOT_COMPLETED | Intent.ACTION_BOOT_COMPLETED |
WifiWatchdogStateMachine监控无线网络的信号质量,由WifiService创建。由广播事件、设置改变驱动。
WifiWatchdogStateMachine的状态:
状态 | enter | processMessage |
Default | ||
WatchdogDisabled | ||
WatchdogEnabled | ||
NotConnected | ||
VerifyingLink | 发送CMD_RSSI_FETCH | 通过WifiStateMachine查询网络速度,发包失败率 |
Connected | ||
OnlineWatch | ||
LinkMonitoring | ||
Online |
WifiManager与WifiService的ClientHandler建立AsyncChannel连接。当需要异步处理应答时,使用AsyncChannel通信(通过ServiceHandler处理应答),否则直接Binder跨进程调用。WifiManager定义了下列异步回调接口:ActionListener、WpsListener(返回Pin)、TxPacketCountListener(返回count)。提供WifiLock、MulticastLock。
services/wifip2p
源代码位于:/frameworks/base/wifi/java/android/net/wifi/p2p。
WifiP2pManager提供发现、请求、连接远程设备的方法。与P2pStateMachine建立AsyncChannel连接(包含在Channel子类中),Channel.P2pHandler处理异步应答,调用回调接口:ActionListener、PeerListListener、ServiceResponseListener、DnsSdServiceResponseListener、DnsSdTxtRecordListener、UpnpServiceResponseListener、PersistentGroupInfoListener。
WifiP2pDevice描述WifiP2p的一个设备。
WifiP2pGroup描述WifiP2p的一个AP。
WifiP2pWfdInfo描述WifiDisplay参与方信息。
WifiP2pService实现IWifiP2pManager接口,创建P2pStateMachine处理外部请求。
WifiP2pService.P2pStateMachine创建WifiNative、WifiMonitor、WifiP2pDeviceList、WifiP2pGroupList、WifiP2pInfo、WifiP2pConfig。
P2pStateMachine状态:
状态 | enter | processMessage |
Default | ||
P2pNotSupported | ||
P2pDisabling | ||
P2pDisabled | ||
P2pEnabling | ||
P2pEnabled | ||
Inactive | ||
GroupCreating | ||
UserAuthorizing InviteRequest | ||
UserAuthorizing NegotiationRequest | ||
ProvisionDiscovery | ||
GroupNegotiation | ||
FrequencyConflict | ||
GroupCreated | ||
UserAuthorizingJoin | ||
OngoingGroupRemoval |
P2pStateMachine事件源:
事件源 | 事件 | 说明 |
WifiP2pManager | WifiManager.* | AsyncChannel |
WifiMonitor | WifiMonitor.* | |
WifiStateMachine | WifiStateMachine. CMD_ENABLE_P2P CMD_DISABLE_P2P_REQ WifiP2pService. SET_COUNTRY_CODE | |
DhcpStateMachine | DhcpStateMachine. CMD_PRE_DHCP_ACTION CMD_POST_DHCP_ACTION CMD_ON_QUIT |
服务由SystemServer启动,运行在system_server进程中。
framework/base/services/java/com/android/server/SystemServer.java: ------------------------------------------------------------------------- public void initAndLoop() { // …… if (factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) { // …… if (!disableNetwork) { // …… try { Slog.i(TAG, "Wi-Fi P2pService"); wifiP2p = new WifiP2pService(context); ServiceManager.addService( Context.WIFI_P2P_SERVICE, wifiP2p); } catch (Throwable e) { reportWtf("starting Wi-Fi P2pService", e); } // …… } // …… } // …… } |
services/wifi
源代码位于:/frameworks/base/services/java/com/android/server/wifi。
WifiService实现IWifiManager接口,上层调用和设备状态信息(如屏幕开关、电池状态、待机策略)发送给WifiController处理。为了实现一些操作的同步等待结果,WifiService与WifiStateMachine建立AsyncChannel连接(通过WifiStateMachineHandler处理断开重连)。WifiService通过ClientHandler处理客户端的异步请求,请求稍作判断后一般直接转发给WifiStateMachine处理。
WifiController也是一个状态机,基于一系列输入(API或者设备状态)控制WifiStateMachine。上层状态信息用于决定Wifi模式(STA、AP),控制WifiStateMachine启动,停止。WifiController运行于WifiService创建的同一个线程上。
WifiController状态:
状态 | enter | processMessage |
Default | ||
ApStaDisabled | ||
StaEnabled | ||
DeviceActive | ||
DeviceInactive | ||
ScanOnlyLockHeld | ||
FullLockHeld | ||
FullHighPerfLockHeld | ||
NoLockHeld | ||
StaDisabledWithScan | ||
ApEnabled | ||
Ecm |
WifiSettingsStore:跟踪一系列设置(wifi开关, 飞行模式airplane开关, tethering热点开关, 扫描模式scan mode开关),提供方法计算应该打开或者关闭wifi。
WifiTrafficPoller计算上一秒有没有进出wifi流量,通知侦听的应用(目前仅用于系统状态栏显示)。
WifiNotificationController通过NotificationManager控制网络打开通知是否显示。
服务由SystemServer启动,运行在system_server进程中。
framework/base/services/java/com/android/server/SystemServer.java: ------------------------------------------------------------------------- public void initAndLoop() { // …… if (factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) { // …… if (!disableNetwork) { // …… try { Slog.i(TAG, "Wi-Fi Service"); wifi = new WifiService(context); ServiceManager.addService(Context.WIFI_SERVICE, wifi); } catch (Throwable e) { reportWtf("starting Wi-Fi Service", e); } // …… } // …… } // …… } |