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); } // …… } // …… } // …… } |
本文详细介绍了Android系统中WiFi框架的实现,包括WifiNative、WifiMonitor、WifiStateMachine和P2pStateMachine的工作原理。讲解了各个组件如何交互处理WiFi连接、事件监听、状态转换以及P2P功能。此外,还提到了WifiService及其与SystemServer的交互。
2331

被折叠的 条评论
为什么被折叠?



