Android WiFi

  1. WiFi Enabled
    1.1 WiFi enable 3 ways.
    1.1.1 Enable WiFi in SetupWizard.

OnCreate()
if (isFirstEnterWifiSetupWizard == FIRST_ENTER && mSetupWizardCheck == 0) {
if (“ON”.equals(SecProductFeature_WLAN.SEC_PRODUCT_FEATURE_WLAN_CONFIG_DEF_STATUS) && !WIFI_OFF) {
mWifiManager.setWifiEnabled(true);
} else {
mWifiManager.setWifiEnabled(false);
}
private void updateLayoutMargin(Configuration newConfig)
mWifiEnabler = new WifiEnabler(this, mSwitchBar);

1.1.2 Enable Wifi in Notification

WifiTile.java
protected void handleClick()
//MultiState.OFF ==2
if (mWifiManager != null
&& mWifiManager.setWifiEnabled(mState.value == MultiState.OFF)) {
Log.d(TW_TAG, “onClick setWifiEnabled”);

        if(Feature.mQsAnimationIcon) {
            if (mState.value == MultiState.OFF)
                mIconOn.setAllowAnimation(true);
            else {
                mIconOff.get(0).setAllowAnimation(true);
            }
        }   
        if (SecProductFeature_KNOX.SEC_PRODUCT_FEATURE_KNOX_SUPPORT_MDM) {
         AuditLog.log(AuditLog.NOTICE, AuditLog.AUDIT_LOG_GROUP_APPLICATION, true,
                    android.os.Process.myPid(), this.getClass().getSimpleName(),
                    AuditEvents.WIFI_ENABLING );
       }
    } else {
        refreshState(mState.value);
        Slog.d(TW_TAG, "!setWifiEnabled");
        if (SecProductFeature_KNOX.SEC_PRODUCT_FEATURE_KNOX_SUPPORT_MDM) {
             AuditLog.log(AuditLog.NOTICE, AuditLog.AUDIT_LOG_GROUP_APPLICATION, true,
                       android.os.Process.myPid(), this.getClass().getSimpleName(),
                       AuditEvents.WIFI_DISABLING );
        }
    }

    if (mState.value == MultiState.OFF) {
        WifiStatusReceiver.enableToShowWifiPickerDialog(true);
    }

Log
12-29 15:31:05.907 D 3529 STATUSBAR-WifiTile handleClick : 2, 1
12-29 15:31:05.947 D 3529 STATUSBAR-WifiTile onClick setWifiEnabled
12-29 15:31:05.947 D 3529 WifiStatusReceiver Want to show AP LIST:true
12-29 15:31:06.017 D 3529 STATUSBAR-WifiTile onReceive : android.net.wifi.WIFI_STATE_CHANGED

1.1.3 Enable WiFi in Settings

WifiSettings
public void onStart() {
// On/off switch is hidden for Setup Wizard (returns null)
if (!mSecSetupWizardMode && !mInPickerDialog && !mInOffloadDialog && mWifiEnabler == null && !mInSetupWizardWifiScreen) {
mWifiEnabler = createWifiEnabler();
}
}

/**
 * @return new WifiEnabler or null (as overridden by WifiSettingsForSetupWizard)
 */
/* package */ WifiEnabler createWifiEnabler() {
    if ((getActivity() instanceof SettingsActivity)) {
        final SettingsActivity activity = (SettingsActivity) getActivity();
        mSwitchBar = activity.getSwitchBar();
        return new WifiEnabler(activity, mSwitchBar);
    } else {
        return null;
    }

}

public void onResume() {
if (mWifiEnabler != null) {
mWifiEnabler.resume(activity);
}
}
WifiEnabler
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
setWifiEnable(isChecked);
}

private void setWifiEnable(boolean enable) {
    if (mWifiManager.isWifiEnabled() == enable)
        return;
    mSwitch.setEnabled(false);
    if (!mWifiManager.setWifiEnabled(enable)) {
        // Error
        mSwitch.setEnabled(true);
        if (mSwitchBar != null) {
            mSwitchBar.setChecked(false);
        }
        if (mSwitchHandler != null) {
            mSwitchHandler.sendEmptyMessage(SWITCH_DISABLED);
        }
        //Toast.makeText(mContext, R.string.wifi_error, Toast.LENGTH_SHORT).show();
    }
}

1.1.4
1.2
2. Initialization for Wifi Module
2.1 Wifi Structure

2.2 WiFi Server Start
SystemServer
public static void main(String[] args) {
new SystemServer().run();
}

