Android环境下通过C框架层控制WIFI【转】
本文轉載自:https://blog.csdn.net/edw200/article/details/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 -g@android: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功能,與有線網卡運用自動切換功能。
版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/edw200/article/details/52192631 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Android环境下通过C框架层控制WIFI【转】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 降低网站跳出率的六个方法(亲身使用)
- 下一篇: MySQL主从布署