1 Android系统概述
Android是Google公司开发的基于Linux平台开源的手机操作系统,该平台由操作系统、中间件、用户界面和应用软件组成,具体框架结构由5部分组成,其核心为Linux2.6内核,向上搭配Libraries(函数库)及AndroidRuntime(运行环境),再配合Application Framework(应用程序框架),来开发各种不同的Application(应用程序),是首个为移动终端打造的开放和完整的移动软件。
Android系统基于Linux 2.6内核来提供系统的核心服务,例如安全机制,内存管理,进程管理,网络堆栈和驱动模块。其包含一组核心库,提供了Java语言核心库内的大部分功能。Android应用程序运行于Dalvik虚拟机上,Dalvik虚拟机是基于寄存器的。编译器将Java源文件转为class文件,内置的dx工具又将class文件转化为Dex文件,Dex文件是在Dalvik虚拟机上运行程序的标准格式。在wi—Fi网络方面,虽然Android建立在Linux内核之上,但是Wi—Fi网络的实现与一般Linux操作系统不一样,下面结合Andmid2.1的源码,对Wi.Fi模块的工作原理进行了分析。
2 WiFi模块的工作原理
2.1 WiFi模块的组成
在Android系统中,应用程序可以使用Wifimanager提供的API接口管理Wi—Fi的连接及使用情况,比如:
启动或者禁止Wi—Fi网络、请求扫描接入点(AccessPoint,AP)、返回网络配置参数列表等等。当WiFi网络被启动或者禁止时,Wifiservice将能过广播方式发出WIFI-STATE-CHANGED-ACTION事件通知上层应用程序,Wifimrvice主要负责对WifiMonitor和wpa-supplicant的进程进行初始化及禁止,并且发出命令给wpa-supplicant。WifiMonitor是负责接收wpa-suppli-cant发出的各种事件通知。然后WifiStateTracker广播各种行为。WiFi模块的组成如图1所示。
图1 WiFi模块的系统组成
在wiFi模块的系统组成中Wifimanager主要提供一些API接口,Wifimanager处理及工作的内容大致如下几个方面:
(1)返回网络配置的参数列表,参数列表可以查看及更新,并且个别的配置参数可以被修改。
(2)建立连接网络及禁止,以及查询有关网络状态的动态信息。
(3)扫描无线网络AP,并且根据AP的信息进行连接。
(4)定义各种Intent组件的行为名称,组件行为是广播来更新wifi状态。
WiFi模块中的Wifiservice可以通过WifiManager接口处理远程无线WiFi操作请求,也可以创建一个WifiMonitor来侦听无线上网相关的事件。WifiStateTracker可以跟踪Wi.Fi连接状态。有关的无线网络事件的处理及状态更新都可以通过WifiStateTracker完成。WifiMonitor侦听从wpa—supplicant服务器发出的事件请求,并且处理事件请求然后发送到WifiStateTracker,WifiMonitor独立运行于自己的线程中。WifiNative要求发送请求守护进程。WifiStateTracker所处理的事件如下:
(1)WIFI—STATE—CHANGED—ACTION:表示wi—Fi网络已经被启动、禁止、正在启动中。正在禁止中和未知状态中。
(2)SUPPLICANT—STATE—CHANGED—ACTION:表示连接一个AP的状态信息已经改变了,并且系统提供一个新状态信息。
(3)SUPPLICANT—CONNECTION—CHANGE—ACTION:表示与请求者的连接已经建立或者已经断开。
(4)SCAN—RESULTS—AVAILABLE—ACTION:表示AP扫描已经完成,并且返回扫描信息。
(5)RSSI—CHANGED—ACTION:表示Wi—Fi的信号强度已经改变。
(6)NETWORK—STATE—CHANGED一ACTION:表示Wi—Fi网络的连接状态已经改变。
(7)NETWORK—IDS—CHANGED—ACTION:表示配置网络的网络ID号已经改变。
Android实现Wi—Fi网络大致经过4个步骤:Wi—Fi模块的初始化;Wi—Fi模块的启动;AP扫描及配置AP参数;Wi—Fi连接及配置IP地址。下面是Android2.1中实现Wi—Fi上网的4个步骤的源码分析。
2.2 WiFi模块的初始化
当Android系统启动Wi—Fi模块时,先对wi—Fi模块进行初始化,Android系统通过startservice(Intent ser—vice)可以启动一个Service,通过Context.bindService()可以绑定一个Serivce。在系统启动systemserver的时候,。通过ServiceManager调用addservice()函数生成一个ConnectivityService实例。在ConnectivityService的构造函数里面创建WifiServiee和WifiStateTracker,而wifiStateTracker却可以创建WifiMonitor接收来自底层的事件,WifiService和WifiMonitor是整个Wi.Fi模块的核心。WifiService负责启动关闭wpa—supplicant、启动关闭Wifi.
Monitor监视线程和把命令下发给wpa—supplicant,而WifiMonitor则负责从wpa—supplicant接收事件通知。WiFi模块初始化过程如图2所示。
图2 Wi-Fi模块初始化流程图
2.3 WiFi模块的启动
AndrcIid系统中WirelessSettings应用程序是负责启动Wi—Fi模块的,会调用WifiEnabler函数处理wiFi按钮。当用户按下WiFi按钮后,WirelessSettings应用程序会调用WifiEnabler的onPreferenceChange,再由WifiEnabler函数凋用WifiManager的setWifiEnabLED接121函数。WifiService接着向自身发送一条MESSAGE—ENABLE—WIFI消息,在处理该消息的代码中做真正的使能工作:首先装载wi.Fi内核模块(该模块的位置硬编码为“/system/lib/modules/wlan.ko”),然后启动wpa—supplicant(配置文件硬编码为“/data/misc/wifi/wpa—supplicant.conf”),再通过WifiStateTracker启动WifiMonitor中的监视线程。当使能成功后,会广播发送WIFI—STATE—CHANGED—ACTION消息通知外界wiFi已经成功启动。WifiEnabler创建的时候就会向Android系统注册接收WIFI—STATE—CHANGED—ACTION,因此当接收到该Intent,系统就开始扫描AP。Wi—Fi模块启动过程如图3所示。
图3 wifi模块启动流程图
2.4 AP扫描及配置AP参数
当Android扫描AP时,Wi—Fi模块执行AP扫描的函数startScan(),实质是给wpa—supplicant发送SCAN命令。当wpa—supplicant接收处理SCAN命令后,wpa—supplicant会向控制通道发送事件通知扫描结束。当wifi—wait—for—event函数接收到该事件后,WifiMonitor中的相应函数被调用处理该事件。
同时WifiStateTraeker接着广播发送SCAN_RE_SULTS—AVAILABLE一ACTION,在WifiLayer注册了接收SCAN—RESULTS—AVAILABLE—ACTION,所以相关处理函数handleScanResultsAvailable会被调用,在该函数中,先得到AP扫描的结果(最终是往wpa—supplicant发送SCAN—RESULT命令并读取返回值来实现的),对每一个扫描返回的AP,WifiLayer会调用WifiSettings的onAeeessPointSetChanged函数,从而最终把该AP加到GUI显示列表中。AP扫描过程如图4所示。
图4 AP扫描流程图
在Android系统的WifiSettings界面上选择了一个AP后,会显示配置AP参数的一个对话框,用户要在AcessPointDialog对话框中正确地选择AP参数。AP参数配置过程如图5所示。
图5 AP参数配置流程图
2.5 WiFi连接及配置IP地址
在Android系统的AcessPointDialog对话框中选择好加密方式和连接密钥之后,点击连接按钮,然后Android系统就会自动连接AP。
WifiLayer会通过向wap—supplicant发送LIST—NETWORK命令实现检测AP是否之前被配置过。如果wpa—supplicant没有AP的配置信息。就会向wpa—supplicant发送命令添加该AP.WifiLayer得到返回的net—work再利用networkld参数向wpa—supplieantv发送连接该AP命令。并且保存该AP配置信息为以后使用。
Wi—Fi模块连接过程如图6所示。
图6 WiFI模块连接流程图
当wpa—supplicant成功连接上AP之后,wpa—supplicant会向控制通道发送事件通知已经连接上AP,然后执行WifiMonitor中的MonitorThread处理该事件。
Wi—Fi模块连接到AP后,Android系统就要配置IP地址,此时系统中的WifiMonitor再调用WifiStateTracker的noti—fyStateChange函数,接着WifiStateTracker会往自身发送EVENT—NETWORK一STATE—CHANGED)消息启动DHCP去获取IP地址,当DHCP获取IP地址后,会发送EVENT—INTERFACE—CONFIGURATION—SUCCEEDED消息,当WifiLayer收到EVENT—INTERFACE—CONFIGURATION—SUCCEEDED消息后,会广播发送EVENT—NETWORK—STATE—CHANGED,并且附带获取IP地址的完整信息,WifiLayer中注册此Intent的接受者,并调用handleNetworkStateChanged函数处理消息。调用函数成功后An—droid OS的IP地址配置结束,Android系统具有Wi—Fi上网功能。
3 WiFi网络的实现
3.1 WiFi驱动的移植
Android系统可以通过wifi模块无线上网,在S3C6410开发板中wifi模块与S3C6410处理器的借口的是SDIO,要让wifi模块正常工作,必须保证SDIO的驱动是配置正常的,因此Wi—Fi模块的驱动移植需要配置两个地方,分别是配置firmware和marvel8686SDIO驱动。在内核配置界面中选择firmware的相关配置:GenericDriverOptions->Prevent firmware from being built和Generic Driver Options->Userspace firmware loading support(NEW)一>Include in.kemel firmware blobs in kemeI binary,配置时要用到2个marvel8686的firmware文件。内核配置时选择marvel8686SDIo的相关配置:Network device support->Wireless LAN->Wireless LAN(IEEE 802.11)一>MarvelI Libertas WLAN driver support->Marvell Libertas 8385 and 8686 SDlO 802.1lb/g cards、Networkdevice support.>Wireless I AN.>Wireless LAN(IEEE 802.11)。>Marvell Libertas WLAN driver support->Enable full debugging output in the Libertas module和Network device support一>Wireless LAN一>Wireless LAN(IEEE802.11)一>Marvell 8xxx Libertas WLAN driver support with thin firmware……退出内核配置界面后运行命令make来编译Android的内核。
3.2 WiFi模块的测试
通过USB将内核镜像文件下载到三星S3C6410开发板的内存中,下载结束后复位板子或者断电重启。在内核启动过程中,从超级终端显示Wi.Fi模块的信息:
mmc0:new SDIO card at address 0001
libertas—sdio mmcO:0001:l:firmware:using built.in firmware sd8686一helper.bin
libertas—sdio mmc0:0001:l:firmware:using built—in firmware sd8686.bin
libertas:00:22:43:73:26:bf,fw 9.70.31024,cap 0x000003a3
libertas:PREP—CMD:command 0x00a3 failed:2
libertas:PREP—CMD:command 0x00a3 failed:2
libertas:ethl:Marveli WLAN 802.1 1 adapter
以上显示的信息表明内核已经找到WIFI模块。
当S3C6410开发板成功运行Android系统后,选择settings->wireless&network.>WIFI,然后在超级终端中输入logeat命令可以显示Wi—Fi使用信息,并且开发板上Wi—Fi模块的指示灯LEDl会闪烁。
点击Android系统下的Wifi Settings对话框,Android系统开始搜索AP,搜索AP成功后界面显示出AP的情况,选择需要连接的AP进行连接。连接成功后S3C6410开发板具有了wiFi网络功能,Android系统中显示搜索的AP信息如图7所示。
图7 Android搜索的AP结果
4 结语
对Android智能手机操作系统来说,WiFi网络系统是其中一个主要组成部分,了解Android系统中的wiFi网络的工作原理可以对应用程序性能上的提供有所帮助。在Android系统移植到其他嵌入式设备中,Android系统中Wi—Fi的底层驱动移植是其中一个关键部分,通过对底层Wi—Fi接口以及对WiFi驱动移植的研究,将更有效地实现Android系统在其他嵌入式设备上的移植及开发相应WiFi网络的应用程序。