Android WIFI源码思路(对文章进行一些修改,以适于Android4.0版本)

一:什么是WIFI

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

二:Android平台下的WIFI模块

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

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

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

3. 连接断开网络
连接断开各种不同加密类型的网络

4. 手动添加网络
需要路由器关闭SSID广播。可手动输入SSID,网络加密类型,密码。对于OPAL手机来说,路由器隐藏了SSID,手动添加的网络是无法连接的。SSID(Service Set Identifier 服务集标识)AP唯一的ID码,用来区分不同的网络,最多可以有32个字符,无线终端和AP的SSID必须相同方可通信

关于SSID:SSID技术可以将一个无线局域网分为几个需要不同身份验证的子网络,每一个子网络都需要独立的身份验证,只有通过身份验证的用户才可以进入相应的子网络,防止未被授权的用户进入本网络。简单说,SSID就是一个局域网的名称,只有设置为名称相同SSID的值的电脑才能互相通信。这也可以作为WIFI安全的一种方法(设置密码  隐藏SSID  绑定物理地址这三种比较普遍)。


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

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

三:对WIFI模块深入了解一点点

1、WIFI的基本运行流程

WIFI的基本运行流程

此模块基本保持一样,但没有看到WifiLayer类,AccessPointDialog类(WifiDialog.java类对话框)

【初始化】

1 在SystemServer启动的时候,会生成一个ConnectivityService的实例。

2 ConnectivityService的构造函数会创建WifiService。

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

【开启WIFI】

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

2 当用户按下Wifi按钮后, Android会调用WifiEnabler的onPreferenceChange(Android4.0为onCheckedChanged方法),再由WifiEnabler调用WifiManager的setWifiEnabled接口函数,通过AIDL,实际调用的是WifiService的setWifiEnabled函数,WifiService接着向自身发送一条MESSAGE_ENABLE_WIFI消息(调用WifiStateMachine类的setWifiEnabled方法),在处理该消息的代码中做真正的使能工作:首先装载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显示列表中。(由于WifiLayer类没有找到,所以暂时没法确认这一段调用)

【配置AP参数】

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

showAccessPointDialog(state, AccessPointDialog.MODE_INFO);(通过使用WifiDialog.java类对话框)

【连接 1】

当用户在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地址 2属于连接的一部分】

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消息,但基本思路是这样)

2、wpa_supplicant

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

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
#}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值