WIFI学习之一:WIFI模块

转载 2012年03月23日 16:01:09
WIFI模块

申屠家振

修改

1.2011119

2.2011127

android平台的WIFI模块进行已经有段时间了,现在做一总结,以便以后查阅与修正。

心得之作,如有异议,请斧正。


  1. 什么是WIFI

WIFI是一种无线连接技术,可用于PCPDA手机等终端。WIFI的目的是改善基于IEEE802.11标准的无线网络产品之间的互通性,也就是说WIFI是基于802.11标准的,但WIFI不等同无线网络。


  1. android平台下的WIFI模块

简单介绍一下,WIFI模块的基本功能:

  1. 开关WIFI

除了在WIFI设置界面可以开关WIFI,还有其他的入口可以开关,要查看这些开关状态是否一致。还有就是飞行模式对WIFI开关的影响,由于WIFI开和关都有一个时间过程,而飞行模式的开关瞬间完成,所以有时会出现冲突。

  1. 开关新可用网络提醒

新可用网络的定义是自WIFI模块开启后,从未发现过的,为加密的网络。只有满足了新可用网络的定义,才会有提醒。

  1. 连接断开网络

连接断开各种不同加密类型的网络(具体类型下文有详解)

  1. 手动添加网络

需要路由器关闭SIID广播。可手动输入SIID,网络加密类型,密码。对于OPAL手机来说,路由器隐藏了SSID,手动添加的网络是无法连接的。

  1. 搜索网络

手动点击搜索按钮可以搜索网络,也可以等待WIFI模块自动搜索网络。

  1. 休眠设置

由于WIFI模块是用电大户,所有为了省电,androidWIFI加了一个休眠策略,可以设置永远不断开,充电时不断开和锁屏时断开。要测试休眠设置是否有效,可以在路由器上PING手机的IPPING通就是连接状态。OPAL手机的休眠策略属于完全失效,现在的情况是无论选哪个都会一直保持连接,锁屏后15分钟再休眠。

  1. 设置静态IP

Android系统里对IP设置的输入限制很有问题,我一直认为这是弱智的限制。正常IP的范围在0-255之间,androidIP输入的限制是整数0到整数255之间,也就是说0000.000200.001.001这样一个IP都能合法输入。


  1. WIFI模块深入了解一点点

  1. WIFI的基本运行流程

【初始化】
1
SystemServer启动的时候,会生成一个ConnectivityService的实例

2 ConnectivityService的构造函数会创建WifiService

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

【连接AP

1 WirelessSettings在初始化的时候配置了由WifiEnabler来处理Wifi按钮

2当用户按下Wifi按钮后, Android会调用WifiEnableronPreferenceChange,再由WifiEnabler调用WifiManagersetWifiEnabled接口函数,通过AIDL,实际调用的是WifiServicesetWifiEnabled函数,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扫描的入口函数是WifiServicestartScan,它其实也就是往wpa_supplicant发送SCAN命令。

2wpa_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会调用WifiSettingsonAccessPointSetChanged函数,从而最终把该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发送ADD_NETWORK命令来添加该AP

2 ADD_NETWORK命 令 会 返 回 一 个ID,WifiLayer再 用 这 个 返 回 的ID作 为参数向wpa_supplicant发送ENABLE_NETWORK命令,从而让wpa_supplicant去连接该AP

【配置IP地址】

1wpa_supplicant成功连接上AP之后,它会向控制通道发送事件通知连接上AP,从而wifi_wait_for_event函数会接收到该事件,由此WifiMonitor中的MonitorThread会被执行来出来这个事件

2 WifiMonitor再调用WifiStateTrackernotifyStateChange,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消 息,会 再 次 广 播 发 送

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

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 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. 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:4b938008 filename:/system/lib/modules/dhd.ko args:firmware_path=/system/wlan/broadcom/rtecdc.bin 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]

WifiMonitorwpa_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 MACADDR 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:4b938008 filename:/system/lib/modules/dhd.ko args:firmware_path=/system/wlan/broadcom/rtecdc.bin 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=CCMP 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=CCMP 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_IPADDR

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

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

连接管理服务:抛出WIFI

用wifi模块开发项目

一、写在前面 继上次的文章wifi模块esp8266的学习后,我们就可以利用自己手上的esp8266-01 模块做一些小项目啦。网上有关利用wifi模块来开发项目的资料,我百度了,但是觉得很少,大...
  • Brunon
  • Brunon
  • 2017年03月02日 20:35
  • 1621

wifi学习总结

1WLAN技术 3 2802.11协议简述 3 2.1.1概述 3 3802.11四种主要物理组件 4 3.1工作站(Station) 4 3.2接入点(AccessPoint) 5 3.3无线媒...
  • u011006622
  • u011006622
  • 2015年09月15日 11:11
  • 2735

WIFI模块使用心得

WIFI模块使用心得   作者:JCY QQ:1157525568 时间:2004:05:12 WIFI模块的名字:KIT-V2.3     此WIFI模块有四种模式:默认模式、串口到...
  • wuwuhuizheyisheng
  • wuwuhuizheyisheng
  • 2014年05月29日 22:44
  • 5706

一种内嵌P2P的wifi转红外发射神器

IR_SW3 型Wifi扇区型红外学习模块  目录 1.控制器特点... 2 2.    外形及接口... 3 3.    Wifi无线组网红外学习介绍... 4 3.1.     Wifi工作模式....
  • ilovefrog
  • ilovefrog
  • 2013年10月14日 14:51
  • 2119

Wifi模块解析和启动流程

http://blog.csdn.net/ylyuanlu/article/details/7711433 模块解析和启动流程 WIFI整体框架如图所示: 首先,用户程序使用WifiManage...
  • taiyuanwuyin
  • taiyuanwuyin
  • 2017年10月24日 16:45
  • 178

一、Marvell 88W8686 WiFi模块的初始化代码

本程序所用的单片机型号为:STM32F103RE PB12端口为外接的WiFi模块电源开关,当PB12输出低电平时接通电源。 注意:WM-G-MR-09模块的芯片组(Chip Set)就是...
  • zuoyioo7
  • zuoyioo7
  • 2017年10月09日 13:44
  • 212

关于WiFi模块(连接流程介绍)

 (一)基本类的调用 Android 已经帮助我们做好了一些可以直接调用的类 打开andriod.net.wifi 我们可以看到Android 提供的几个类。 在看这一部分之前,最好能...
  • OuNuo5280
  • OuNuo5280
  • 2015年11月17日 10:05
  • 1707

Android WiFi模块功能开发

Android wifi模块开发
  • free092875
  • free092875
  • 2016年10月11日 16:06
  • 4459

WIFI模块工作模式浅析(二)

上篇介绍了WIFI模块的STA模式,这篇介绍下WIFI的AP模式(软AP)。 这里我们这样使用我们的设备,开发板上插上网线和WIFI模块。其工作原理是通过网线把网络接到开发板,我们的WIFI模块作为无...
  • yeyechenxi
  • yeyechenxi
  • 2013年09月17日 22:27
  • 1776

WIFI转串口无线传输模块,个人体会

以下内容适用于嵌入式开发,对于普通的只是需要上网和通信的来说,没什么意义。 有误之处望有大神来指正,感激不尽。 WIFI模块可以认为是一个带AP的无线网卡,有两个工作模式。 1.AP模式...
  • lovenessless
  • lovenessless
  • 2012年11月16日 11:18
  • 3149
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WIFI学习之一:WIFI模块
举报原因:
原因补充:

(最多只允许输入30个字)