android中wifi原理詳解轉_第1頁
android中wifi原理詳解轉_第2頁
android中wifi原理詳解轉_第3頁
android中wifi原理詳解轉_第4頁
android中wifi原理詳解轉_第5頁
已閱讀5頁,還剩11頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、二:Wifi模塊的初始化:在SystemServer啟動的時候,會生成一個 Connectivityservice 的實例,try Log.i(TAG, "Starting Connectivity Service.");ServiceManager.addService(Context.CONNECTIVITY SERVICE, new ConnectivityService(context); catch (Throwable e) Log.e(TAG, "Failure starting Connectivity Service", e);Conn

2、ectivityService的構造函數會創建 WifiService ,if (DBG) Log.v(TAG, "Starting Wifi Service.");mWifiStateTracker = new WifiStateTracker(context, handler);WifiService wifiService = new WifiService(context, mWifiStateTracker);ServiceManager.addService(Context.WIFSERVICE, wifiService);WifiStateTracker會創建

3、 WifiMonitor接收來自底層的事件,WifiService 和 WifiMonitor 是整個模塊的核心。WifiService 負責啟動關閉 wpa_supplicant、啟動關閉 WifiMonitor監視線程和把命令下發給 wpa_supplicant ,而WifiMonitor 則負責從 wpa_supplicant 接收事件通知。具體流程圖如下:SistemS 門SwerThfdConnectj5t»SRci8ConcMtrwt 巾 read3 : Connectivityservice.getlnstanceQ10 : WifiSe-vice v.ifiServi

4、ce = new WifiService 0ServiceManager.addServiceQ一-Servicef*1anager.addService(Context.V7IFI_SERVICEf ,A,lfiServize);ServtceManacer.addServiceCContext.COECnviTCSERVICE, connectivity);VfiSemice d 3訴 StatuTracker用 Mong,6StateTracke創建的AiSMonitor接收來自底層的事件fiService和*f Monitor是整 個模塊的核心工'ifSeeice負責啟的關閉火

5、PLSupplicant、啟動關閉同fiMonitor監視線程 和把命令下發給wpa.supplisnt,而J'fiMonitor則負責從內pa_suppkant接收事件通知。第三部分:Wifi模塊的啟動(使能)WirelessSettings在初始化的時候配置了由 WifiEnabler 來處理Wifi按鈕,private void initToggles() mWifiEnabler = new WifiEnabler(this,(WifiManager) getSystemService(WIFI SERVICE),(CheckBoxPreference) findPrefere

