歡迎來到裝配圖網(wǎng)! | 幫助中心 裝配圖網(wǎng)zhuangpeitu.com!
裝配圖網(wǎng)
ImageVerifierCode 換一換
首頁 裝配圖網(wǎng) > 資源分類 > DOC文檔下載  

ANDROID移植WIFI設(shè)計(jì)原理(源碼分析)

  • 資源ID:39687151       資源大小:161KB        全文頁數(shù):7頁
  • 資源格式: DOC        下載積分:0積分
快捷下載 游客一鍵下載
會(huì)員登錄下載
微信登錄下載
三方登錄下載: 微信開放平臺(tái)登錄 支付寶登錄   QQ登錄   微博登錄  
二維碼
微信掃一掃登錄
下載資源需要0積分
郵箱/手機(jī):
溫馨提示:
用戶名和密碼都是您填寫的郵箱或者手機(jī)號(hào),方便查詢和重復(fù)下載(系統(tǒng)自動(dòng)生成)
支付說明:
本站最低充值0.01積分,下載本資源后余額將會(huì)存入您的賬戶,您可在我的個(gè)人中心查看。
驗(yàn)證碼:   換一換

 
賬號(hào):
密碼:
驗(yàn)證碼:   換一換
  忘記密碼?
    
友情提示
2、PDF文件下載后,可能會(huì)被瀏覽器默認(rèn)打開,此種情況可以點(diǎn)擊瀏覽器菜單,保存網(wǎng)頁到桌面,就可以正常下載了。
3、本站不支持迅雷下載,請(qǐng)使用電腦自帶的IE瀏覽器,或者360瀏覽器、谷歌瀏覽器下載即可。
4、本站資源下載后的文檔和圖紙-無水印,預(yù)覽文檔經(jīng)過壓縮,下載后原文更清晰。
5、試題試卷類文檔,如果標(biāo)題沒有明確說明有答案則都視為沒有答案,請(qǐng)知曉。

ANDROID移植WIFI設(shè)計(jì)原理(源碼分析)

