android平台的WIFI模块.docx
- 文档编号:5063185
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:8
- 大小:19.93KB
android平台的WIFI模块.docx
《android平台的WIFI模块.docx》由会员分享,可在线阅读,更多相关《android平台的WIFI模块.docx(8页珍藏版)》请在冰豆网上搜索。
android平台的WIFI模块
WIFI模块
申屠家振
修改
1.2011年1月19日
2.2011年1月27日
对android平台的WIFI模块进行已经有段时间了,现在做一总结,以便以后查阅与修正。
心得之作,如有异议,请斧正。
什么是WIFI
WIFI是一种无线连接技术,可用于PC,PDA,手机等终端。
WIFI的目的是改善基于IEEE802.11标准的无线网络产品之间的互通性,也就是说WIFI是基于802.11标准的,但WIFI不等同无线网络。
android平台下的WIFI模块
简单介绍一下,WIFI模块的基本功能:
开关WIFI
除了在WIFI设置界面可以开关WIFI,还有其他的入口可以开关,要查看这些开关状态是否一致。
还有就是飞行模式对WIFI开关的影响,由于WIFI开和关都有一个时间过程,而飞行模式的开关瞬间完成,所以有时会出现冲突。
开关新可用网络提醒
新可用网络的定义是自WIFI模块开启后,从未发现过的,为加密的网络。
只有满足了新可用网络的定义,才会有提醒。
连接断开网络
连接断开各种不同加密类型的网络(具体类型下文有详解)
手动添加网络
需要路由器关闭SIID广播。
可手动输入SIID,网络加密类型,密码。
对于OPAL手机来说,路由器隐藏了SSID,手动添加的网络是无法连接的。
搜索网络
手动点击搜索按钮可以搜索网络,也可以等待WIFI模块自动搜索网络。
休眠设置
由于WIFI模块是用电大户,所有为了省电,android的WIFI加了一个休眠策略,可以设置永远不断开,充电时不断开和锁屏时断开。
要测试休眠设置是否有效,可以在路由器上PING手机的IP,PING通就是连接状态。
OPAL手机的休眠策略属于完全失效,现在的情况是无论选哪个都会一直保持连接,锁屏后15分钟再休眠。
设置静态IP
Android系统里对IP设置的输入限制很有问题,我一直认为这是弱智的限制。
正常IP的范围在0-255之间,android对IP输入的限制是整数0到整数255之间,也就是说0000.000200.001.001这样一个IP都能合法输入。
对WIFI模块深入了解一点点
WIFI的基本运行流程
【初始化】
1在SystemServer启动的时候,会生成一个ConnectivityService的实例
2ConnectivityService的构造函数会创建WifiService
3WifiStateTracker会创建WifiMonitor接收来自底层的事件,WifiService和WifiMonitor是整个模块的核心。
WifiService负责启动关闭wpa_supplicant、启动关闭WifiMonitor监视线程和把命令下发给wpa_supplicant,而WifiMonitor则负责从wpa_supplicant接收事件通知。
【连接AP】
1WirelessSettings在初始化的时候配置了由WifiEnabler来处理Wifi按钮
2当用户按下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中的监视线程
3当使能成功后,会广播发送WIFI_STATE_CHANGED_ACTION这个Intent通知外界WIFI已经成功使能了。
WifiEnabler创建的时候就会向Android注册接收WIFI_STATE_CHANGED_ACTION,因此它会收到该Intent,从而开始扫描
【查找AP】
1扫描的入口函数是WifiService的startScan,它其实也就是往wpa_supplicant发送SCAN命令。
2当wpa_supplicant处理完SCAN命令后,它会向控制通道发送事件通知扫描完成,从而wifi_wait_for_event函数会接收到该事件,由此WifiMonitor中的MonitorThread会被执行来出来这个事件。
3WifiStateTracker则接着广播发送SCAN_RESULTS_AVAILABLE_ACTION这个Intent。
4WifiLayer注册了接收SCAN_RESULTS_AVAILABLE_ACTION这个Intent,所以它的相关处理函数handleScanResultsAvailable会被调用,在该函数中,先会去拿到SCAN的结果(最终是往wpa_supplicant发送SCAN_RESULT命令并读取返回值来实现的),List
【配置AP参数】
当用户在WifiSettings界面上选择了一个AP后,会显示配置AP参数的一个对话框。
showAccessPointDialog(state,AccessPointDialog.MODE_INFO);
【连接】
当用户在AcessPointDialog中选择好加密方式和输入密钥之后,再点击连接按钮,Android就会去连接这个AP。
1WifiLayer会先检测这个AP是不是之前被配置过,这个是通过向wpa_supplicant发送LIST_NETWORK命令并且比较返回值来实现的,
//NeedWifiConfigurationfortheAP
WifiConfigurationconfig=findConfiguredNetwork(state);
如果wpa_supplicant没有这个AP的配置信息,则会向wpa_supplicant发送ADD_NETWORK命令来添加该AP
2ADD_NETWORK命令会返回一个ID,WifiLayer再用这个返回的ID作为参数向wpa_supplicant发送ENABLE_NETWORK命令,从而让wpa_supplicant去连接该AP。
【配置IP地址】
1当wpa_supplicant成功连接上AP之后,它会向控制通道发送事件通知连接上AP了,从而wifi_wait_for_event函数会接收到该事件,由此WifiMonitor中的MonitorThread会被执行来出来这个事件
2WifiMonitor再调用WifiStateTracker的notifyStateChange,WifiStateTracker则接着会往自身发送EVENT_DHCP_START消息来启动DHCP去获取IP地址
3然后再广播发送NETWORK_STATE_CHANGED_ACTION这个Intent
4WifiLayer注册了接收NETWORK_STATE_CHANGED_ACTION这个Intent,所以它的相关处理函数handleNetworkStateChanged会被调用,当DHCP拿到IP地址之后,会再发送EVENT_DHCP_SUCCEEDED消息
5WifiLayer处理EVENT_DHCP_SUCCEEDED消息,会再次广播发送
至此为止,整个连接过程完成
2.wpa_supplicant
Android平台使用的WiFi控制框架是基于大名鼎鼎的wpa_supplicant,它是一个安全中间件,为各种无线网卡提供统一的安全机制,如下图所示:
对应上述结构,基于Android的手机中的WiFi控制分为三大组件:
1)客户端程序,包括wpa_cli命令行或java图形界面程序,通过unix本地socket与
wpa_supplicantdaemon服务通信,发送命令并接收结果;
2)wpa_supplicantdaemon服务,对应上述中间部分,功能是“上传下达”。
所有客户端通过它控制硬件网卡,通过发送字符串命令控制是否扫描AP,提取扫描结果和是否关联AP等操作,同时将驱动的执行状态发送给用户。
该服务是设计支持多种无线网卡芯片,因此各个厂商共同提供了一个通用接口给wpa_supplicant调用;
3)网卡驱动;
在手机内存的/etc/wpa_supplicant.conf中我们可以直接看到WIFI支持的网络类型,每种类型都有例子,比如:
#BothWPA-PSKandWPA-EAPisaccepted.OnlyCCMPisacceptedaspairwiseand
#groupcipher.
#network={
#ssid="example"
#bssid=00:
11:
22:
33:
44:
55
#proto=WPARSN
#key_mgmt=WPA-PSKWPA-EAP
#pairwise=CCMP
#group=CCMP
#psk=06b4be19da289f475aa46a33cb793029d4ab3db7a23ee92382eb0106c72ac7bb
#}
不同类型的网络,不同的参数等等,应有尽有。
对WIFI模块的LOG了解多一点点
我们在上面已经知道WIFI的启动过程,在功能运行中也会输出相应的日志信息,下面就来详细了解一下。
(请注意,WIFI开启后会更改电池状态等其他状态。
关闭WIFI时,android的策略是卸载驱动来省电。
如有缺失就是问题。
不过下文删去了与WIFI无关的LOG!
)
1.开启WIFI&自动搜索
E/WifiHW(1201):
==JOHNDEBUG==:
[WIFI]LoadDriver
加载驱动
D/SettingsWifiEnabler(1321):
ReceivedwifistatechangedfromDisabledtoEnabling
接收到广播:
WIFI正在开启
D/WifiService(1201):
ACTION_BATTERY_CHANGEDpluggedType:
2
电池状态改变
E/WifiHW(1201):
==JOHNDEBUG==:
moduleaddress:
4b938008filename:
/system/lib/modules/dhd.koargs:
firmware_path=/system/wlan/broadcom/rtecdc.binnvram_path=/system/wlan/broadcom/nvram.txt
WIFI硬件:
加载内核模块
I/wpa_supplicant(2490):
CTRL-EVENT-STATE-CHANGEid=-1state=2
wpa_supplicant发出事件通知
V/WifiMonitor(1201):
Event[CTRL-EVENT-STATE-CHANGEid=-1state=2]
WifiMonitor从wpa_supplicant接收事件通知
I/wpa_supplicant(2490):
CTRL-EVENT-SCAN-RESULTSReady
wpa_supplicant发出事件通知:
准备好开始搜索网络了
E/wpa_supplicant(2490):
wpa_driver_priv_driver_cmdSCAN-ACTIVElen=4096
wpa_supplicant发出事件通知:
驱动命令行.主动搜索.LEN
E/wpa_supplicant(2490):
wpa_driver_priv_driver_cmdSCAN-ACTIVElen=0,11
wpa_supplicant发出事件通知:
驱动命令行.主动搜索.LEN
E/wpa_supplicant(2490):
wpa_driver_priv_driver_cmdSCAN-PASSIVElen=4096
wpa_supplicant发出事件通知:
驱动命令行.被动搜索.LEN
E/wpa_supplicant(2490):
wpa_driver_priv_driver_cmdSCAN-PASSIVElen=0,12
wpa_supplicant发出事件通知:
驱动命令行.被动搜索.LEN=0.12
D/SettingsWifiEnabler(1321):
ReceivedwifistatechangedfromEnablingtoEnabled
接收到广播:
WIFI已经开启
E/wpa_supplicant(2490):
wpa_driver_priv_driver_cmdRSSIlen=4096
wpa_supplicant发出事件通知:
E/wpa_supplicant(2490):
wpa_driver_priv_driver_cmdRSSIlen=4,4
wpa_supplicant发出事件通知:
E/wpa_supplicant(2490):
wpa_driver_priv_driver_cmdLINKSPEEDlen=4096
wpa_supplicant发出事件通知:
E/wpa_supplicant(2490):
wpa_driver_priv_driver_cmdLinkSpeed54len=12,12
wpa_supplicant发出事件通知:
E/wpa_supplicant(2490):
wpa_driver_priv_driver_cmdMACADDRlen=4096
wpa_supplicant发出事件通知:
驱动命令行.MAC地址.LEN
E/wpa_supplicant(2490):
wpa_driver_priv_driver_cmdMacaddr=44:
A4:
2D:
27:
25:
BE
wpa_supplicant发出事件通知:
驱动命令行.MAC地址
E/wpa_supplicant(2490):
len=28,28
wpa_supplicant发出事件通知:
V/WifiStateTracker(1201):
Connectiontosupplicantestablished,state=SCANNING
WIFI状态跟踪:
连接请求确认,状态=搜索
D/NetworkStateTracker(1201):
setDetailedstate,ld=IDLEandnewstate=SCANNING
网络状态跟踪:
更新显示为搜索状态
V/WifiStateTracker(1201):
Changingsupplicantstate:
SCANNING==>INACTIVE
WIFI状态跟踪:
更改请求状态:
搜索中->不活动
2.点击连接&获取状态
E/WifiHW(1201):
==JOHNDEBUG==:
[WIFI]LoadDriver
WIFI硬件:
加载驱动
D/SettingsWifiEnabler(1321):
ReceivedwifistatechangedfromDisabledtoEnabling
收到广播,WIFI状态正在开启
E/WifiHW(1201):
==JOHNDEBUG==:
moduleaddress:
4b938008filename:
/system/lib/modules/dhd.koargs:
firmware_path=/system/wlan/broadcom/rtecdc.binnvram_path=/system/wlan/broadcom/nvram.txt
WIFI硬件:
加载内核模块
E/WifiHW(1201):
==JOHNDEBUG==:
returnofinsmod:
ret=0,Unknownerror:
0
WIFI硬件:
返回装载模块报告:
返回指令0,未知错误0
……
I/wpa_supplicant(2490):
Tryingtoassociatewith1c:
bd:
b9:
f6:
a7:
9f(SSID='LosAngeles'freq=2412MHz)
wpa_supplicant发出事件通知:
尝试连接,(SSID='LosAngeles'频段=2412MHz)
V/WifiMonitor(1201):
Event[Tryingtoassociatewith1c:
bd:
b9:
f6:
a7:
9f(SSID='LosAngeles'freq=2412MHz)]
WifiMonitor接收wpa_supplicant的事件
V/WifiMonitor(1201):
Event[CTRL-EVENT-STATE-CHANGEid=-1state=3]
WifiMonitor接收事件
V/WifiStateTracker(1201):
Changingsupplicantstate:
SCANNING==>ASSOCIATING
WIFI状态跟踪:
更改请求状态:
搜索中->匹配中
D/NetworkStateTracker(1201):
setDetailedstate,ld=SCANNINGandnewstate=CONNECTING
网络状态跟踪:
更新显示为正在连接状态
D/ConnectivityService(1201):
ConnectivityChangeforWIFI:
CONNECTING/CONNECTING
连接管理服务:
改变WIFI连接状态:
正在连接/正在连接
V/WifiStateTracker(1201):
Changingsupplicantstate:
ASSOCIATING==>ASSOCIATED
WIFI状态跟踪:
更改请求状态:
匹配中->已匹配
D/NetworkStateTracker(1201):
setDetailedstate,ld=CONNECTINGandnewstate=CONNECTING
网络状态跟踪:
更新显示为正在连接状态
I/wpa_supplicant(2490):
Associatedwith1c:
bd:
b9:
f6:
a7:
9f
wpa_supplicant发出事件通知:
已和1c:
bd:
b9:
f6:
a7:
9f匹配
V/WifiMonitor(1201):
Event[Associatedwith1c:
bd:
b9:
f6:
a7:
9f]
WifiMonitor接收wpa_supplicant的事件
V/WifiStateTracker(1201):
Changingsupplicantstate:
ASSOCIATED==>FOUR_WAY_HANDSHAKE
WIFI状态跟踪:
更改请求状态:
已匹配->TCP中断连接
D/NetworkStateTracker(1201):
setDetailedstate,ld=CONNECTINGandnewstate=AUTHENTICATING
网络状态跟踪:
更新显示为鉴定中
D/ConnectivityService(1201):
DroppingConnectivityChangeforWIFI:
CONNECTING/AUTHENTICATING
连接管理服务:
抛出WIFI连接状态改变:
已连接/鉴定中
V/WifiStateTracker(1201):
Changingsupplicantstate:
FOUR_WAY_HANDSHAKE==>GROUP_HANDSHAKE
WIFI状态跟踪:
更改请求状态:
TCP中断连接->确认标志位
D/NetworkStateTracker(1201):
setDetailedstate,ld=AUTHENTICATINGandnewstate=AUTHENTICATING
网络状态跟踪:
更新显示为鉴定中
I/wpa_supplicant(2490):
WPA:
Keynegotiationcompletedwith1c:
bd:
b9:
f6:
a7:
9f[PTK=CCMPGTK=TKIP]
wpa_supplicant发出事件通知:
WPA:
与1c:
bd:
b9:
f6:
a7:
9f确定标志位
I/wpa_supplicant(2490):
CTRL-EVENT-STATE-CHANGEid=0state=7
wpa_supplicant发出事件通知:
I/wpa_supplicant(2490):
CTRL-EVENT-CONNECTED-Connectionto1c:
bd:
b9:
f6:
a7:
9fcompleted(auth)[id=0id_str=]
wpa_supplicant发出事件通知:
连接完成
V/WifiMonitor(1201):
Event[WPA:
Keynegotiationcompletedwith1c:
bd:
b9:
f6:
a7:
9f[PTK=CCMPGTK=TKIP]]
WifiMonitor接收wpa_supplicant事件
V/WifiMonitor(1201):
Event[CTRL-EVENT-STATE-CHANGEid=0state=7]
WifiMonitor接收wpa_supplicant事件
V/WifiMonitor(1201):
Event[CTRL-EVENT-CONNECTED-Connectionto1c:
bd:
b9:
f6:
a7:
9fcompleted(auth)[id=0id_str=]]
WifiMonitor接收wpa_supplicant事件
V/WifiStateTracker(1201):
Changingsupplicantstate:
GROUP_HANDSHAKE==>COMPLETED
WIFI状态跟踪:
更改请求状态:
确认标志位->完成
V/WifiStateTracker(1201):
NewnetworkstateisCONNECTED
WIFI状态跟踪:
新网络状态为已连接
D/NetworkStateTracker(1201):
setDetailedstate,ld=AUTHENTICATINGandnewstate=OBTAINING_IPADDR
网络状态跟踪:
更新显示为获取IP地址
D/ConnectivityService(1201):
DroppingConnectivityChangeforWIFI:
CONNECTING/OBTAINING_IPADDR
连接管理服务:
抛出WIFI
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- android 平台 WIFI 模块