標籤:
前幾天因為解決一堆Bug,沒時間寫。我不會每天都寫,就是為了存檔一些資料。
內容來源:工作中接觸到的+高手部落格+文檔(Books)=自己理解
僅限參考^^
此部落格是上一個<<Android WIFI 啟動流程>>的附加項。
參考部落格:http://blog.csdn.net/eoeandroida/article/details/40583353
配置AP:
當使用者在WifiSettings介面上選擇了一個AP後,會顯示配置AP參數的一個對話方塊。
showAccessPointDialog(state, AccessPointDialog.MODE_INFO);(通過使用WifiDialog.java類對話方塊)
串連AP:
當使用者在AccessPointDialog(WifiDialog.java類對話方塊)中選擇好加密方式和輸入密鑰之後,再點擊連線按鍵,Android就會去串連這個AP。
1 WifiLayer會先檢測這個AP是不是之前被配置過,這個是通過向wpa_supplicant發送LIST_NETWORK(在WifiNative類中使用)命令並且比較傳回值來實現的,
//Need WifiConfiguration for the AP
WifiConfiguration config = findConfiguredNetwork(state);
如果wpa_supplicant沒有這個AP的配置資訊,則會向wpa_supplicant發送ADD_NETWORK命令來添加該AP
2 ADD_NETWORK命令會返回一個ID,WifiLayer再用這個返回的ID作為參數向wpa_supplicant發送ENABLE_NETWORK命令,從而讓wpa_supplicant去串連該AP。
配置IP地址:
1 當wpa_supplicant成功串連上AP之後,它會向控制通道發送事件,通知串連上AP了,從而wifi_wait_for_event函數會接收到該事件,由此WifiMonitor中的MonitorThread會被執行來處理這個事件。
2 WifiMonitor再調用WifiStateTracker的notifyStateChange,WifiStateTracker則接著會往自身發送EVENT_DHCP_START訊息來啟動DHCP去擷取IP地址。
3 然後再廣播發送NETWORK_STATE_CHANGED_ACTION這個Intent。
4 WifiLayer註冊了接收NETWORK_STATE_CHANGED_ACTION這個Intent,所以它的相關處理函數handleNetworkStateChanged會被調用,當DHCP拿到IP地址之後,會再發送EVENT_DHCP_SUCCEEDED訊息。
5 WifiLayer處理EVENT_DHCP_SUCCEEDED訊息,會再次廣播發送。
至此為止,整個串連過程完成。(找不到WifiLayer類以及EVENT_DHCP_SUCCEEDED訊息,但基本思路是這樣)
*wpa_supplicant:
對應上述結構,基於Android的手機中的WiFi控制分為三大組件:
1 用戶端程式,包括wpa_cli命令列或java圖形介面程式,通過socket與wpa_supplicant daemon服務通訊,發送命令並接收結果。
2 wpa_supplicant daemon服務,對應上述中間部分,功能是“上傳下達”。所有用戶端通過它控制硬體網卡,通過發送字串命令控制是否掃描AP,提取掃描結果和是否關聯AP等操作,同時將驅動的執行狀態發送給使用者。
該服務是設計支援多種無線網卡晶片,因此各個廠商共同提供了一個通用介面給wpa_supplicant調用。
3 網卡驅動。
在手機記憶體的/etc/wpa_supplicant.conf中,我們可以直接看到WIFI支援的網路類型,每種類型都有例子,比如:
#Both WPA-PSK and WPA-EAP is accepted. Only CCMP is accepted as pairwise and
# group cipher.
#network={
# ssid="example"
# bssid=00:11:22:33:44:55
# proto=WPA RSN
# key_mgmt=WPA-PSK WPA-EAP
# pairwise=CCMP
# group=CCMP
# psk=06b4be19da289f475aa46a33cb793029d4ab3db7a23ee92382eb0106c72ac7bb
#}
不同類型的網路,不同的參數等等,應有盡有。
Android WIFI 啟動流程(TIP^^)