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功能,与有线网卡运用自动切换功能。
Android环境下通过C框架层控制WIFI【转】的更多相关文章
- Maven环境下搭建SSH框架
© 版权声明:本文为博主原创文章,转载请注明出处 1.搭建环境 Maven:3.3.9 Struts2:2.5.10 Spring:4.3.8.RELEASE Hibernate:5.1.7.Fina ...
- Maven环境下搭建SSH框架之Spring整合Hibernate
© 版权声明:本文为博主原创文章,转载请注明出处 1.搭建环境 Spring:4.3.8.RELEASE Hibernate:5.1.7.Final MySQL:5.7.17 注意:其他版本在某些特性 ...
- cocos2d-x 在android环境下开发遇到的一些bug
今天在弄一个关于android环境下解析xml的东东,遇到了2个比较麻烦问题 1.android的apk下文件是压缩文件,io.open模式无法读取到数据的, 解决思路就是: CCFileUtils: ...
- Android 环境下编译FFmpeg
Android 环境下编译FFmpeg 开发环境:Ubuntu 12.04.2 LTS , android-sdk-linux, android-ndk-r8e 一 .X264 编译 1. X2 ...
- windows环境下安装yaf框架
windows环境下安装yaf框架 在windows下安装yaf框架 准备工作: php环境(过程略,wamp,xampp,phpstudy都行,php版本大于5.3) git工具(需要从github ...
- android环境下两种md5加密方式
在平时开发过程中,MD5加密是一个比较常用的算法,最常见的使用场景就是在帐号注册时,用户输入的密码经md5加密后,传输至服务器保存起来.虽然md5加密经常用,但是md5的加密原理我还真说不上来,对md ...
- 在高通平台Android环境下编译内核模块【转】
本文转载自:http://blog.xeonxu.info/blog/2012/12/04/zai-gao-tong-ping-tai-androidhuan-jing-xia-bian-yi-nei ...
- 032 Android智能下拉刷新框架-SmartRefreshLayout+RecyclerView的使用
1.SmartRefreshLayout介绍 SmartRefreshLayout的目标是打造一个强大,稳定,成熟的下拉刷新框架,并集成各种的炫酷.多样.实用.美观的Header和Footer. 正如 ...
- windows环境下安装scrapy框架报错问题--最快捷有效的解决方案
windows在执行如下命令,安装scrapy的过程中会报错: pip install scrapy 报错分析: windows环境下,会出现如下错误: 1.提示的错误是编译环境的问题,字面意思看需要 ...
随机推荐
- testNG配置dataSource多数据源
spring的XML配置好之后,运行testNG还会出问题. 搞定代码如下: /** * 基于Spring的服务层测试超类 * * @author chief */ @ContextConfigura ...
- 【FUN】——英文版面青年教育网站策划&GUI设计
写在前面:这个教育网页一共分为四个页面,首页.课程.活动.空间.是我在学习网页设计与策划的时候作为知识应用练习做的,主要使用Photoshop软件设计构图,其中图片素材与部分灵感来源于网络. 一.网站 ...
- Solidworks如何绘制螺纹
1 随便画一个圆柱 2 在原来的地方画一个一摸一样的圆(草图2) 3 在特征选项卡中点击曲线-螺旋线/涡状线 4 设置螺距和圈数,画螺旋线 5 建立一个基准面,第一参考是点,第二参考是 ...
- jquery相冊图片来回选择
<!DOCTYPE HTML> <html> <head> <meta charset="UTF-8"> <script sr ...
- 重读金典------高质量C编程指南(林锐)-------第六章 函数设计
函数设计最重要的无外乎两个方面,一个是函数的接口设计一个是内部实现的一些规则. 在C语言中,函数的参数和返回值的传递方式分为两种: 值传递与指针传递.而C++中,多了一个引用传递. 引用传递有些像指针 ...
- cocos2dx中使用iconv转码(win32,iOS,Android)
首先贴下环境:Win7 64, NDK r8e, libiconv-1.14, cygwin 一 Win32环境配置 Cocos2D-X自带有win32上的iconv库.仅仅须要配置一下就可以使用. ...
- Android中读取图片EXIF元数据之metadata-extractor的使用
一.引言及介绍 近期在开发中用到了metadata-extractor-xxx.jar 和 xmpcore-xxx.jar这个玩意, 索性查阅大量文章了解学习,来分享分享. 本身工作也是常常和处理大图 ...
- 黑帽SEO手法
黑帽SEO手法 0x00:概念 SEO全称搜索引擎优化,通过站内优化和站内优化方式来提升搜索引擎排名,有白帽SEO和黑帽SEO. 因为正规的SEO优化需要很长时间,黑帽SEO手法让站内快速提升排名的有 ...
- HTML5 2D平台游戏开发#1
在Web领域通常会用到一组sprite来展示动画,这类动画从开始到结束往往不会有用户参与,即用户很少会用控制器(例如鼠标.键盘.手柄.操作杆等输入设备)进行操作.但在游戏领域,sprite动画与控制器 ...
- 【C/C++】高亮C++中函数的重写——函数名相同?参数列表相同?返回值相同?
C++的重载给人留下了非常深刻的影响,原因是重载的条件很值得注意:函数名相同,参数列表不相同的两个函数构成重载函数,而无关乎二者的返回值. 但是C++中的函数重写又是另一码事.标准规定:只要函数名相同 ...