private void run() {
try {
startBootstrapServices();
startCoreServices();
startOtherServices();
//startThemeService();
} catch (Throwable ex) {
Slog.e(“System”, “********************************”);
Slog.e(“System”, “** Failure starting system services”, ex);
throw ex;
}
}

private void startOtherServices() {
mSystemServiceManager.startService(WIFI_P2P_SERVICE_CLASS);
mSystemServiceManager.startService(WIFI_SERVICE_CLASS);
if (SecProductFeature_WLAN.SEC_PRODUCT_FEATURE_WLAN_SUPPORT_HOTSPOT_20) {
mSystemServiceManager.startService(WIFI_HS20_SERVICE_CLASS);
}

            mSystemServiceManager.startService(
                        "com.android.server.wifi.WifiScanningService");

            mSystemServiceManager.startService("com.android.server.wifi.RttService");

//< RNTFIX:: Ethernet
if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_ETHERNET) ||
SecProductFeature_COMMON.SEC_PRODUCT_FEATURE_COMMON_SUPPORT_ETHERNET) {
mSystemServiceManager.startService(ETHERNET_SERVICE_CLASS);
try {
Slog.i(TAG, “Connectivity Service”);
connectivity = new ConnectivityService(
context, networkManagement, networkStats, networkPolicy);
ServiceManager.addService(Context.CONNECTIVITY_SERVICE, connectivity);
networkStats.bindConnectivityManager(connectivity);
networkPolicy.bindConnectivityManager(connectivity);
} catch (Throwable e) {
reportWtf(“starting Connectivity Service”, e);
}
}

(1) ConnectivityService
ConnectivityService ‘s core role is to provide data connection management services. It can get information from NetworkStateTracker.
NetworkInfo():Describe a given type of network interface information, including the network connection, network type whether such information. (getTypeName() can return “WIFI” or “MOBILE”)
LinkProperties():Describe a network connection attribute information. Including the network address, gateway, DNS, such as set/get HTTP proxy attribute information.
NetworkCapabilities(): Describe the network interface state information, including bandwidth, delay, etc.
NetworkStateTracker(): It is an interface. BaseNetworkStateTracker() is base class. It is control and observe state of a specific network.

(2) WifiService
public WifiService(Context context) {
super(context);
mImpl = new WifiServiceImpl(context);
}

public final class WifiServiceImpl extends IWifiManager.Stub {
private class ClientHandler extends Handler{}
private class WifiStateMachineHandler extends Handler {}
public WifiServiceImpl(Context context) {
mTrafficPoller = new WifiTrafficPoller(mContext, this, mInterfaceName);
mWifiStateMachine = new WifiStateMachine(mContext, mInterfaceName, mTrafficPoller);

mNotificationController = new WifiNotificationController(mContext, mWifiStateMachine);
mSettingsStore = new WifiSettingsStore(mContext);

HandlerThread wifiThread = new HandlerThread("WifiService");
wifiThread.start();
mClientHandler = new ClientHandler(wifiThread.getLooper());
mWifiStateMachineHandler = new WifiStateMachineHandler(wifiThread.getLooper());
mWifiController = new WifiController(mContext, this, wifiThread.getLooper());

}

/**
* Check if Wi-Fi needs to be enabled and start
* if needed
*
* This function is used only at boot time
*/
public void checkAndStartWifi() {
/* Check if wi-fi needs to be enabled */
boolean wifiEnabled = mSettingsStore.isWifiToggleEnabled();
mWifiController.start();
}
}
WifiServer Start Flow

Enabled WiFi flow

  1. Disabled Wifi

Explain for Chart:
(1) WifiService will sent message CMD_WIFI_TOGGLED.and WifiController ApStaDisableState deal with this message.
(2) WifiStateMachine will deal with CMD_STOP_SUPPLICANT. In WaitForP2pDisableState will sent CMD_DISABLE_P2P_REQ and deal with CMD_DISABLE_P2P_RSP. State change to SupplicantStoppingState.
(3) In SupplicantStoppingState, it will call handleNetworkDisconnect() to stop DHCP and clear some message. It will call WifiNative.stopSupplicant() to deal with “TERMINATE” order in wpa_supplicant.
(4) In WifiP2PService deal with WifiMonitor.stopMonitoring, WifiStateMachine receive SUP_DISCONNECTION_EVENT, process this message.
Usefully log:
3041 D WifiController: handleMessage: E msg.what=CMD_WIFI_TOGGLED
3041 D WifiController: processMsg: ApStaDisabledState
3025 D WifiStateMachine: handleMessage: E msg.what=CMD_STOP_SUPPLICANT
3025 D WifiStateMachine: processMsg: DisconnectedState
3025 D WifiStateMachine: processMsg: ConnectModeState
3025 D WifiStateMachine: processMsg: DriverStartedState
3025 D WifiStateMachine: processMsg: SupplicantStartedState
3025 D WifiStateMachine: transitionTo: destState=WaitForP2pDisableState
3025 D WifiStateMachine: handleMessage: E msg.what=CMD_DISABLE_P2P_RSP
3025 D WifiStateMachine: processMsg: WaitForP2pDisableState
3025 D WifiStateMachine: transitionTo: destState=SupplicantStoppingState
3025 D WifiStateMachine: setWifiState: disabled
3025 D WifiStateMachine: transitionTo: destState=InitialState

  1. Scan and connect AP
    4.1 WiFi Scan Flow

