Android环境下通过C框架层控制WIFI

一年好景君须记,最是橙黄橘绿时。这篇文章主要讲述Android环境下通过C框架层控制WIFI相关的知识,希望能为你提供帮助。
本文转载自:https://blog.csdn.net/edw200/article/details/52192631
本人是从事Linux嵌入式开发的,安卓wifi控制在安卓java层已经做得非常成熟了,但我需要写一个控制wifi的程序,需要写一堆JAVA,我本是就不懂JAVA,所以决定跳过JAVA框架和应用层,直接从C框架层入手。
 
1.android WIFI框架

Android环境下通过C框架层控制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
【Android环境下通过C框架层控制WIFI】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

    推荐阅读