Android移植: wifi設(shè)計(jì)原理(源碼分析) 博客分類: AndroidAndroidEXT初始化在 SystemServer 啟動(dòng)的時(shí)候,會(huì)生成一個(gè) ConnectivityService 的實(shí)例, try Log.i(TAG, "Starting Connectivity Service."); ServiceManager.addService(Context.CONNECTIVITY_SERVICE, newConnectivityService(context); catch (Throwable e) Log.e(TAG, "Failure starting Connectivity Service", e); ConnectivityService 的構(gòu)造函數(shù)會(huì)創(chuàng)建 WifiService, if (DBG) Log.v(TAG, "Starting Wifi Service."); mWifiStateTracker = new WifiStateTracker(context, handler); WifiService wifiService = new WifiService(context, mWifiStateTracker); ServiceManager.addService(Context.WIFI_SERVICE, wifiService);WifiStateTracker 會(huì)創(chuàng)建 WifiMonitor 接收來自底層的事件,WifiService 和 WifiMonitor 是整個(gè)模塊的核心。WifiService 負(fù)責(zé)啟動(dòng)關(guān)閉 wpa_supplicant、啟動(dòng)關(guān)閉 WifiMonitor 監(jiān)視線程和把命令下發(fā)給 wpa_supplicant,而 WifiMonitor 則負(fù)責(zé)從 wpa_supplicant 接收事件通知。連接 AP1. 使能 WIFIWirelessSettings 在初始化的時(shí)候配置了由 WifiEnabler 來處理 Wifi 按鈕, private void initToggles() mWifiEnabler = new WifiEnabler( this, (WifiManager) getSystemService(WIFI_SERVICE), (CheckBoxPreference) findPreference(KEY_TOGGLE_WIFI);當(dāng)用戶按下 Wifi 按鈕后, Android 會(huì)調(diào)用 WifiEnabler 的 onPreferenceChange, 再由 WifiEnabler調(diào)用 WifiManager 的 setWifiEnabled 接口函數(shù),通過 AIDL,實(shí)際調(diào)用的是 WifiService 的setWifiEnabled 函數(shù),WifiService 接著向自身發(fā)送一條 MESSAGE_ENABLE_WIFI 消息,在處理該消息的代碼中做真正的使能工作:首先裝載 WIFI 內(nèi)核模塊(該模塊的位置硬編碼為"/system/lib/modules/wlan.ko" ), 然 后 啟 動(dòng) wpa_supplicant ( 配 置 文 件 硬 編 碼 為"/data/misc/wifi/wpa_supplicant.conf") 再通過 WifiStateTracker 來啟動(dòng) WifiMonitor 中的監(jiān)視 ,線程。 private boolean setWifiEnabledBlocking(boolean enable) final int eventualWifiState = enable ? WIFI_STATE_ENABLED :WIFI_STATE_DISABLED; updateWifiState(enable ? WIFI_STATE_ENABLING : WIFI_STATE_DISABLING); if (enable) if (!WifiNative.loadDriver() Log.e(TAG, "Failed to load Wi-Fi driver."); updateWifiState(WIFI_STATE_UNKNOWN); return false; if (!WifiNative.startSupplicant() WifiNative.unloadDriver(); Log.e(TAG, "Failed to start supplicant daemon."); updateWifiState(WIFI_STATE_UNKNOWN); return false; mWifiStateTracker.startEventLoop(); / Success! persistWifiEnabled(enable); updateWifiState(eventualWifiState); return true; 當(dāng)使能成功后,會(huì)廣播發(fā)送 WIFI_STATE_CHANGED_ACTION 這個(gè) Intent 通知外界 WIFI已 經(jīng) 成 功 使 能 了 。 WifiEnabler 創(chuàng) 建 的 時(shí) 候 就 會(huì) 向 Android 注 冊(cè) 接 收WIFI_STATE_CHANGED_ACTION,因此它會(huì)收到該 Intent,從而開始掃描。 private void handleWifiStateChanged(int wifiState) if (wifiState = WIFI_STATE_ENABLED) loadConfiguredAccessPoints(); attemptScan(); 2. 查找 AP掃描的入口函數(shù)是 WifiService 的 startScan,它其實(shí)也就是往 wpa_supplicant 發(fā)送 SCAN 命令。static jboolean android_net_wifi_scanCommand(JNIEnv* env, jobject clazz) jboolean result; / Ignore any error from setting the scan mode. / The scan will still work. (void)doBooleanCommand("DRIVER SCAN-ACTIVE", "OK"); result = doBooleanCommand("SCAN", "OK"); (void)doBooleanCommand("DRIVER SCAN-PASSIVE", "OK"); return result;當(dāng) wpa_supplicant 處理完 SCAN 命令后,它會(huì)向控制通道發(fā)送事件通知掃描完成,從而wifi_wait_for_event 函數(shù)會(huì)接收到該事件,由此 WifiMonitor 中的 MonitorThread 會(huì)被執(zhí)行來出來這個(gè)事件, void handleEvent(int event, String remainder) case SCAN_RESULTS: mWifiStateTracker.notifyScanResultsAvailable(); break;WifiStateTracker 則接著廣播發(fā)送 SCAN_RESULTS_AVAILABLE_ACTION 這個(gè) Intent case EVENT_SCAN_RESULTS_AVAILABLE: mContext.sendBroadcast(newIntent(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);WifiLayer 注冊(cè)了接收 SCAN_RESULTS_AVAILABLE_ACTION 這個(gè) Intent,所以它的相關(guān)處理函數(shù) handleScanResultsAvailable 會(huì)被調(diào)用,在該函數(shù)中,先會(huì)去拿到 SCAN 的結(jié)果(最終是往 wpa_supplicant 發(fā)送 SCAN_RESULT 命令并讀取返回值來實(shí)現(xiàn)的) , List<ScanResult> list = mWifiManager.getScanResults();對(duì)每一個(gè)掃描返回的 AP,WifiLayer 會(huì)調(diào)用 WifiSettings 的 onAccessPointSetChanged 函數(shù),從而最終把該 AP 加到 GUI 顯示列表中。 public void onAccessPointSetChanged(AccessPointState ap, boolean added) AccessPointPreference pref = mAps.get(ap); if (added) if (pref = null) pref = new AccessPointPreference(this, ap); mAps.put(ap, pref); else pref.setEnabled(true); mApCategory.addPreference(pref); 3. 配置 AP 參數(shù)當(dāng)用戶在 WifiSettings 界面上選擇了一個(gè) AP 后,會(huì)顯示配置 AP 參數(shù)的一個(gè)對(duì)話框, public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preferencepreference) if (preference instanceof AccessPointPreference) AccessPointState state = (AccessPointPreference)preference).getAccessPointState(); showAccessPointDialog(state, AccessPointDialog.MODE_INFO); 4. 連接當(dāng)用戶在 AcessPointDialog 中選擇好加密方式和輸入密鑰之后,再點(diǎn)擊連接按鈕,Android就會(huì)去連接這個(gè) AP。 private void handleConnect() String password = getEnteredPassword(); if (!TextUtils.isEmpty(password) mState.setPassword(password); mWifiLayer.connectToNetwork(mState); WifiLayer 會(huì)先檢測這個(gè) AP 是不是之前被配置過,這個(gè)是通過向 wpa_supplicant 發(fā)送LIST_NETWORK 命令并且比較返回值來實(shí)現(xiàn)的, / Need WifiConfiguration for the AP WifiConfiguration config = findConfiguredNetwork(state);如果 wpa_supplicant 沒有這個(gè) AP 的配置信息, 則會(huì)向 wpa_supplicant 發(fā)送 ADD_NETWORK命令來添加該 AP, if (config = null) / Connecting for the first time, need to create it config = addConfiguration(state,ADD_CONFIGURATION_ENABLE|ADD_CONFIGURATION_SAVE); ADD_NETWORK 命 令 會(huì) 返 回 一 個(gè) ID , WifiLayer 再 用 這 個(gè) 返 回 的 ID 作 為 參 數(shù) 向wpa_supplicant 發(fā)送 ENABLE_NETWORK 命令,從而讓 wpa_supplicant 去連接該 AP。 / Make sure that network is enabled, and disable others mReenableApsOnNetworkStateChange = true; if (!mWifiManager.enableNetwork(workId, true) Log.e(TAG, "Could not enable network ID " + workId); error(R.string.error_connecting); return false; 5. 配置 IP 地址當(dāng) wpa_supplicant 成功連接上 AP 之后,它會(huì)向控制通道發(fā)送事件通知連接上 AP 了,從而wifi_wait_for_event 函數(shù)會(huì)接收到該事件,由此 WifiMonitor 中的 MonitorThread 會(huì)被執(zhí)行來出來這個(gè)事件, void handleEvent(int event, String remainder) case CONNECTED: handleNetworkStateChange(NetworkInfo.DetailedState.CONNECTED,remainder); break;WifiMonitor 再調(diào)用 WifiStateTracker 的 notifyStateChange,WifiStateTracker 則接著會(huì)往自身發(fā)送 EVENT_DHCP_START 消息來啟動(dòng) DHCP 去獲取 IP 地址, private void handleConnectedState() setPollTimer(); mLastSignalLevel = -1; if (!mHaveIPAddress & !mObtainingIPAddress) mObtainingIPAddress = true; mDhcpTarget.obtainMessage(EVENT_DHCP_START).sendToTarget(); 然后再廣播發(fā)送 NETWORK_STATE_CHANGED_ACTION 這個(gè) Intent case EVENT_NETWORK_STATE_CHANGED: if (result.state != DetailedState.DISCONNECTED | !mDisconnectPending) intent = newIntent(WifiManager.NETWORK_STATE_CHANGED_ACTION); intent.putExtra(WifiManager.EXTRA_NETWORK_INFO,mNetworkInfo); if (result.BSSID != null) intent.putExtra(WifiManager.EXTRA_BSSID, result.BSSID); mContext.sendStickyBroadcast(intent); break;WifiLayer 注冊(cè)了接收 NETWORK_STATE_CHANGED_ACTION 這個(gè) Intent,所以它的相關(guān)處理函數(shù) handleNetworkStateChanged 會(huì)被調(diào)用,當(dāng) DHCP 拿到 IP 地址之后,會(huì)再發(fā)送 EVENT_DHCP_SUCCEEDED 消息, private class DhcpHandler extends Handler public void handleMessage(Message msg) switch (msg.what) case EVENT_DHCP_START: if (NetworkUtils.runDhcp(mInterfaceName, mDhcpInfo) event = EVENT_DHCP_SUCCEEDED; WifiLayer 處 理 EVENT_DHCP_SUCCEEDED 消 息 , 會(huì) 再 次 廣 播 發(fā) 送NETWORK_STATE_CHANGED_ACTION 這個(gè) Intent,這次帶上完整的 IP 地址信息。 case EVENT_DHCP_SUCCEEDED: mWifiInfo.setIpAddress(mDhcpInfo.ipAddress); setDetailedState(DetailedState.CONNECTED); intent = newIntent(WifiManager.NETWORK_STATE_CHANGED_ACTION); intent.putExtra(WifiManager.EXTRA_NETWORK_INFO, mNetworkInfo); mContext.sendStickyBroadcast(intent); break;至此為止,整個(gè)連接過程完成。問題: 目前的實(shí)現(xiàn)不支持 Ad-hoc 方式。<!-+ plugin_code qcomic begin-> <!-+ plugin_code qcomic end->

注意事項(xiàng)

本文(ANDROID移植WIFI設(shè)計(jì)原理(源碼分析))為本站會(huì)員(1666****666)主動(dòng)上傳,裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。 若此文所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng)(點(diǎn)擊聯(lián)系客服),我們立即給予刪除!

溫馨提示:如果因?yàn)榫W(wǎng)速或其他原因下載失敗請(qǐng)重新下載,重復(fù)下載不扣分。




關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!