新聞中心

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

        Android WIFI 詳解

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

        public booleanonOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {

        case MENU_ID_SCAN:

        if(mWifiManager.isWifiEnabled()) {

        mScanner.resume();

        }

        return true;

        case MENU_ID_ADVANCED:

        startActivity(new Intent(this,AdvancedSettings.class));

        return true;

        }

        return super.onOptionsItemSelected(item);

        }

        private class Scanner extends Handler {

        private int mRetry = 0;

        void resume() {

        if (!hasMessages(0)) {

        sendEmptyMessage(0);

        }

        }

        void pause() {

        mRetry = 0;

        mAccessPoints.setProgress(false);

        removeMessages(0);

        }

        @Override

        public void handleMessage(Message message) {

        if (mWifiManager.startScanActive()){

        mRetry = 0;

        } else if (++mRetry >= 3) {

        mRetry = 0;

        Toast.makeText(WifiSettings.this, R.string.wifi_fail_to_scan,

        Toast.LENGTH_LONG).show();

        return;

        }

        mAccessPoints.setProgress(mRetry != 0);

        sendEmptyMessageDelayed(0, 6000);

        }

        }

        這里的mWifiManager.startScanActive()就會調用WifiService里的startScan()函數,下面的流程和上面的一樣,這里不贅述。

        當supplicant完成了這個掃描命令后,它會發送一個消息給上層,提醒他們掃描已經完成,WifiMonitor會接收到這消息,然后再發送給WifiStateTracker。

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

        void handleEvent(int event, String remainder) {

        switch (event) {

        caseDISCONNECTED:

        handleNetworkStateChange(NetworkInfo.DetailedState.DISCONNECTED,remainder);

        break;

        case CONNECTED:

        handleNetworkStateChange(NetworkInfo.DetailedState.CONNECTED,remainder);

        break;

        case SCAN_RESULTS:

        mWifiStateTracker.notifyScanResultsAvailable();

        break;

        case UNKNOWN:

        break;

        }

        }

        WifiStateTracker將會廣播SCAN_RESULTS_AVAILABLE_ACTION消息:

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

        public voidhandleMessage(Message msg) {

        Intent intent;

        ……

        case EVENT_SCAN_RESULTS_AVAILABLE:

        if(ActivityManagerNative.isSystemReady()) {

        mContext.sendBroadcast(new Intent(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));

        }

        sendScanResultsAvailable();

        /**

        * On receiving the first scanresults after connecting to

        * the supplicant, switch scanmode over to passive.

        */

        setScanMode(false);

        break;

        ……

        由于WifiSettings類注冊了intent,能夠處理SCAN_RESULTS_AVAILABLE_ACTION消息,它會調用handleEvent(),調用流程如下所示。

        WifiSettings.handleEvent() =>WifiSettings.updateAccessPoints() => mWifiManager.getScanResults() => mService.getScanResults()=> mWifiStateTracker.scanResults() => WifiNative.scanResultsCommand()……

        將獲取AP列表的命令發送到supplicant,然后supplicant通過Socket發送掃描結果,由上層接收并顯示。這和前面的消息獲取流程基本相同。

        (3)配置,連接AP

        當用戶選擇一個活躍的AP時,WifiSettings響應打開一個對話框來配置AP,比如加密方法和連接AP的驗證模式。配置好AP后,WifiService添加或更新網絡連接到特定的AP。

        packages/apps/settings/src/com/android/settings/wifi/WifiSetttings.java

        public booleanonPreferenceTreeClick(PreferenceScreen screen, Preference preference) {

        if (preference instanceof AccessPoint) {

        mSelected = (AccessPoint) preference;

        showDialog(mSelected, false);

        } else if (preference == mAddNetwork) {

        mSelected = null;

        showDialog(null, true);

        } else if (preference == mNotifyOpenNetworks) {

        Secure.putInt(getContentResolver(),

        Secure.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON,

        mNotifyOpenNetworks.isChecked() ? 1 : 0);

        } else {

        return super.onPreferenceTreeClick(screen, preference);

        }

        return true;

        }

        配置好以后,當按下“Connect Press”時,WifiSettings通過發送LIST_NETWORK命令到supplicant來檢查該網絡是否配置。如果沒有該網絡或沒有配置 它,WifiService調用addorUpdateNetwork()函數來添加或更新網絡,然后發送命令給supplicant,連接到這個網絡。 下面是從響應連接按鈕到WifiService發送連接命令的代碼:

        packages/apps/settings/src/com/android/settings/wifi/WifiSetttings.java

        public void onClick(DialogInterfacedialogInterface, int button) {

        if (button == WifiDialog.BUTTON_FORGET mSelected != null) {

        forget(mSelected.networkId);

        } else if (button == WifiDialog.BUTTON_SUBMIT mDialog !=null) {

        WifiConfiguration config = mDialog.getConfig();

        if (config == null) {

        if (mSelected != null !requireKeyStore(mSelected.getConfig())) {

        connect(mSelected.networkId);

        }

        } else if (config.networkId != -1) {



        關鍵詞:

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 连南| 溧水县| 正阳县| 武定县| 万源市| 石城县| 辉南县| 中牟县| 安龙县| 财经| 诸暨市| 文成县| 巨野县| 茌平县| 扎囊县| 团风县| 南丰县| 浦县| 奉新县| 西丰县| 广平县| 莫力| 桃源县| 萍乡市| 家居| 班戈县| 福安市| 彩票| 德阳市| 锦州市| 凤凰县| 黔东| 福鼎市| 万宁市| 扎兰屯市| 资兴市| 襄城县| 彭州市| 临夏县| 林芝县| 宁强县|