c
Explain for Chart:
(1) In WifiStateMachine process CMD_START_SCAN.
(2) WifiNative.scan deal with scan in wap_supplicant.
(3) WifiMonitor receive the message from wap_supplicant.
(4) WifiStateMachine process the those message, sendbroadcast, notify the interface to update AP list.
Usefully log:
3025 D WifiStateMachine: handleMessage: E msg.what=131143—- CMD_START_SCAN
3025 D WifiStateMachine: processMsg: DriverStartedState
3025 D WifiNative-wlan0: doBoolean: SCAN
8290 D WifiService: startScan by pid=3598, uid=1000
13617 D WifiMonitor: Event [IFNAME=wlan0 WPS-AP-AVAILABLE ]
3025 D WifiStateMachine: handleMessage: E msg.what=147461—- SCAN_RESULTS_EVENT
3025 D WifiStateMachine: processMsg: SupplicantStartedState
3025 D WifiNative-wlan0: doString: BSS RANGE=0- MASK=0x21987
3598 D WifiSettings: [updateAccessPoints] wifiState : 3

4.2 Connect AP

Explain for Chart:
(1) Mainly work is WifiManager.connect().WifiConfigStore.saveNetwok(config) is used for save AP to wpa_supplicant.conf. WifiConfigStore.selectNetwork(netId) is used for enable connecting AP. WifiNative.reconnect() sent the reconnect request to wpa_supplicant. You can refer the Figure1.
(2) wpa_supplicant continuous delivery CTRL-EVENT-STATE-CHANGE、ASSOCIATING、ASSOCIATED event, and WifiMonitor will parse event.
(3) After connection is successful between WLAN and AP, wpa_supplicant will sent CTRL-EVENT-CONNECTED event. After processed this event, enter get IP address part.
(4) Two ways to get IP address. One is static, the other is dynamic. This need interact with DhcpStateMachine.
(5) VerifyingLinkState verify the connection state. This function come true by WifiWatchdogStateMachine.
(6) Captive Portal is the authentication method. After captive check complete, the upper translation to ConnectedState.Connection ok.

Usefully log:
3025 D WifiStateMachine: handleMessage: E msg.what=151553—- CONNECT_NETWORK
21315 I wpa_supplicant: CTRL-EVENT-CONNECTED - Connection to 00:24:01:66:31:6d completed (auth) [id=0 id_str=]
21321 D WifiMonitor: Event [IFNAME=wlan0 CTRL-EVENT-CONNECTED - Connection to 00:24:01:66:31:6d completed (auth) [id=0 id_str=]]
3025 D WifiStateMachine: handleMessage: E msg.what=147459—- NETWORK_CONNECTION_EVENT
21387 D DhcpStateMachine: DHCP succeeded on wlan0
3025 D WifiStateMachine: DHCP successful
3042 D ConnectivityService: Captive portal check NetworkInfo: type: WIFI[], state: CONNECTING/CAPTIVE_PORTAL_CHECK, reason: (unspecified), extra: “dlink”, roaming: false, failover: false, isAvailable: true, isConnectedToProvisioningNetwork: false
3042 D ConnectivityService: handleCaptivePortalTrackerCheck: call captivePortalCheckComplete ni=NetworkInfo: type: WIFI[], state: CONNECTING/CAPTIVE_PORTAL_CHECK, reason: (unspecified), extra: “dlink”, roaming: false, failover: false, isAvailable: true, isConnectedToProvisioningNetwork: false
3025 D WifiStateMachine: transitionTo: destState=ConnectedState

  1. WifiStateMachine
    Learn about relationship about HSM.

