Wifi 網卡狀態 1. WIFI_STATE_DISABLED: WIFI網卡不可用 2. WIFI_STATE_DISABLING: WIFI正在關閉 3. WIFI_STATE_ENABLED:WIFI網卡可用 4. WIFI_STATE_ENABLING:WIFI網卡正在開啟 5. WIFI_STATE_UNKNOWN:未知網卡狀態 WIFI 訪問網路需要的許可權 <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"> </uses-permission>修改網路狀態的許可權 <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"> </uses-permission>修改WIFI狀態的許可權 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"> </uses-permission>訪問網路許可權 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"> </uses-permission>訪問WIFI許可權 WIFI 核心模組 n WifiService 由SystemServer啟動的時候產生的ConnecttivityService建立,負責啟動關閉wpa_supplicant,啟動和關閉WifiMonitor線程,把命令下發給wpa_supplicant以及跟新WIFI的狀態 n WifiMonitor 負責從wpa_supplicant接收事件通知 n Wpa_supplicant 1、讀取設定檔 2、初始化配置參數,驅動函數 3、讓驅動scan當前所有的bssid 4、檢查掃描的參數是否和使用者佈建的想否 5、如果相符,通知驅動進行許可權 認證操作 6、連上AP n Wifi驅動模組 廠商提供的source,主要進行load firmware和kernel的wireless進行通訊 n Wifi電源管理模組 主要控制硬體的GPIO和上下電,讓CPU和Wifi模組之間通過sdio介面通訊 Wifi工作步驟 n Wifi模組初期化 n Wifi啟動 n 尋找熱點(AP) n 配置AP n 配置AP參數 n Wifi串連 n IP地址配置 Wifi模組代碼總結 n Wifi Application代碼 packages/apps/Settings/src/com/android/settings/wifi n Wifi Framework frameworks/base/wifi/java/android/net/wifi frameworks/base/services/java/com/android/server n Wifi JNI frameworks/base/core/jni/android_net_wifi_Wifi.cpp n Wifi Hardware hardware/libhardware_legacy/wifi/wifi.c n Wifi tool external/wpa_supplicant n Wifi kernel net/wireless drivers/wlan_sd8688 arch/arm/mach-pxa/wlan_pm.c Wifi模組的初始化: 在 SystemServer 啟動的時候,會產生一個ConnectivityService 的執行個體, ConnectivityService 的建構函式會建立WifiService,WifiStateTracker 會建立WifiMonitor 接收來自底層的事件,WifiService 和WifiMonitor 是整個模組的核心。WifiService 負責啟動關閉wpa_supplicant、啟動關閉WifiMonitor 監視線程和把命令下發給wpa_supplicant,而WifiMonitor 則負責從wpa_supplicant 接收事件通知。 Wifi模組的啟動: WirelessSettings 在初始化的時候配置了由WifiEnabler 來處理Wifi 按鈕, 當使用者按下Wifi 按鈕後,Android 會調用WifiEnabler 的onPreferenceChange,再由WifiEnabler調用WifiManager 的setWifiEnabled 介面函數,通過AIDL,實際調用的是WifiService 的setWifiEnabled 函數,WifiService 接著向自身發送一條MESSAGE_ENABLE_WIFI 訊息,在處理該訊息的代碼中做真正的使能工作:首先裝載WIFI 核心模組(該模組的位置寫入程式碼為"/system/lib/modules/wlan.ko" ), 然後啟動wpa_supplicant ( 設定檔寫入程式碼為"/data/misc/wifi/wpa_supplicant.conf"),再通過WifiStateTracker 來啟動WifiMonitor 中的監視線程。 尋找熱點(AP): (Wifi開啟)中講到Wifi模組開啟後會對外發送WIFI_STATE_CHANGED_ACTION。WifiLayer中註冊了Action的Receiver。當WifiLayer收到此Action後開始scan的流程,具體如下 當wpa_supplicant 處理完SCAN 命令後,它會向控制通道發送事件通知掃描完成,從wifi_wait_for_event 函數會接收到該事件,由此WifiMonitor 中的MonitorThread 會被執行來出來這個事件: 配置 AP 參數: 當使用者在 WifiSettings 介面上選擇了一個AP 後,會顯示配置AP 參數的一個對話方塊: Wifi串連: IP地址的配置: