Android 源码分析 - 无线 - Java层

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);

           }

            // ……

        }

        // ……

    }

    // ……

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fighting Horse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值