(1) addState
(2) transitionTo
(3) obtainMessage
(4) sendMessage
(5) deferMessage
(6) enter()
(7) exit()
HSM is complex, you can treat it as tree. Two point: (1) About change the state, for example, ConnectModeState change to ScanModeState. The flow as blew: ConnectModeState.exit()->ScanModeState.enter. (2) If the current state can’t deal with this message, its father will handle it.

  1. IPC
    WifiManager and WifiServer.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据来源:中经数据库 主要指标110多个(全部都是纯粹的 市辖区 指标),大致是: GDP GDP增速 第一产业增加值占GDP比重 第二产业增加值占GDP比重 第三产业增加值占GDP比重 人均GDP 社会消费品零售总额 固定资产投资(不含农户) 新设外商投资企业数_外商直接投资 实际利用外资金额(美元) 一般公共预算收入 一般公共预算支出 一般公共预算支出_教育 一般公共预算支出_科学技术 金融机构人民币各项存款余额_个人储蓄存款 金融机构人民币各项存款余额 金融机构人民币各项贷款余额 规模以上工业企业单位数 规模以上工业企业单位数_内资企业 规模以上工业企业单位数_港澳台商投资企业 规模以上工业企业单位数_外商投资企业 规模以上工业总产值 规模以上工业总产值_内资企业 规模以上工业总产值_港澳台商投资企业 规模以上工业总产值_外商投资企业 规模以上工业企业流动资产合计 规模以上工业企业固定资产合计 规模以上工业企业利润总额 规模以上工业企业应交增值税 规模以上工业企业主营业务税金及附加 户籍人口数 年均户籍人口数 户籍人口自然增长率 第一产业就业人员占全部城镇单位就业人员比重 第二产业就业人员占全部城镇单位就业人员比重 第三产业就业人员占全部城镇单位就业人员比重 城镇非私营单位就业人员数 城镇非私营单位就业人员数_第一产业 城镇非私营单位就业人员数_第二产业 城镇非私营单位就业人员数_第三产业 城镇非私营单位就业人员数_农、林、牧、渔业 城镇非私营单位就业人员数_采矿业 城镇非私营单位就业人员数_制造业 城镇非私营单位就业人员数_电力、热力、燃气及水生产和供应业 城镇非私营单位就业人员数_建筑业 城镇非私营单位就业人员数_批发和零售业 城镇非私营单位就业人员数_交通运输、仓储和邮政业 城镇非私营单位就业人员数_住宿和餐饮业 城镇非私营单位就业人员数_信息传输、软件和信息技术服务业 城镇非私营单位就业人员数_金融业 城镇非私营单位就业人员数_房地产业 城镇非私营单位就业人员数_租赁和商务服务业 城镇非私营单位就业人员数_科学研究和技术服务业 城镇非私营单位就业人员数_水利、环境和公共设施管理业 城镇非私营单位就业人员数_居民服务、修理和其他服务业 城镇非私营单位就业人员数_教育 城镇非私营单位就业人员数_卫生和社会工作 城镇非私营单位就业人员数_文化、体育和娱乐业 城镇非私营单位就业人员数_公共管理、社会保障和社会组织 城镇非私营单位在岗职工平均人数 城镇就业人员数_私营企业和个体 城镇非私营单位在岗职工工资总额 城镇非私营单位在岗职工平均工资 城镇登记失业人员数 建成区面积 建设用地面积 建设用地面积_居住用地 液化石油气供气总量 液化石油气供气总量_居民家庭 人工煤气、天然气供气总量 人工煤气、天然气供气总量_居民家庭 液化石油气用气人口 人工煤气、天然气用气人口 城市公共汽电车运营车辆数 城市出租汽车运营车辆数 城市公共汽电车客运总量 道路面积 排水管道长度 建成区绿化覆盖面积 建成区绿化覆盖率 绿地面积 公园绿地面积 维护建设资金支出 土地面积 生活用水供水量 供水总量 全社会用电量 城乡居民生活用电量 工业生产用电量 房地产开发投资 房地产开发投资_住宅 限额以上批发和零售业法人单位数 限额以上批发和零售业商品销售总额 普通中学学校数 中等职业教育学校数 普通小学学校数 普通高等学校专任教师数 普通中学专任教师数 中等职业教育专任教师数 普通小学专任教师数 普通高等学校在校生数 普通中学在校生数 中等职业教育在校生数 普通小学在校生数 电视节目综合人口覆盖率 公共图书馆总藏量_图书 医疗卫生机构数_医院和卫生院 卫生人员数_执业(助理)医师 医疗卫生机构床位数_医院和卫生院 城镇职工基本养老保险参保人数 职工基本医疗保险参保人数 失业保险参保人数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值