Android 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的实例

  2 ConnectivityService的构造函数会创建WifiService

  3 WifiStateTracker会创建WifiMonitor接收来自底层的事件,WifiService和WifiMonitor是整个 模块的核心。WifiService负责启动封闭wpa_supplicant、启动封闭WifiMonitor监督线程和把命令下发给wpa_supplicant,而WifiMonitor则负责从wpa_supplicant接收事件通知。

  【连接AP】

  1 WirelessSettings在初始化的时候配置了由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会被执行来出来这个事件。

  3 WifiStateTracker则接着广播发送SCAN_RESULTS_AVAILABLE_ACTION这个Intent。

  4 WifiLayer注册了接收SCAN_RESULTS_AVAILABLE_ACTION这个Intent,所以它的相关处理函数handleScanResultsAvailable会被调用,在该函数中,先会往拿到SCAN的结果(终极是去wpa_supplicant发送SCAN_RESULT命令并读取返归值来实现的),List<ScanResult> list = mWifiManager.getScanResults();对每一个扫描返归的AP,WifiLayer会调用WifiSettings的onAccessPointSetChanged函数,从而终极把该AP加到GUI显示列表中。

  【配置AP参数】

  当用户在WifiSettings界面上选择了一个AP后,会显示配置AP参数的一个对话框。

  showAccessPointDialog(state, AccessPointDialog.MODE_INFO);

  【连接】

  当用户在AcessPointDialog中选择好加密方式和输进密钥之后,再点击连接按钮,Android就会往连接这个AP。

  1 WifiLayer会先检测这个AP是不是之前被配置过,这个是通过向wpa_supplicant发送LIST_NETWORK命令并且比较返归值来实现的,

  //Need WifiConfiguration for the AP

  WifiConfiguration config = findConfiguredNetwork(state);

  假如wpa_supplicant没有这个AP的配置信息,则会向wpa_supplicant发送AAA_NETWORK命令来添加该AP

  2 ACC_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_SUBBEEDED动静

  5 WifiLayer处理EVENT_DHCP_SUDDEEDED动静,会再次广播发送

  至此为止,整个连接过程完成

   2. wpa_supplicant

  
Android平台使用的WiFi控制框架是基于大名鼎鼎的wpa_supplicant,它是一个 安全中间件,为各种无线网卡提供同一的 安全机制,如下图所示:

  

  对应上述结构,基于Android的手机中的WiFi控制分为三大组件:

  1)客户端程序,包括wpa_cli命令行或java图形界面程序,通过unix本地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 BBMP 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=BBMP

  # group=BBMP

  # psk=06b4be19da289f475aa46a33cb793029d4ab3db7a23ee9 2382eb0106c72ac7bb

  #}

  不同类型的网络,不同的参数等等,应有绝有。 对WIFI模块的LOG了解多一点点 我们在上面已经知道WIFI的启动过程,在功能运行中也会输出相应的日志信息,下面就来具体了解一下。(请留意,WIFI开启后会更改电池状态等其他状态。封闭WIFI时,android的策略是卸载驱动来省电。如出缺失就是题目。不外下文删往了与WIFI无关的LOG!) 1.开启WIFI&自动搜索

  
