Android WIFI 启动流程(TIP^^)
前几天因为解决一堆Bug,没时间写。我不会每天都写,就是为了存档一些资料。
内容来源:工作中接触到的+高手博客+文档(Books)=自己理解
仅限参考^^
此博客是上一个<<Android WIFI 启动流程>>的附加项。
参考博客:http://blog.csdn.net/eoeandroida/article/details/40583353
配置AP:
当用户在WifiSettings界面上选择了一个AP后,会显示配置AP参数的一个对话框。
showAccessPointDialog(state, AccessPointDialog.MODE_INFO);(通过使用WifiDialog.java类对话框)
连接AP:
当用户在AccessPointDialog(WifiDialog.java类对话框)中选择好加密方式和输入密钥之后,再点击连接按钮,Android就会去连接这个AP。
1 WifiLayer会先检测这个AP是不是之前被配置过,这个是通过向wpa_supplicant发送LIST_NETWORK(在WifiNative类中使用)命令并且比较返回值来实现的,
//Need WifiConfiguration for the AP
WifiConfiguration config = findConfiguredNetwork(state);
如果wpa_supplicant没有这个AP的配置信息,则会向wpa_supplicant发送ADD_NETWORK命令来添加该AP
2 ADD_NETWORK命令会返回一个ID,WifiLayer再用这个返回的ID作为参数向wpa_supplicant发送ENABLE_NETWORK命令,从而让wpa_supplicant去连接该AP。
配置IP地址:
1 当wpa_supplicant成功连接上AP之后,它会向控制通道发送事件,通知连接上AP了,从而wifi_wait_for_event函数会接收到该事件,由此WifiMonitor中的MonitorThread会被执行来处理这个事件。
2 WifiMonitor再调用WifiStateTracker的notifyStateChange,WifiStateTracker则接着会往自身发送EVENT_DHCP_START消息来启动DHCP去获取IP地址。
3 然后再广播发送NETWORK_STATE_CHANGED_ACTION这个Intent。
4 WifiLayer注册了接收NETWORK_STATE_CHANGED_ACTION这个Intent,所以它的相关处理函数handleNetworkStateChanged会被调用,当DHCP拿到IP地址之后,会再发送EVENT_DHCP_SUCCEEDED消息。
5 WifiLayer处理EVENT_DHCP_SUCCEEDED消息,会再次广播发送。
至此为止,整个连接过程完成。(找不到WifiLayer类以及EVENT_DHCP_SUCCEEDED消息,但基本思路是这样)
*wpa_supplicant:

对应上述结构,基于Android的手机中的WiFi控制分为三大组件:
1 客户端程序,包括wpa_cli命令行或java图形界面程序,通过socket与wpa_supplicant daemon服务通信,发送命令并接收结果。
2 wpa_supplicant daemon服务,对应上述中间部分,功能是“上传下达”。所有客户端通过它控制硬件网卡,通过发送字符串命令控制是否扫描AP,提取扫描结果和是否关联AP等操作,同时将驱动的执行状态发送给用户。
该服务是设计支持多种无线网卡芯片,因此各个厂商共同提供了一个通用接口给wpa_supplicant调用。
3 网卡驱动。
在手机内存的/etc/wpa_supplicant.conf中,我们可以直接看到WIFI支持的网络类型,每种类型都有例子,比如:
#Both WPA-PSK and WPA-EAP is accepted. Only CCMP is accepted as pairwise and
# group cipher.
#network={
# ssid="example"
# bssid=00:11:22:33:44:55
# proto=WPA RSN
# key_mgmt=WPA-PSK WPA-EAP
# pairwise=CCMP
# group=CCMP
# psk=06b4be19da289f475aa46a33cb793029d4ab3db7a23ee92382eb0106c72ac7bb
#}
不同类型的网络,不同的参数等等,应有尽有。
随机推荐
- Flex 4 不同主题下容器子元素的管理方法
Flex 下,容器主要分两类:Spark容器, Halo容器. Spark容器 Halo容器 说明 numElements numChildern 容器的子元素数量. addElement( ) ad ...
- robotframework+ride+Selenium2Library+AutoItLibrary配置
最近要安装RFS,虽然网上很多安装说明,但是自己装的时候还是遇到了很多问题. 1. AutoLibrary导入失败:猜测原因是AutoLibrary需要先安装pywin32,而我一开始安装的是pyth ...
- 可视化日志分析工具Gltail的安装与使用
可视化日志分析工具Gltail的安装与使用 GlTail.rb 是一款带有浓郁的 Geek 风格的可视化日志分析工具,它采用 Ruby 技术构建,并利用 OpenGL 图形技术进行渲染,呈现 ...
- 【HTML/XML 11】XML和HTML的混合使用
导读:在前面介绍了很多关于XML和HTML的东西,他们其实各有各的好处,在很多时候都需要结合起来使用.现在已经有XML和HTML结合的产物:XHTML(可扩展超文本标记语言).在本篇博客中,则主要介绍 ...
- AX 条码打印
AX 条码打印集成在BarCode类及其之类barcode*. 由子类的defaultFont方法指定字体属性. eg, BarcodeCode39 指定条码字体"BC C39 3 to 1 ...
- Find out who the “mole” is?
Blueheat Company’s production server was out of order again. The CEO was very upset and want their ...
- hdu1203
#include <stdio.h> #include <math.h> #define mmin(x,y) (x)<(y)?(x):(y) int main(){ +] ...
- Python之路【第二篇】:Python基础(一)
一.作用域 对于变量的作用域,执行声明并在内存中存在,该变量就可以在下面的代码中使用. 1 2 3 if 1==1: name = 'wupeiqi' print name 下面的结论对吗? ...
- javaSE第十九天
第十九天 227 1:异常(理解) 227 (1) 定义 227 a)异常的引入 227 (2)异常的体系 228 (3)异常的处理: 229 A:JVM的默认处理 ...
- wpf依赖属性、绑定实现原理、附加属性学习
依赖属性和普通属性相比节省内存的原因:对于普通属性,每个对象有需要存储一个普通属性的值,即便是默认值.而依赖属性的默认值是静态的存储在类中的,所有对象都使用同一默认值,所以对于拥有大量属性的控件来说这 ...