標籤:ctrl enc 檔案 abi pid required 應用程式層 down .net
本文轉載自:52192631
本人是從事Linux嵌入式開發的,安卓wifi控制在安卓JAVA層已經做得非常成熟了,但我需要寫一個控制wifi的程式,需要寫一堆JAVA,我本是就不懂JAVA,所以決定跳過JAVA架構和應用程式層,直接從C架構層入手。
1.Android WIFI架構
WIFI的基本架構 :
1、wifi使用者空間的程式和庫:
external/wpa_supplicant/
產生庫libwpaclient.so和守護進程wpa_supplicant
2、hardware/libhardware_legary/wifi/是wifi管理庫
3、JNI部分:
frameworks/base/core/jni/android_net_wifi_Wifi.cpp
4、JAVA部分:
frameworks/base/services/java/com/android/server/
frameworks/base/wifi/java/android/net/wifi/
5、WIFI Settings應用程式位於:
packages/apps/Settings/src/com/android/settings/wifi/
6、WIFI 驅動模組 wlan.ko
wpa_supplicant通過wireless_ext 介面和驅動通訊
7、WIFI 硬體模組
2.Hardware層2.1.載入卸載驅動
載入:insmod /system/lib/modules/bcmdhd.ko iface_name=wlan0
卸載:rmmod bcmdhd
2.2.啟動wpa_supplicant
執行setprop ctl.start wpa_supplicant
說明:執行上面命令時,安卓系統會調用到/init.macallan.rc下語句:
service wpa_supplicant /system/bin/wpa_supplicant \
-iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \
-I/system/etc/wifi/wpa_supplicant_overlay.conf \
-O/data/misc/wifi/sockets \
-e/data/misc/wifi/entropy.bin [email protected]:wpa_wlan0
# we will start as root and wpa_supplicant will switch to user wifi
# after setting up the capabilities required for WEXT
# user wifi
# group wifi inet keystore
class main
socket wpa_wlan0 dgram 660 wifi wifi
disabled
oneshot
為防止wpa_supplicant已經啟動導致wifi無法正常工作,這裡之後先關閉一下wpa_supplicant再啟動。
2.3.關閉wpa_supplicant
執行setprop ctl.stop wpa_supplicant
詳細查看Wifi.c (\android\hardware\libhardware_legacy\wifi)
2.4.搜尋AP
執行wpa_cli -iwlan0 IFNAME=wlan0 scan 開始搜尋
執行wpa_cli -iwlan0 IFNAME=wlan0 scan_result 顯示搜尋結果
說明:這句命令和標準的(Linux系統)wpa_supplicant有區別,標準的是執行:
wpa_cli -iwlan0 scan 因為安卓系統的wpa_supplicant工具是剪裁過的。
搜尋結果如下:
bssid / frequency / signal level / flags / ssid
MAC地址 頻率 訊號 加密模式 AP名稱
30:fc:68:19:57:70 2462 -41 [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS] aaaa
30:fc:68:72:36:d2 2462 - 44 [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS] TP-LINK_dd
b8:20:e7:00:32:9e 2437 -46 [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS] ccc
b8:20:e7:00:0c:ce 2422 -46 [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS] dd
e0:05:c5:ac:6d:fc 2472 -49 [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS] Tee
14:cf:92:6e:1d:5e 2437 -50 [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS] Xdaf
bc:46:99:73:1d:42 2412 -80 [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS] Testdfege
00:0c:43:30:52:a8 2437 -43 [WEP][ESS] G5000_JOYKOLN
b8:20:e7:00:0a:62 2437 -65 [WEP][ESS] G5000_JOYKOLN
28:f0:76:18:c1:16 2462 -48 [ESS] iMacQIU\xe7\x9a\x84iMac
2.5.wpa_supplicant.conf設定檔
位於/data/misc/wifi/wpa_supplicant.conf
沒有啟動wifi時(wpa_supplicant沒有開啟)檔案顯示:
ctrl_interface=/data/misc/wifi/sockets
disable_scan_offload=1
update_config=1
device_name=macallan
manufacturer=NVIDIA
model_name=Macallan
model_number=Macallan
serial_number=JKD01V20030000022
device_type=10-0050F204-5
config_methods=physical_display virtual_push_button
p2p_disabled=1
開啟wifi時檔案顯示:
ctrl_interface=/data/misc/wifi/sockets
disable_scan_offload=1
update_config=1
device_name=macallan
manufacturer=NVIDIA
model_name=Macallan
model_number=Macallan
serial_number=JKD01V20030000022
device_type=10-0050F204-5
config_methods=physical_display virtual_push_button
p2p_disabled=1
network={
ssid="JET-1"
psk="abcd1234"
key_mgmt=WPA-PSK
priority=1
}
2.6.重啟wpa_supplicant
執行wpa_cli -iwlan0 IFNAME=wlan0 reconfigure
說明:當初始化啟動wpa_supplicant時,因還沒有串連AP資訊,必須通過scan_result命令擷取到當前搜尋的AP,並自定AP寫入設定檔中,再執行reconfigure命令重啟wpa_supplicant。
2.7.啟動DHCP和啟動關閉網路
在啟動wpa_supplicant之前需要啟動一下網路
執行netcfg wlan0 up
啟動DHCP,當已經串連到AP時,這裡需要設定一下IP,一般情況下是使用動態IP的
執行netcfg wlan0 dhcp
關閉wpa_supplicant後這裡需要同時關閉網卡網路
執行netcfg wlan0 down
這樣一個流程就完成了。當然這裡還需要編寫一個小程式,以搜尋所有的AP資訊,並把需要串連的AP資訊,並寫入設定檔。
這種方法是繞過安卓JAVA架構層和JAVA應用程式層,直接和C架構層通訊的控制WIFI功能例子,這樣可以完全讓使用者可以自己控制wifi功能,與有線網卡運用自動切換功能。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。 52192631
Android環境下通過C架構層控制WIFI【轉】