眾所周知,Android 是基于Linux內核的,所以直接支持Linux的WLAN接口。WLAN的內核驅動是根據用戶在UI上的設定動態加載的,通過ctrl_interface和openssl來實現WLAN的控制和安全性,TCPIP則基于WLAN的標準實現。
WLAN ?在Android上的體系構架如下:
Application Framework : base/wifi/java/android/net/wifi
??????????????????????????????? WifiManager/WifiMonitor/WifiConfiguration …
Service Framework: base/services/java/com/android/server/
??????????????????????????????? WifiService / WifiWatchdogService
JNI (Java Native Interface)
??????????????????????????????? jni/android_net_wifi_Wifi.cpp
HAL (Hardware Abstract Layer)
??????????????????????????????? hardware/libhardware/wifi/wifi.c
??????????????????????????????? wpa_supplicant / ctrl_interface
Kernel driver
在Android手機上打開WIFI的流程如下:
1)Application Framework: WifiManager
??????????????????????????????? setWifiEnabled()
2)Service: WifiService
??????????????????????????????? setWifiEnabled()
??????????????????????????????? handleMessage() : MESSAGE_ENABLE_WIFI
3)JNI: android_net_wifi_Wifi.cpp :
??????????????????????????????? JNINativeMethod:? loadDriver
??????????????????????????????? android_net_wifi_loadDriver()
4)HAL : hardware/libhardware/wifi/wifi.c
??????????????????????????????? wifi_load_driver()
5)Kernel : 加載內核驅動
?
WLAN的搜索流程如下:
1)Application Framework: WifiManager
??????????????????????????????? startScan()
2)Service:
??????????????? WifiService::startScan()
??????????????? WifiNative::scanCommand();
3)JNI: android_net_wifi_Wifi.cpp :
??????????????????????????????? JNINativeMethod:? scanCommand / scanResultsCommand
??????????????????????????????? android_net_wifi_scanCommand / android_net_wifi_scanResultsCommand
4)HAL : hardware/libhardware/wifi/wifi.c
??????????????????????????????? wifi_send_command : SCAN / SCAN_RESULTS
??????????????? ??????? wpa_supplicant/driver_wext.c
??????????????????????????????? wpa_driver_wext_scan() : SIOCSIWSCAN
5)Kernel : WLAN 驅動處理相關接口的命令
WAPI是我國WLAN的國家標準----- GB 15629.11,并予以802.11i兼容,在Android上的實現只需增加相應的鑒權即可。
?
?