E/WifiHW ( 1201): ==JOHN DEBUG==: [WIFI] Load Driver

  加载驱动

  D/SettingsWifiEnabler( 1321): Received wifi state changed from Disabled to Enabling

  接收到广播:WIFI正在开启

  D/WifiService( 1201): ACTION_BATTERY_CHANGED pluggedType: 2

  电池状态改变

  E/WifiHW(1201):==JOHNDEBUG==:moduleaddress:4b93800 8 filename:/system/lib/modules/dhd.ko args:firmware_path=/system/wlan/broadcom/rtecdc.bi n nvram_path=/system/wlan/broadcom/nvram.txt

  WIFI硬件:加载内核 模块

  I/wpa_supplicant( 2490): CTRL-EVENT-STATE-CHANGE id=-1 state=2

  wpa_supplicant发失事件通知

  V/WifiMonitor( 1201): Event [CTRL-EVENT-STATE-CHANGE id=-1 state=2]

  WifiMonitor从wpa_supplicant接收事件通知

  I/wpa_supplicant( 2490): CTRL-EVENT-SCAN-RESULTS Ready

  wpa_supplicant发失事件通知:预备好开始搜索网络了

  E/wpa_supplicant( 2490): wpa_driver_priv_driver_cmd SCAN-ACTIVE len = 4096

  wpa_supplicant发失事件通知:驱动命令行.主动搜索.LEN

  E/wpa_supplicant( 2490): wpa_driver_priv_driver_cmd SCAN-ACTIVE len = 0, 11

  wpa_supplicant发失事件通知:驱动命令行.主动搜索.LEN

  E/wpa_supplicant( 2490): wpa_driver_priv_driver_cmd SCAN-PASSIVE len = 4096

  wpa_supplicant发失事件通知:驱动命令行.被动搜索.LEN

  E/wpa_supplicant( 2490): wpa_driver_priv_driver_cmd SCAN-PASSIVE len = 0, 12

  wpa_supplicant发失事件通知:驱动命令行.被动搜索.LEN=0.12

  D/SettingsWifiEnabler( 1321): Received wifi state changed from Enabling to Enabled

  接收到广播:WIFI已经开启

  E/wpa_supplicant( 2490): wpa_driver_priv_driver_cmd RSSI len = 4096

  wpa_supplicant发失事件通知:

  E/wpa_supplicant( 2490): wpa_driver_priv_driver_cmd RSSI len = 4, 4

  wpa_supplicant发失事件通知:

  E/wpa_supplicant( 2490): wpa_driver_priv_driver_cmd LINKSPEED len = 4096

  wpa_supplicant发失事件通知:

  E/wpa_supplicant( 2490): wpa_driver_priv_driver_cmd LinkSpeed 54 len = 12, 12

  wpa_supplicant发失事件通知:

  E/wpa_supplicant( 2490): wpa_driver_priv_driver_cmd MACACCR len = 4096

  wpa_supplicant发失事件通知:驱动命令行.MAC地址.LEN

  E/wpa_supplicant( 2490): wpa_driver_priv_driver_cmd Macaddr = 44:A4:2D:27:25:BE

  wpa_supplicant发失事件通知:驱动命令行.MAC地址

  E/wpa_supplicant( 2490): len = 28, 28

  wpa_supplicant发失事件通知:

  V/WifiStateTracker( 1201): Connection to supplicant established, state=SCANNING

  WIFI状态跟踪:连接哀求确认,状态=搜索

  D/NetworkStateTracker( 1201): setDetailed state, ld =IDLE and new state=SCANNING

  网络状态跟踪:更新显示为搜索状态

  V/WifiStateTracker( 1201): Changing supplicant state: SCANNING ==> INACTIVE

  WIFI状态跟踪:更改哀求状态:搜索中->不流动

   2.点击连接&获取状态

  
