新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Android WIFI 詳解

        Android WIFI 詳解

        作者: 時間:2016-10-08 來源:網絡 收藏

        if (mSelected != null) {

        mWifiManager.updateNetwork(config);

        saveNetworks();

        }

        } else {

        int networkId =mWifiManager.addNetwork(config);

        if (networkId != -1) {

        mWifiManager.enableNetwork(networkId, false);

        config.networkId =networkId;

        if (mDialog.edit || requireKeyStore(config)){

        saveNetworks();

        } else {

        connect(networkId);

        }

        }

        }

        }

        }

        FrameworksbasewifijavaandroidnetwifiWifiManager.java

        public intupdateNetwork(WifiConfiguration config) {

        if(config == null || config.networkId 0) {

        return -1;

        }

        return addOrUpdateNetwork(config);

        }

        private intaddOrUpdateNetwork(WifiConfiguration config) {

        try {

        return mService.addOrUpdateNetwork(config);

        } catch (RemoteException e) {

        return -1;

        }

        }

        WifiService.addOrUpdateNetwork()通過調用mWifiStateTracker.setNetworkVariable()將連接命令發送到Wpa_supplicant。

        (4)獲取IP地址

        當連接到supplicant后,WifiMonitor就會通知WifiStateTracker。

        Frameworks/base/wifi/java/android/net/wifi/WifiMonitor.java

        Public void Run(){

        if (connectToSupplicant()) {

        // Send a message indicatingthat it is now possible to send commands

        // to the supplicant

        mWifiStateTracker.notifySupplicantConnection();

        } else {

        mWifiStateTracker.notifySupplicantLost();

        return;

        }

        ……

        }

        WifiStateTracker發送EVENT_SUPPLICANT_CONNECTION消息到消息隊列,這個消息有自己的handlermessage()函數處理,它會啟動一個DHCP線程,而這個線程會一直等待一個消息事件,來啟動DHCP協議分配IP地址。

        frameworks/base/wifi/java/android/net/wifi/WifiStateTracker.java

        void notifySupplicantConnection() {

        sendEmptyMessage(EVENT_SUPPLICANT_CONNECTION);

        }

        public void handleMessage(Message msg) {

        Intent intent;

        switch (msg.what) {

        case EVENT_SUPPLICANT_CONNECTION:

        ……

        HandlerThread dhcpThread = newHandlerThread(DHCP Handler Thread);

        dhcpThread.start();

        mDhcpTarget = newDhcpHandler(dhcpThread.getLooper(), this);

        ……

        ……

        }

        當Wpa_supplicant連接到AP后,它會發送一個消息給上層來通知連接成功,WifiMonitor會接受到這個消息并上報給WifiStateTracker。

        Frameworks/base/wifi/java/android/net/wifi/WifiMonitor.java

        void handleEvent(int event, String remainder) {

        switch (event) {

        case DISCONNECTED:

        handleNetworkStateChange(NetworkInfo.DetailedState.DISCONNECTED,remainder);

        break;

        case CONNECTED:

        handleNetworkStateChange(NetworkInfo.DetailedState.CONNECTED,remainder);

        break;

        ……

        }

        private voidhandleNetworkStateChange(NetworkInfo.DetailedState newState, String data) {

        StringBSSID = null;

        intnetworkId = -1;

        if(newState == NetworkInfo.DetailedState.CONNECTED) {

        Matcher match = mConnectedEventPattern.matcher(data);

        if(!match.find()) {

        if (Config.LOGD) Log.d(TAG, Could not find BSSID in CONNECTEDevent string);

        }else {

        BSSID = match.group(1);

        try {

        networkId = Integer.parseInt(match.group(2));

        } catch (NumberFormatException e) {

        networkId = -1;

        }

        }

        }

        mWifiStateTracker.notifyStateChange(newState,BSSID, networkId);

        }

        void notifyStateChange(DetailedState newState, StringBSSID, int networkId) {

        Messagemsg = Message.obtain(

        this, EVENT_NETWORK_STATE_CHANGED,

        newNetworkStateChangeResult(newState, BSSID, networkId));

        msg.sendToTarget();

        }

        caseEVENT_NETWORK_STATE_CHANGED:

        ……

        configureInterface();

        ……

        private void configureInterface() {

        checkPollTimer();

        mLastSignalLevel = -1;

        if(!mUseStaticIp) { //使用DHCP線程動態IP

        if(!mHaveIpAddress !mObtainingIpAddress) {

        mObtainingIpAddress = true;

        //發送啟動DHCP線程獲取IP

        mDhcpTarget.sendEmptyMessage(EVENT_DHCP_START);

        }

        } else { //使用靜態IP,IP信息從mDhcpInfo中獲取

        intevent;

        if(NetworkUtils.configureInterface(mInterfaceName, mDhcpInfo)) {

        mHaveIpAddress = true;

        event = EVENT_INTERFACE_CONFIGURATION_SUCCEEDED;

        if (LOCAL_LOGD) Log.v(TAG, Static IP configurationsucceeded);

        }else {

        mHaveIpAddress = false;

        event = EVENT_INTERFACE_CONFIGURATION_FAILED;

        if (LOCAL_LOGD) Log.v(TAG, Static IP configuration failed);

        }

        sendEmptyMessage(event); //發送IP獲得成功消息事件

        }

        }

        DhcpThread獲取EVENT_DHCP_START消息事件后,調用handleMessage()函數,啟動DHCP獲取IP地址的服務。



        關鍵詞:

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 嘉禾县| 龙口市| 全南县| 平顶山市| 赤壁市| 潢川县| 安丘市| 绥滨县| 台北县| 泾川县| 双柏县| 阳新县| 金塔县| 襄樊市| 津南区| 桂东县| 宜君县| 塘沽区| 韶关市| 加查县| 承德县| 舟山市| 黔江区| 高要市| 琼海市| 开平市| 邻水| 苍梧县| 三穗县| 安新县| 梨树县| 昌江| 伊吾县| 昭通市| 丁青县| 兴国县| 灵武市| 古蔺县| 太和县| 萨迦县| 闻喜县|