6、nce(KEY_TOGGLE_WIFI);當用戶按下 Wifi 按鈕后,Android 會調用 WifiEnabler 的 onPreferenceChange ,再由 WifiEnabler 調用 WifiManager的setWifiEnabled 接口函數,通過 AIDL,實際調用的是 WifiService 的 setWifiEnabled 函數,WifiService接著向自身發送一條 MESSAGE_ENABLE_WF息,在處理該消息的代碼中做真正的使能工作:首先裝載WIFI內核模塊(該田塊的位再硬編碼為"/system/lib/modules/wlan.ko"

7、 ),然后啟動 wpa_supplicant (配置文件硬編碼為 "/data/misc/wifi/wpa_supplicant.conf" ),再通過 WifiStateTracker 來啟動 WifiMonitor中的監視線程。一private boolean setWifiEnabledBlocking(boolean enable) final int eventualWifiState = enable ? WIFI_STATE_ENABLED :WIFI_STATE_DISABLED;updateWifiState(enable ? WIFI STATE ENA

8、BLING : WIFI STATE DISABLING); if (enable) if (!WifiNative.loadDriver() Log.e(TAG, "Failed to 10ad Wi-Fi driver.");updateWifiState(WIFI STATE UNKNOWN);return false;_if (!WifiNative.startSupplicant() WifiNative.unloadDriver();Log.e(TAG, "Failed to start supplicant daemon.");update

9、WifiState(WIFI STATE UNKNOWN); return false; _ mWifiStateTracker.startEventLoop();工/ Success!persistWifiEnabled(enable);updateWifiState(eventualWifiState);return true;工當使能成功后,會廣播發送 WIFI_STATE_CHANGED_ACTJON Intent 通知外界 WIFI 已經成功使能了。WifiEnabler 創建的時候就會向Android注冊接收WIFI_STATE_CHANGED_ACTION比它會收到該Intent

10、 ,從而開始掃描。private void handleWifiStateChanged(int wifiState) if (wifiState = WIFI_STATE_ENABLED) loadConfiguredAccessPoints(); attemptScan();具體流程如下流程圖所示:setWifiEnabledBlockingQ2: WifiNative.loacDriverQ3 : j/,ifiJoadDriverO5 : WifiNative.startSupplicantO :-ri3ndrod ret wfi 'C'ifi.CDD4: /VifiJo

11、ad.driverO6 : android net wifi startSuS-'ifiStataTracker裝載*IF:內核模塊(該模塊的位置硬編碼為、7system/libjwodules/vdan.kor )啟動我pa_suppkant (配置文件硬編碼為匕Vdata/misc/wifi/wpa.supplicant.conf )7 : *A(ifi_start_supplKantO :,8 : mV/ifiStateTracker.startEventLoopO10WfMonitorMonKorThread啟動WifiMonitor中的監視» 線程。9 f star

12、tf /entLoopOn|;ifiMomtor .startfqrrtdring Q;Momto%read.s*tqsetWifiEnabledStateO詳見掃描流程圖當開啟成功后,金廣播發送"FI_STATE_CHANGED_ACTION這個IntEt通知外界*FI、 己經成功開啟了 門ifiEnab日創建的時侯就會向Android注冊接收WIFI.STATE.CHArjGED.ACTION 因此它會收到該Stent,從而開始掃描第四部分:查找熱點(AR上一節(第三部分:Wifi開啟)中講到Wifi模塊開啟后會對外發送WIFI_STATE_CHANGED_ACTIWifiLay

13、er 中注冊了 Action 的 Receiver 。當 WifiLayer收到此 Action后開始scan的流程,函數會接收到該事件,由此具體如下:當wpa_supplicant處理完SCAN令后,它會向控制通道發送事件通知掃描完成,從 wifi_wait_for_eventWifiMonitor 中的MonitorThread 會被執行來出來這個事件:第五部分:配置 AP參數當用戶在 WifiSettings界面上選擇了一個 AP后,會顯示配置 AP參數的一個對話框:守中七%叮。廣ree口出0sbAccses=Qin CiB 'og。3 :雙值霹Po rd? Hog ci5 og

14、 = nt1/. AccessPo ntD a:ogT : _當用戶在WifiSettings界面上選擇了一個AP、 后,合顯示配置所參數的一個對話椎用戶在口氏0印口 ritD目四 中埴寫參數第六部分:Wifi連接 具體流程參見以下流程圖:i:-由L百 MET工SfiMan百口后郁出b;£7"andleConnectQ胃上名 .9餐先檢測這個麗是不是之前被配置、 過,這個是通過向,3a_SL0P Z3-t發送 LIST,". .Q如命令并且比較返回值來實現的WrfiCortfiguration config - ftdConfiguredNetv.yllcOadd

15、Configuratio'."當用尸在工二EE印口舊出月其中匕 選擇好加密方式和輸入鎏鑰 之后,再點擊連接按鈕, Anc-as就裳去連接這個;P如果 工廠8口&m沒有這個工。的配置信息,- 則會向 .supplicant 發送-DDJ;ET;ORK 命令某添加遨AP jmanaoerEnableNet'A'OfkQ7 : m'6'ifiManager,Jet/:ork 03 : mService. jer, orkJ«;9 : vl'ifiNative. enabteNitv也kCoEmfand £接下去就是

16、二;層的器見之前的潦程用,ADDJCT鐘8K命令合返同一個TD ,咖微髀町再用這個返回的2作為母敬向 以?.>? 5- DD:,:*nt饅送EH4ElJ',E*;2RK命甯 ! 從而讓,;附口口前匚打:去連接逮雨第七部分:IP地址的配置 流程如圖:力6Mon tor . Moni 15ThreadDhsHandlr'MfStaSTracker1,handl-02 | hand eNetA'OStateCnange031: rfrWifiSta:eTracker.notifyStateCh:case EWNT_NETWORK_STATE_CHANGED: )當九QLKJppkAE成功連接上AP之后, 它會向控制通道發送事件通知連接上2 了 j 從而.,f /'ait for eent 函數會 接收到該事件,由此由fMonar中的 MomtorThread會被執行來出來這個事件T/fStateTrackerSeenqsCbsedWifiStateTracker中注冊的對相關數據庫的嬤者if tchanged)則啟 動當DHCP拿到IP地址之后,金再發送EVB4TJNTERFACE_COMFIGURATION_SUCCEEDED5j c1figL'eIn:erceOTarget

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論