E/WifiHW ( 1201): ==JOHN DEBUG==: [WIFI] Load Driver

  WIFI硬件:加载驱动

  D/SettingsWifiEnabler( 1321): Received wifi state changed from Disabled to Enabling

  收到广播,WIFI状态正在开启

  E/WifiHW(1201):==JOHNDEBUG==:moduleaddress:4b93800 8 filename:/system/lib/modules/dhd.ko args:firmware_path=/system/wlan/broadcom/rtecdc.bi n nvram_path=/system/wlan/broadcom/nvram.txt

  WIFI硬件:加载内核 模块

  E/WifiHW ( 1201): ==JOHN DEBUG==: return of insmod : ret = 0, Unknown error: 0

  WIFI硬件:返归装载 模块讲演:返归指令0,未知 错误0

  ……

  I/wpa_supplicant( 2490): Trying to associate with 1c:bd:b9:f6:a7:9f (SSID='LosAngeles' freq=2412 MHz)

  wpa_supplicant发失事件通知:尝试连接,(SSID='LosAngeles'频段=2412 MHz)

  V/WifiMonitor( 1201):Event[Trying to associate with 1c:bd:b9:f6:a7:9f (SSID='LosAngeles' freq=2412 MHz)]

  WifiMonitor接收wpa_supplicant的事件

  V/WifiMonitor( 1201): Event [CTRL-EVENT-STATE-CHANGE id=-1 state=3] WifiMonitor接收事件

  V/WifiStateTracker( 1201): Changing supplicant state: SCANNING ==> ASSOCIATING

  WIFI状态跟踪:更改哀求状态:搜索中->匹配中

  D/NetworkStateTracker( 1201): setDetailed state, ld =SCANNING and new state=CONNECTING

  网络状态跟踪:更新显示为正在连接状态

  D/ConnectivityService( 1201): ConnectivityChange for WIFI: CONNECTING/CONNECTING

  连接治理服务:改变WIFI连接状态:正在连接/正在连接

  V/WifiStateTracker( 1201): Changing supplicant state: ASSOCIATING ==> ASSOCIATED

  WIFI状态跟踪:更改哀求状态:匹配中->已匹配

  D/NetworkStateTracker( 1201): setDetailed state, ld =CONNECTING and new state=CONNECTING

  网络状态跟踪:更新显示为正在连接状态

  I/wpa_supplicant( 2490): Associated with 1c:bd:b9:f6:a7:9f

  wpa_supplicant发失事件通知:已和1c:bd:b9:f6:a7:9f匹配

  V/WifiMonitor( 1201): Event [Associated with 1c:bd:b9:f6:a7:9f]

  WifiMonitor接收wpa_supplicant的事件

  V/WifiStateTracker( 1201): Changing supplicant state: ASSOCIATED ==> FOUR_WAY_HANDSHAKE

  WIFI状态跟踪:更改哀求状态:已匹配->TCP间断连接

  D/NetworkStateTracker( 1201): setDetailed state, ld =CONNECTING and new state=AUTHENTICATING

  网络状态跟踪:更新显示为鉴定中

  D/ConnectivityService( 1201): Dropping ConnectivityChange for WIFI: CONNECTING/AUTHENTICATING

  连接治理服务:抛出WIFI连接状态改变:已连接/鉴定中

  V/WifiStateTracker( 1201): Changing supplicant state: FOUR_WAY_HANDSHAKE ==> GROUP_HANDSHAKE

  WIFI状态跟踪:更改哀求状态:TCP间断连接->确认标志位

  D/NetworkStateTracker( 1201): setDetailed state, ld =AUTHENTICATING and new state=AUTHENTICATING

  网络状态跟踪:更新显示为鉴定中

  I/wpa_supplicant( 2490): WPA: Key negotiation completed with 1c:bd:b9:f6:a7:9f [PTK=BBMP GTK=TKIP]

  wpa_supplicant发失事件通知:WPA:与1c:bd:b9:f6:a7:9f确定标志位

  I/wpa_supplicant( 2490): CTRL-EVENT-STATE-CHANGE id=0 state=7

  wpa_supplicant发失事件通知:

  I/wpa_supplicant( 2490): CTRL-EVENT-CONNECTED - Connection to 1c:bd:b9:f6:a7:9f completed (auth) [id=0 id_str=]

  wpa_supplicant发失事件通知:连接完成

  V/WifiMonitor( 1201): Event [WPA: Key negotiation completed with 1c:bd:b9:f6:a7:9f [PTK=AAMP GTK=TKIP]]

  WifiMonitor接收wpa_supplicant事件

  V/WifiMonitor( 1201): Event [CTRL-EVENT-STATE-CHANGE id=0 state=7]

  WifiMonitor接收wpa_supplicant事件

  V/WifiMonitor( 1201): Event [CTRL-EVENT-CONNECTED - Connection to 1c:bd:b9:f6:a7:9f completed (auth) [id=0 id_str=]]

  WifiMonitor接收wpa_supplicant事件

  V/WifiStateTracker( 1201): Changing supplicant state: GROUP_HANDSHAKE ==> COMPLETED

  WIFI状态跟踪:更改哀求状态:确认标志位->完成

  V/WifiStateTracker( 1201): New network state is CONNECTED

  WIFI状态跟踪:新网络状态为已连接

  D/NetworkStateTracker( 1201): setDetailed state, ld =AUTHENTICATING and new state=OBTAINING_IPABBR

  网络状态跟踪:更新显示为获取IP地址

  D/ConnectivityService( 1201): Dropping ConnectivityChange for WIFI: CONNECTING/OBTAINING_IPABBR

  连接治理服务:抛出WIFI
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值