1wifi 简介(框架)2系统启动后的 wifi加载 过程-图解 3系统启动后的 wifi 加载过程
http://blog.csdn.net/wh_19910525/article/details/7384480
一、wifi 组建原理:
WIFI就是一种无线联网的技术,以前通过网线连接电脑,而现在则是通过无线电波来连网;常见的就是一个无线路由器,那么在这个无线路由器的电波覆盖的有效范围都可以采用WIFI连接方式进行联网,如果无线路由器连接了一条ADSL线路或者别的上网线路,则又被称为“热点”。
一般架设无线网络的基本配备就是 无线网卡 及 一个AP(无线接入点)。有了AP,就像一般有线网络的Hub一般,无线工作站可以快速且轻易地与网络相连。特别是对于宽带的使用,WiFi更显优势,有线宽带网络(ADSL、小区LAN等)到户后,连接到一个AP,然后在电脑中安装一块无线网卡即可上网。普通的家庭有一个AP已经足够,甚至用户的邻里得到授权后,则无需增加端口,也能以共享的方式上网。
二、===================android WIFI 框架 =======================
---------------------------------------------------------------------------------------------------
三、 Android平台Wifi 编译前 基本代码 路径 及 文件名(根文件系统的源码下)
1、Wifi setting 部分(Java应用层)
位于packages/apps/Settings/src/com/android/settings/wifi/
WifiSettings.java&WifiEnabler.java
2、JAVA Framework部分
位于frameworks/base/services/java/com/android/server/
WifiService.java &WifiWatchdogService.java
位于frameworks/base/wifi/java/android/net/wifi/
WifiManager.java&WifiMonitoer.java&WifiStateTracker.java &WifiNative.java
3. Wifi的JNI部分
位于 frameworks/base/core/jni/android_net_wifi_Wifi.cpp
4. Wifi的HAL层代码(wpa_supplicant适配器层)
位于 hardware/libhardware_legary/wifi/wifi.c
5. Wpa_supplicant程序的 源码部分(tools)
位于 external/wpa_supplicant_6/
external/wpa_supplicant/
生成库libwpa_client.so 和 守护进程wpa_supplicant
6.kernel (wifi 驱动*.ko)
位于 net/wireless drivers/wlan_sd8688 arch/arm/mach-pxa/wlan_pm.c
四、每一层 编译后 的所在位置
Java应用层
-- Settings, Wifi Switcher等应用
--> /system/app/
Java Framework层
-->
/system/framework/services.jar
JNI层
--> /system/framework/framework.jar
wpa_supplicant 适配器层
--> /system/lib/libhardware_legacy.so
wpa_supplicant 程序
--> /system/bin/wpa_supplicant
/system/lib/libwpa_client.so
Kernel层
-- kernel network drivers
===================== android WIFI 框架 end ====================================
Wifi 网卡状态
1. WIFI_STATE_DISABLED: WIFI网卡不可用
2. WIFI_STATE_DISABLING: WIFI正在关闭
3. WIFI_STATE_ENABLED:WIFI网卡可用
4. WIFI_STATE_ENABLING:WIFI网卡正在打开
5. WIFI_STATE_UNKNOWN:未知网卡状态
Rootfs中 关于wpa_supplicant的配置
1) /device/amlogic/f08refe1/BoardConfig.mk //wpa_supplicant版本,driver
WPA_SUPPLICANT_VERSION := VER_0_6_X
BOARD_WPA_SUPPLICANT_DRIVER := WEXT
2) root/init.rc //wpa_supplicant service
setprop wifi.interface wlan0
service wpa_supplicant /system/bin/wpa_supplicant -Dwext -iwlan0 -d -c /data/misc/wifi/wpa_supplicant.conf
socket wpa_wlan0 dgram 0666 wifi wifi
3) /system/etc/wifi/wpa_supplicant.conf//config for wpa_supplicant service
update_config=1
ctrl_interface=wlan0
eapol_version=1
ap_scan=1
fast_reauth=1
---------------------
2系统启动后的 wifi加载 过程-图解
http://blog.csdn.net/wh_19910525/article/details/7393589
Wifi模块的初始化:
系统启动 首先加载init.rc,这个文件 会加载所有service,在 SystemServer 启动的时候,会生成一个ConnectivityService 的实例,
try {
Log.i(TAG, "Starting Connectivity Service.");
ServiceManager.addService(Context.CONNECTIVITY_SERVICE, new
ConnectivityService(context));
} catch (Throwable e) {
Log.e(TAG, "Failure starting Connectivity Service", e);
}
ConnectivityService 的构造函数会创建WifiService,
if (DBG) Log.v(TAG, "Starting Wifi Service.");
mWifiStateTracker = new WifiStateTracker(context, handler);
WifiService wifiService = new WifiService(context, mWifiStateTracker);
ServiceManager.addService(Context.WIFI_SERVICE, wifiService);
WifiStateTracker 会创建WifiMonitor 接收来自底层的事件,WifiService 和WifiMonitor 是整
个模块的核心。WifiService 负责启动关闭wpa_supplicant、启动关闭WifiMonitor 监视线程
和把命令下发给wpa_supplicant,而WifiMonitor 则负责从wpa_supplicant 接收事件通知。
具体流程图如下:
一:Wifi模块的启动(使能)
WirelessSettings 在初始化的时候配置了由WifiEnabler 来处理Wifi 按钮,
private void initToggles() {
mWifiEnabler = new WifiEnabler(this,
(WifiManager) getSystemService(WIFI_SERVICE),
(CheckBoxPreference) findPreference(KEY_TOGGLE_WIFI));
当用户按下Wifi 按钮后,Android 会调用WifiEnabler 的onPreferenceChange,再由WifiEnabler
调用WifiManager 的setWifiEnabled 接口函数,通过AIDL,实际调用的是WifiService 的
setWifiEnabled 函数,WifiService 接着向自身发送一条MESSAGE_ENABLE_WIFI 消息,在
处理该消息的代码中做真正的使能工作:首先装载WIFI 内核模块(该模块的位置硬编码为
"/system/lib/modules/wlan.ko" ), 然后启动wpa_supplicant ( 配置文件硬编码为
"/data/misc/wifi/wpa_supplicant.conf"),再通过WifiStateTracker 来启动WifiMonitor 中的监视
线程。
private boolean setWifiEnabledBlocking(boolean enable) {
final int eventualWifiState = enable ? WIFI_STATE_ENABLED :WIFI_STATE_DISABLED;
updateWifiState(enable ? WIFI_STATE_ENABLING : WIFI_STATE_DISABLING);
if (enable) {
if (!WifiNative.loadDriver()) {
Log.e(TAG, "Failed to load Wi-Fi driver.");
updateWifiState(WIFI_STATE_UNKNOWN);
return false;
}
if (!WifiNative.startSupplicant()) {
WifiNative.unloadDriver();
Log.e(TAG, "Failed to start supplicant daemon.");
updateWifiState(WIFI_STATE_UNKNOWN);
return false;
}
mWifiStateTracker.startEventLoop();
}
// Success!
persistWifiEnabled(enable);
updateWifiState(eventualWifiState);
return true;
}
当使能成功后,会广播发送WIFI_STATE_CHANGED_ACTION 这个Intent 通知外界WIFI
已经成功使能了。WifiEnabler 创建的时候就会向Android 注册接收
WIFI_STATE_CHANGED_ACTION,因此它会收到该Intent,从而开始扫描。
private void handleWifiStateChanged(int wifiState) {
if (wifiState == WIFI_STATE_ENABLED) {
loadConfiguredAccessPoints();
attemptScan();
}
具体流程如下流程图所示:
二:查找热点(AP)
上一节(第三部分:Wifi开启)中讲到Wifi模块开启后会对外发送WIFI_STATE_CHANGED_ACTION。WifiLayer中注册了Action的Receiver。
当WifiLayer收到此Action后开始scan的流程,具体如下:
三:配置 AP 参数
当用户在 WifiSettings 界面上选择了一个AP 后,会显示配置AP 参数的一个对话框:
四:Wifi连接
具体流程参见以下流程图:
五:IP地址的配置
流程如图:
整个wifi启动 到 使用的流程图:
Wifi驱动模块
厂商提供的source,主要进行load firmware 和 kernel的wireless进行通信;
Wifi电源管理模块
主要控制硬件的GPIO和上下电,让CPU和Wifi模组之间通过sdio接口通信;
3系统启动后的 wifi 加载过程
http://blog.csdn.net/wh_19910525/article/details/7390189
============================ Wifi 启动代码流程 ====================
1、系统启动 首先加载init.rc,这个文件 会加载所有service,init是linux启动的 第一个 用户空间 的应用(属于linux进程,不属于Android应用)。
2、init.rc里有以下这句话:
Service wpa_supplicant /system/bin/wpa_supplicant –Dwext –iwlan0 –d –c /data/misc/wifi/wpa_supplicant.conf
3、加载linux内核模块/system/lib/modules/wlan.ko 这个wifi模块定义在/hardware/libhardware_legacy/wifi/wifi.c
4、在 SystemServer 启动的时候, 会生成一个 ConnectivityService 的实例 ,
ConnectivityService 的 构造函数 会创建WifiService,
看看是怎么启动WiFi Service的:
if (DBG) Log.v(TAG, "Starting Wifi Service.");
mWifiStateTracker = new WifiStateTracker(context, handler);
WifiService wifiService = new WifiService(context, mWifiStateTracker);
ServiceManager.addService(Context.WIFI_SERVICE, wifiService);
WifiStateTracker 会创建 WifiMonitor 接收 来自 底层 的事件, WifiService 和 WifiMonitor 是整个模块的核心 。WifiService 负责 启动关闭 wpa_supplicant、启动关闭 WifiMonitor监视线程 和把 命令下发给 wpa_supplicant, 而WifiMonitor 则负责从 wpa_supplicant 接收事件通知。它们与本地库的连接都是通过JNI方法,具体实现方法在android_net_wifi_Wifi.cpp中,在这个文件中可以大致看出APP会给wpa_supplicant下哪些命令。这些命令通过wifi.c的wifi_command发送给wpa_supplicant,在发送命令的过程中实际是调用wpa_ctrl_request来完成命令发送的,wpa_ctrl_request是通过socket的方式与wpa_supplicant进行通信的,然后通过wpa_ctrl_recv来接收来自wpa_supplicant的命令,并返回标识给wifi_wait_for_event。
--------------------------------------
流程图对应的源代码路径为:
WifiEnabler,WifiSettings对应的路径如下:
rootfs/packages/apps/Settings/src/com/android/settings/wifi/
WifiManager,WifiMonitor,WifiStateTracker,WifiNative.对应的源代码路径如下:
rootfs/frameworrks/base/wifi/java/android/net/wifi/
WifiService 对应代码的位置
rootfs/frameworks/base/services/java/com/android/server/
android_net_wifi_Wifi源代码路径如下:
rootfs/frameworks/base/core/jni/
wifi_command,wifi_wait_for_envent源代码路径如下:
/hardware/libhardware_legacy/wifi/wifi.c
wpa_ctrl_源代码路径如下:
rootfs/external/wpa_supplicant/wpa_ctrl.c
wpa_supplicant源代码路径如下:
rootfs/external/wpa_supplicant/
WIFI启动流程图:
一、使能 WIFI Wireless Settings 在初始化的时候配置了由 WifiEnabler 来处理 Wifi 按钮, 当用户按下 Wifi 按钮后, Android 会调用 WifiEnabler 的 onPreferenceChange, 再由 WifiEnabler 调用 WifiManager 的 setWifiEnabled 接口 函数,通过 AIDL,实际调用的是 WifiService 的 setWifiEnabled 函数, WifiService 接着向自身发送一条 MESSAGE_ENABLE_WIFI 消息, 在 处理该消息的代码 中做真正的使能工作: 首先装载 WIFI 内核模块(该模块的位置为 "/system/lib/modules/wlan.ko" ),然后启动 wpa_supplicant ( 配置文件 为"/data/misc/wifi/wpa_supplicant.conf") ,再通过 WifiStateTracker 来启动 WifiMonitor 中的 监视线程。
代码如下:
WifiService.java (frameworks/base/services/java/com/android/server)调用 setWifiEnabled()里面的sendEnableMessage(enable, true, Binder.getCallingUid());来发送一则消息
Message msg = Message.obtain(mWifiHandler, (enable? MESSAGE_ENABLE_WIFI : MESSAGE_DISABLE_WIFI),(persist ? 1 : 0), uid);
msg.sendToTarget();发送给自身的消息。
当enable的时候 会调用setWifiEnabledBlocking这个函数,这个函数会做setWifiEnabledState ,然后做四件事:
1. 调用JNI的WifiNative.loadDriver -->加载 Wifi驱动
2. 调用JNI的WifiNative.startSupplicant -->启动wifi_start_supplicant
3.启动 event loop.
4. 更新wifi的状态
成功启动wifi之后 setWifiEnabledBlocking 运行mWifiStateTracker.startEventLoop();事件循环,来监视事件mWifiMonitor.startMonitoring(); MonitorThread().start() 一直在线程里循环调用WifiNative.waitForEvent();
当 使能 成功后, 会广播发送 WIFI_STATE_CHANGED_ACTION 这个 Intent 通知外界 WIFI已 经 成功能了。WifiEnabler创 建 的 时 候 就 会 向 Android 注册 接收WIFI_STATE_CHANGED_ACTION, 因此它会收到该 Intent, 从而开始扫描。
二、 查找 AP
扫描的入口函数是 WifiService 的 startScan, 它其实也就是 往 wpa_supplicant 发送 SCAN 命令。
当 wpa_supplicant 处理完 SCAN 命令后, 它会向 控制通道 发送 事件 通知 扫描完成, 从而wifi_wait_for_event函数会接收到该事件, 由此 WifiMonitor 中的 MonitorThread 会被执行来 处理 这个事件。对每一个扫描返回的 AP, WifiLayer会调用 WifiSettings 的 onAccessPointSetChanged 函数, 从而最终把该 AP 加到 GUI 显示列表中。
三、配置 AP 参数
当用户在 WifiSettings 界面上选择了一个 AP 后,会显示配置 AP 参数的一个对话框,此对话框会显示当前选择的AP信号强度,若此AP设置了密码则需要用户输入密码才能登录。用户配置好之后,点击 连接按钮,onClick函数会被调用。
四、连接
当用户在 AcessPointDialog 中 选择好 加密方式 和 输入密钥 之后,再点击 连接按钮, Android就会去连接这个 AP。
WifiLayer 会先检测这个 AP 是不是之前被配置过, 这个是通过 向 wpa_supplicant 发送 LIST_NETWORK 命令 并且比较 返回值 来实现的,
// Need WifiConfiguration for the AP
WifiConfiguration config = findConfiguredNetwork(state);
如果 wpa_supplicant 没有这个 AP 的配置信息, 则会向 wpa_supplicant 发送 ADD_NETWORK 命令来添加该 AP,
if (config == null)
{
// Connecting for the first time, need to create it
config = addConfiguration(state, ADD_CONFIGURATION_ENABLE|ADD_CONFIGURATION_SAVE);
}
ADD_NETWORK 命令 会返回一个 ID , WifiLayer 再用这个返回的 ID 作为 参数 向wpa_supplicant 发送 ENABLE_NETWORK 命令,从而让 wpa_supplicant 去连接该 AP。
五、配置 IP 地址
当 wpa_supplicant 成功连接上 AP 之后, 它会向 控制通道 发送 事件通知连接上 AP 了,
wifi.c的wifi_wait_for_event函数阻塞调用,从而 wifi_wait_for_event 函数会 接收 到该事件,由此 WifiMonitor 中的 MonitorThread 会被执行来 处理 这个事件, WifiMonitor 再调用 WifiStateTracker 的 notifyStateChange, WifiStateTracker 则接着会往自身发送 EVENT_DHCP_START 消息 来 启动 DHCP 去获取 IP 地址, 然后再广播发送NETWORK_STATE_CHANGED_ACTION 这个 Intent, 最后由 WifiSettings类来响应,改变状态和界面信息。
注意:wpa_ctrl_request,通过socket方式向wpa_supplicant发送命令,以select模式阻塞在wpa_supplicant发送和接收。
1wifi 简介(框架)2系统启动后的 wifi加载 过程-图解 3系统启动后的 wifi 加载过程相关推荐
- 【Android 插件化】Hook 插件化框架 ( 合并 “插件包“ 与 “宿主“ 中的 Element[] dexElements | 设置合并后的 Element[] 数组 )
Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...
- TF之LSTM:基于tensorflow框架自定义LSTM算法实现股票历史(1990~2015数据集,6112预测后100+单变量最高)行情回归预测
TF之LSTM:基于tensorflow框架自定义LSTM算法实现股票历史(1990~2015数据集,6112预测后100+单变量最高)行情回归预测 目录 输出结果 LSTM代码 输出结果 数据集 L ...
- 苹果id退出后数据还在吗_答疑你的手机连接WiFi后,会关闭移动数据吗?
十万人测评俱乐部Q群:631042704 ZEALER极客交流Q群:414894623 最近几天,深圳的高温天气让人十分抓狂,稍微动一动就大汗淋漓.在这种烧烤天里,最舒服的事,莫过于在空调房里连着Wi ...
- 第一只WiFi蠕虫的诞生:完整解析博通WiFi芯片Broadpwn漏洞(含EXP/POC)
过去的几个月里,Android 和 iOS 数十亿台设备中都曾出现过可怕的 WiFi 远程代码执行漏洞 BroadPwn.谷歌 7 月初发布了修复补丁,而苹果则是在 7 月 19 日发布的更新.而此次 ...
- 安全测试(四) Wi-Fi安全 渗透测试 网络安全 公共场的免费Wi-Fi真的安全吗?个人信息被监控窃听风险 如: ARP攻击 SSL攻击 DNS安全 加密方式等 枚举实战应用案例 信息窃听获取
文章目录 一.前言 二.Wi-Fi 安全知识普及 2.1 Wi-Fi(Wireless Fidelity)是什么? 2.2 Wi-Fi 安全吗? 2.3 Wi-Fi 安全加密方式介绍 2.3.1 W ...
- linux系统利用wifi上网,【教程】Wii安装运行可用WIFI的Linux系统全攻略
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 差不多做好准备后,安装流程开始: 1. 用WinPM给SD卡分两个主分区,第一个主分区大小:100MB到2GB之间(要保证第二个主分区有1.5GB以上的空 ...
- 安卓修改wifi已停用_手机连不上wifi显示已保存怎么回事【原因介绍】
问:为什么手机连不上wifi显示已保存?手机在连接WiFi的时候,WiFi显示已保存,手机连接不上wifi信号.请问这是什么原因引起的,应该怎么解决这个问题. 答:如果手机连接wifi时,显示已保存, ...
- Android 通过WIFI状态监听广播,判断进入指定wifi范围
原文地址:http://blog.csdn.net/kongxiuqi/article/details/52524500 --------------------------------------- ...
- wifi软件linux版本,[转载]Wii安装运行可用WIFI的Linux系统全攻略
Wii运行Linux的优势: 低功耗,Wii玩3D游戏的平均功耗在18W,而运行linux的功耗更低,连续运行50天才耗一度电(甚至不到).如果用Wii来下电驴.如果给wii-linux装上图形界面来 ...
最新文章
- 为什么说++i的效率比i++高?
- DedeCms 5.7后台去除版权及去除广告的方法
- Perl 安装 模块Net::SSH2 有些0day是ssh2
- 解决 -- 代码没有问题时接口报错:Status Code: 404 Not Found
- android h5选择图片上传,js-微信H5选择多张图片预览并上传(兼容ios,安卓,已测试)...
- java请求响应中转_J2EE中的请求中转、重定向和包含关系
- 关于jq easyui 刷新tabs的问题
- PHP json_decode($json, TRUE) TRUE使数据格式化为Array,而非object
- pb数据窗口怎么调用视图_大数据架构如何做到流批一体?
- 华为 静态路由与FTP备份
- ACWing 893. 集合-Nim游戏​​​​​​​ (SG函数模板题)
- 封玩家IP和机器码以及解开被封的教程
- Kfc点餐系统 小程序
- 格式化报错a bad sector is being found while format this partition
- 物联网毕业设计 车牌识别系统 stm32
- 跟着Cell学作图| 11.Ingenuity Pathway Analysis(IPA)
- 招商银行校招笔试通过技巧
- 列主元消去法例题详解_列主元消去法
- 64位ubuntu使用gcc -m32报错
- 自己设计一个美观的网页版介绍界面(HBuilder)
热门文章
- 七牛云对象存储设置自己的域名访问(阿里云的域名)
- 超简单的混合开发入门 JS实现安卓Listview
- 三维飞行时间图像传感器行业调研报告 - 市场现状分析与发展前景预测
- 十进制与二进制快速转换计算心得
- Scala版本冲突--java.lang.NoSuchMethodError:scala.collection.immutable.HashSet$.empty()Lscala/collection/
- git服务器搭建使用
- Java反编译(powernode)
- 游戏运营必须知道的知识(一),入行必备!!
- java做RPG小游戏
- visio的一些使用技巧(常更)