前几天因为解决一堆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

#}

不同类型的网络,不同的参数等等,应有尽有。

随机推荐

  1. c# 清空txt文本文件的值

    FileStream fs1 = null; try { fs1 = new FileStream(@"C:\db.txt", FileMode.Truncate, FileAcc ...

  2. Java基础类库

    1 main方法      运行java程序的参数:   下面详细讲解main 方法为什么采用这个方法签名 1.public 修饰符:Java类由jvm调用,为了让jvm可以自由调用这个main()方 ...

  3. HTTP协议请求方式: 中GET、POST和HEAD的介绍以及错误提示码

    HTTP协议中GET.POST和HEAD的介绍 2008-05-10 14:15 GET: 请求指定的页面信息,并返回实体主体. HEAD: 只请求页面的首部. POST: 请求服务器接受所指定的文档 ...

  4. 【IHttpHandler】HttpModule的认识

    HttpModule是向实现类提供模块初始化和处置事件.当一个HTTP请求到达HttpModule时,整个ASP.NET Framework系统还并没有对这个HTTP请求做任何处理,也就是说此时对于H ...

  5. MS SqlSever一千万条以上记录分页数据库优化经验总结【索引优化 + 代码优化】[转]

    对普通开发人员来说经常能接触到上千万条数据优化的机会也不是很多,这里还是要感谢公司提供了这样的一个环境,而且公司让我来做优化工作.当数据库中的记录不超过10万条时,很难分辨出开发人员的水平有多高,当数 ...

  6. boost: tcp client sample

    #include <boost/asio.hpp> #include <iostream> using namespace std; using namespace boost ...

  7. Vim中的正则表达式[转]

    来自:http://blog.csdn.net/endall/archive/2007/08/29/1764554.aspx Vim中的正则表达式功能很强大,如果能自由运用,则可以完成很多难以想象的操 ...

  8. 如何使用CSS3画出一个叮当猫

    刚学习了这个案例,然后觉得比较好玩,就练习了一下.然后发现其实也不难,如果你经常使用PS或者Flash的话,应该就会知道画个叮当猫是很容易 的事,至少我是这么觉得.但是,用CSS3画出来确实是第一次接 ...

  9. Hive中的排序语法

    ORDER BY hive中的ORDER BY语句和关系数据库中的sql语法相似.他会对查询结果做全局排序,这意味着所有的数据会传送到一个Reduce任务上,这样会导致在大数量的情况下,花费大量时间. ...

  10. PHP-PCRE正则表达式函数

    PCRE正则表达式函数 PCRE字符类 \\b        词边界 \\d        匹配任意数字 \\s        匹配任意空白,如TAB制表符或空格 \\t        匹配一个TAB ...