zoukankan      html  css  js  c++  java
  • 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 (androidhardwarelibhardware_legacywifi)

    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]   iMacQIUxe7x9ax84iMac

    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
  • 相关阅读:
    魅族--魅蓝metal
    小米2015.11.24 雷军:我所有的向往
    微软2015.10.4发布会
    创意app1
    奇怪的想法2
    奇怪想法1
    对不起,我爱你(悲剧,慎入)
    聊聊台式机1
    聊聊笔记本1--人生第一台笔记本
    聊聊路由器1
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/8992407.html
Copyright © 2011-2022 走看看