本文转载自: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

Android环境下通过C框架层控制WIFI【转】的更多相关文章

  1. Maven环境下搭建SSH框架

    © 版权声明:本文为博主原创文章,转载请注明出处 1.搭建环境 Maven:3.3.9 Struts2:2.5.10 Spring:4.3.8.RELEASE Hibernate:5.1.7.Fina ...

  2. Maven环境下搭建SSH框架之Spring整合Hibernate

    © 版权声明:本文为博主原创文章,转载请注明出处 1.搭建环境 Spring:4.3.8.RELEASE Hibernate:5.1.7.Final MySQL:5.7.17 注意:其他版本在某些特性 ...

  3. cocos2d-x 在android环境下开发遇到的一些bug

    今天在弄一个关于android环境下解析xml的东东,遇到了2个比较麻烦问题 1.android的apk下文件是压缩文件,io.open模式无法读取到数据的, 解决思路就是: CCFileUtils: ...

  4. Android 环境下编译FFmpeg

    Android 环境下编译FFmpeg 开发环境:Ubuntu 12.04.2 LTS , android-sdk-linux, android-ndk-r8e 一 .X264 编译 1.    X2 ...

  5. windows环境下安装yaf框架

    windows环境下安装yaf框架 在windows下安装yaf框架 准备工作: php环境(过程略,wamp,xampp,phpstudy都行,php版本大于5.3) git工具(需要从github ...

  6. android环境下两种md5加密方式

    在平时开发过程中,MD5加密是一个比较常用的算法,最常见的使用场景就是在帐号注册时,用户输入的密码经md5加密后,传输至服务器保存起来.虽然md5加密经常用,但是md5的加密原理我还真说不上来,对md ...

  7. 在高通平台Android环境下编译内核模块【转】

    本文转载自:http://blog.xeonxu.info/blog/2012/12/04/zai-gao-tong-ping-tai-androidhuan-jing-xia-bian-yi-nei ...

  8. 032 Android智能下拉刷新框架-SmartRefreshLayout+RecyclerView的使用

    1.SmartRefreshLayout介绍 SmartRefreshLayout的目标是打造一个强大,稳定,成熟的下拉刷新框架,并集成各种的炫酷.多样.实用.美观的Header和Footer. 正如 ...

  9. windows环境下安装scrapy框架报错问题--最快捷有效的解决方案

    windows在执行如下命令,安装scrapy的过程中会报错: pip install scrapy 报错分析: windows环境下,会出现如下错误: 1.提示的错误是编译环境的问题,字面意思看需要 ...

随机推荐

  1. overlay和overlay2的区别

    docker作为一个容器平台,它有一套自己的存储系统.它支持的driver有overlay,overlay2, aufs等等. 这篇文章主要分析overlay和overlay2的区别. overlay ...

  2. Windows下ELK-5.4.3环境搭建

    Windows下ELK-5.4.3环境搭建 一.概述 ELK官网 https://www.elastic.co ELK由Elasticsearch.Logstash和Kibana三部分组件组成: El ...

  3. 转: 三大WEB服务器对比分析(apache ,lighttpd,nginx) (2008年的旧文,仅供参考之用)

    from:  http://www.blogjava.net/daniel-tu/archive/2008/12/29/248883.html 三大WEB服务器对比分析(apache ,lighttp ...

  4. maven setting.xml 配置(有效)

    <?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://mav ...

  5. Java实现链表结构的具体代码

    一.数据准备 1. 定义节点 2.   定义链表 1.数据部分 2.节点部分 class DATA //数据节点类型 { String key; String name; int age; } cla ...

  6. pymongo的基本使用

    #!/usr/bin/env python # -*- coding:utf-8 -*- """ MongoDB存储 在这里我们来看一下Python3下MongoDB的存 ...

  7. 重读金典------高质量C编程指南(林锐)-------第二章 程序的板式

    2.1 空行 规则1:在每个类声明之后,每个函数定义结束之后加空行. 规则2:在某个函数体内,相关的不加空行,不相关的加空行. // 空行 void Function1(-) { - } // 空行 ...

  8. C#中的Dictionary字典类常用方法介绍

    using System.Collections.Generic;//引用命名空间//Dictionary可以理解为散列集合 public class DictionaryTest { public ...

  9. sql数据库log自动增长被取消

    原因分析:数据库可分配空间为0 解决方法:增加数据库初始大小

  10. JAVA实现KNN分类

    转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/51064307 http://www.llwjy.com/blogdetail/f ...