【Android源码 栏目提醒】:网学会员为广大网友收集整理了,Android系统中Wi-Fi网络的研究与实现 - 操作系统,希望对大家有所帮助!
第25卷第5期 成都信息工程学院学报 Vd.25 No.5 2010年10月 JOURNAL OF CHENGDU UNIVERSITY OF INFORMATION”IECTINOLOGY Oct.2010文章编号:1671.1742(2010)05.0495.05 Android系统中Wi.Fi网络的研究与实现 陈法海, 杨斌 (西南交通大学信息科学与技术学院,四川成都610031) 摘要:对时下流行的Android系统中Wi.R网络的实现技术进行了研究。
在详细分析Wi.Fi模块的系统组成的 基础上,从系统使用及编程者的角度,深入剖析了Wi—Fi模块的初始化、启动、接入点扫描和IP地址配置的实现,通 过移植及调试Wi.Fi驱动程序,成功验证了Wi.Fi网络的实现过程。
关键词:计算机应用技术;嵌入式系统;Android;Wi.Fi模块;接入点 中图分类号:TP316 文献标识码:A1 Android系统概述 Andro“l】是Google公司开发的基于Linux平台开源的手机操作系统,该平台由操作系统、中间件、用户界面和应用软件组成,具体框架结构由5部分组成,其核心为Linux2.6内核,向上搭配Libraries(函数库)及An.droidRuntime(运行环境),再配合Application Framework(应用程序框架),来开发各种不同的Application(应用程序),是首个为移动终端打造的开放和完整的移动软件…2。
Android系统基于Linux 2.6内核来提供系统的核心服务,例如安全机制,内存管理,进程管理,网络堆栈和驱动模块。
其包含一组核心库,提供了Java语言核心库内的大部分功能。
Android应用程序运行于Dalvik虚拟机上,Dalvik虚拟机是基于寄存器的.编译器将Java源文件转为class文件,内置的dx工具又将class文件转化为Dex文件,Dex文件是在Dalvik虚拟机上运行程序的标准格式…3。
在wi—F-网络方面,虽然Android建立在Lin.UX内核之上,但是Wi—Fi网络的实现与一般Linux操作系统不一样,下面结合Andmid2.1的
源码,对Wi.Fi模块 的工作原理进行了分析。
2 Wi.Fi模块的工作原理 络lira:’匕竿湍瓣溉 络L—厂—1黼出衬::& 目_SII“’I’ⅢIJ(’A俐、-r s’r嘲ATEw(’II,2.1 Wi.Fi模块的组成 D觚删 挈懊:^J ………一。
--{WifiManager -q WifiStateTrackerl 在Android系统中,应用程序可以使用Wifimanager提供的API接口管理Wi—Fi的连接及使用情况,比如: A扣L I启动或者禁止Wi—Fi网络、请求扫描接入点(Access I WifiService卜 l WifiMonitor lPoint。
AP)、返回网络配置参数列表等等。
当Wi—Fi网 阿而杀司络被启动或者禁止时,Wifiservice将能过广播方式发出
android..net..wifi—.WifiWIFI—STATE—CHANGED—ACTION事件通知上层应 l用程序,Wifimrvice主要负责对WifiMonitor和wpa— Wi-Fi模块的底层驱动supplicant的进程进行初始化及禁止,并且发出命令给 图1 Wi.Fi模块的系统组成wpa—supplicant。
WifiMonitor是负责接收wpa—suppli一cant发出的各种事件通知。
然后WifiStateTracker广播各种行为。
Wi—Fi模块的组成如图1所示。
在wi.Fi模块的系统组成中Wifimanager主要提供一些API接I=I,Wifimanager处理及工作的内容大致如下几个方面: (1)返回网络配置的参数列表,参数列表可以查看及更新,并且个别的配置参数可以被修改。
(2)建立连接网络及禁止,以及查询有关网络状态的动态信息。
(3)扫描无线网络AP,并且根据AP的信息进行连接。
收稿日期:2010.10.22 万方数据 496 成都信息工程学院学报。
第25卷 (4)定义各种Intent组件的行为名称,组件行为是广播来更新wifi状态。
Wi—Fi模块中的Wifiservice可以通过WifiManager接口处理远程无线Wi—Fi操作请求,也可以创建一个WifiMonitor来侦听无线上网相关的事件。
WifiStateTracker可以跟踪Wi.Fi连接状态。
有关的无线网络事件的处理及状态更新都可以通过WifiStateTracker完成。
WifiMonitor侦听从wpa—supplicant服务器发出的事件请求,并且处理事件请求然后发送到WifiStateTracker,WifiMonitor独立运行于自己的线程中。
WifiNative要求发送请求守护进程。
WifiStateTracker所处理的事件如下: (1)WIFI一汀ATE—CHANGED—ACTION:表示wi—Fi网络已经被启动、禁止、正在启动中。
正在禁止中和未知状态中。
(2)SUPPLICANT—STATE—CHANGED一√6册IoN:表示连接一个AP的状态信息已经改变了,并且系统提供一个新状态信息。
(3)SUPPLICANT—CONNECTION—CHANGE—ACTIoN:表示与请求者的连接已经建立或者已经断开。
(4)SCAN—RESULTS—AVAILABLE—ACTION:表示AP扫描已经完成,并且返回扫描信息。
(5)RSSI—CHANGED—ACTION:表示Wi—Fi的信号强度已经改变。
(6)NI玎wORK—STATE—CHANGED一√吣汀IoN:表示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 Wi.Fi模块的初始化 当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接收事件通知。
Wi.Fi模块初始化过程如图2所示。
圈2 Wi-Fi模块初始化流程图2.3 Wi.Fi模块的启动 AndrcIid系统中WirelessSettings应用程序是负责启动Wi—F’i模块的,会调用WifiEnabler函数处理wi.Fi按钮。
当用户按下WiFi按钮后,WirelessSettings应用程序会调用WifiEnabler的onPreferenceChange,再由 万方数据 第5期 陈法海等:Android系统中wi.F、i网络的研究与实现 497WifiEnabler函数凋用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消息通知外界wi,Fi已经成功启动。
WifiEnabler创建的时候就会向Android系统注册接收WIFI—STATE—CHANGED—ACTION,因此当接收到该Intent,系统就开始扫描AP。
Wi—Fi模块启 熊。
麓瓣咖。
动过程如图3所示。
2.4 AP扫描及配置AP参数 当Android扫描AP时,Wi—Fi模块执行AP扫描的函数startScan(),实质是给wpa—supplicant发送SCAN命令。
当wpa—supplicant接收处理SCAN 笋啭!墨型圭兰要a:illl;2磷磷k州 l卜_—茵瞥——_1上亡==〕 ;z。
删u叫w‘:王; ‘lTa疆PqJ晕敷4:调用han‘^P命令后,wpa—supplicant会向控制通道发送事件通知扫描结束。
当wifi—wait—for—event函数接收到该事件后,WifiMonitor中的相应函数被调用处理该事件。
擎同时WifiStateTraeker接着广播发送阮~N—RE. 图 3 W . 1:.R 模 块 启 动流 —hJ¨。
硼SULTS—AVAILABI正一ACTION,在WifiLayer注册了接收SCAN—RESULTS—AVAILABLE—ACTION,所以相关处理函数handleScanResultsAvailable会被调用,在该函数中,先得到AP扫描的结果(最终是往wpa—supplicant发送SCAN—RESULT命令并读取返回值来实现的),对每一个扫描返回的AP,WifiLayer会调用WifiSettings的onAeeessPointSetChanged函数,从而最终把该AP加到GUI显示列表中。
AP扫描过程如图4所示。
殛翰∞州飚Ⅱ碴AvAⅡ^ⅡE科 }CTRL—EVENT—SCA: ; N..RESULTS : 糯亟融砥双】崛A、w嘲Ac珊oN消息 图4 AP扫描流程图 在Android系统的WifiSettings界面上选择了一个AP后,会显示配置AP参数的一个对话框,用户要在AcessPointDialog对话框中正确地选择AP参数。
AP参数配置过程如图5所示。
2.5 Wi.Fi连接及配置IP地址 在Android系统的AcessPointDialog对话框中选择好加密方式和连接密钥之后,点击连接按钮,然后Android系统就会自动连接AP。
WifiLayer会通过向wap—supplicant发送LIST—NETWORK命令实现检测AP是否之前被配置过。
如果wpa—supplicant没有AP的配置信息.就会向wpa—supplicant发送命令添加该AP.WifiLayer得到返回的net—workld.再利用networkld参数向wpa—supplieantv发送连接该AP命令.并且保存该AP配置信息为以后使用。
万方数据 498 成都信息 工程学院学报 第25卷Wi—Fi模块连接过程如图6所示。
当wpa—supplicant成功连接上AP之后,wpa—supplicant会向 —一.。
一.。
控制通道发送事件通知已经连接上AP,然后执行WifiMonitor 甲俨 中的MonitorThread处理该事件。
k 艮 m 用}= Wi—Fi模块连接到AP后,Android系统就要配置IP地址,此时系统中的WifiMonitor再调用WifiStateTracker的noti— 纠 船勰 甩 };howAccessPomlDialog()fyStateChange函数,接着WifiStateTracker会往自身发送 百稠用A(u-ssPoin!DialoglmEVENT—NFnvIDRK一盯ATE—CHANGEI)消息启动DHCP A(‘Ct-ssPointDialog(this.mWj Ⅲ叫;…一 _用户在对话框去获取IP地址,当DHCP获取IP地址后,会发送EVENT— i中输入参数 INTERFACE—CONFIGURATION—SUCCEEDED消息,当 :;选择WifiSettings界面 一书上的AP后.会显示配置WifiLayer收到EVENT—INTERFACE—coNFIGI瓜ATIoN— ;AP参数的对话框sUCCEEDED消息后,会广播发送EVENT—M玎WORK— 图5 AP参数配置流程图STATE—CHANGED,并且附带获取IP地址的完整信息,WifiLayer中注册此Intent的接受者,并调用handleNetworkStateChanged函数处理消息。
调用函数成功后An—droid OS的IP地址配置结束,Android系统具有Wi—Fi上网功能。
I Acces_sPointDialog〕 11:调用onClickO函数 〔‘。
。
‘‘‘W。
。
。
。
。
i。
。
f。
。
i。
。
L‘。
。
a。
。
。
y。
。
。
e。
。
。
r。
。
。
。
——〕 : WifiM.anager〕—〔Wi驷fiService〕 。
≠—#:调用h扑dleconnect()函数i i n品。
nhy旺苎飘m№w叫ki m 嬲m盯 加舭 魄甜 瓣 “H 曲碎 培数 .4 u 灞i量 r--一’一一一一一一‘。
一一一一一一一一 ll Nn ::在AcessPointDialog中选 择 一一加密方式和输入密钥,点 击 5:调eonfig=addConfiguratlonOi幕i数 :连接按钮.Android就自动 :连接该AP。
6:调用managerEnabIe 〕Network()i/fi数 ; : 8:调用 : : 7:调用mWifiManager.enable SerVice.e…nabfJ:lo 9:iJl,用; —挚错紫 图6 Wi—R模块连接流程图3 Wi.Fi网络的实现3.1 Wi.Fi驱动的移植 Android系统可以通过Wi—Fi模块无线上网,在岛C6410开发板中Wi—Fi模块与S3C6410处理器的接口是SDIo,要让Wi.Fi模块正常工作,必须保证SDIO的驱动是配置正确,因此Wi—Fi模块的驱动移植需要配置两个地方,分别是配置firmware和marvel8686SDIO驱动。
在内核配置界面中选择firmware的相关配置:GenericDriver Options->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->Enablefull debugging output .
上一篇:
Android系统下的LCD驱动移植
下一篇:
英语论文网([网学网]):英语专业本科生毕业论文写作