【Android源码 栏目提醒】:网学会员为广大网友收集整理了,Android系统中WiFi网络的研究与实现 - 培训资料,希望对大家有所帮助!
文章编号:005049505
Android系统中WiFi网络的研究与实现陈法海杨斌西南交通大学信息科学与技术学院四川成都610031摘要:对时下流行的
Android系统中WiFi网络的实现技术进行了研究。
在详细分析WiFi模块的系统组成的基础上从系统使用及编程者的角度深入剖析了WiFi模块的初始化、启动、接入点扫描和IP地址配置的实现通过移植及调试WiFi驱动程序成功验证了WiFi网络的实现过程。
关键词:计算机应用技术嵌入式系统AndroidWiFi模块接入点中图分类号:TP316文献标识码:A1
Android系统概述
Android1是Google公司开发的基于Linux平台开源的手机操作系统该平台由操作系统、中间件、用户界面和应用软件组成具体框架结构由5部分组成其核心为Linux26内核向上搭配Libraries函数库及AndroidRuntime运行环境再配合ApplicationFramework应用程序框架来开发各种不同的Application应用程序是首个为移动终端打造的开放和完整的移动软件2。
Android系统基于Linux26内核来提供系统的核心服务例如安全机制内存管理进程管理网络堆栈和驱动模块。
其包含一组核心库提供了Java语言核心库内的大部分功能。
Android应用程序运行于Dalvik虚拟机上Dalvik虚拟机是基于寄存器的编译器将Java源文件转为class文件内置的dx工具又将class文件转化为Dex文件Dex文件是在Dalvik虚拟机上运行程序的标准格式3。
在WiFi网络方面虽然
Android建立在Linux内核之上但是WiFi网络的实现与一般Linux操作系统不一样下面结合
Android21的
源码对WiFi模块的工作原理进行了分析。
图1WiFi模块的系统组成2WiFi模块的工作原理2.1WiFi模块的组成在
Android系统中应用程序可以使用Wifimanager提供的API接口管理WiFi的连接及使用情况比如:启动或者禁止WiFi网络、请求扫描接入点AccessPointAP、返回网络配置参数列表等等。
当WiFi网络被启动或者禁止时Wifiservice将能过广播方式发出WIFI-STATE-CHANGED-ACTION事件通知上层应用程序Wifiservice主要负责对WifiMonitor和wpa-supplicant的进程进行初始化及禁止并且发出命令给wpa-supplicant。
WifiMonitor是负责接收wpa-supplicant发出的各种事件通知然后WifiStateTracker广播各种行为。
WiFi模块的组成如图1所示。
在WiFi模块的系统组成中Wifimanager主要提供一些API接口Wifimanager处理及工作的内容大致如下几个方面:1返回网络配置的参数列表参数列表可以查看及更新并且个别的配置参数可以被修改。
2建立连接网络及禁止以及查询有关网络状态的动态信息。
3扫描无线网络AP并且根据AP的信息进行连接。
第25卷第5期2010年10月成都信息工程学院学报JOURNALOFCHENGDUUNIVERSITYOFINFORMATIONTECHNOLOGYVol.25No.5Oct.20104定义各种Intent组件的行为名称组件行为是广播来更新wifi状态。
WiFi模块中的Wifiservice可以通过WifiManager接口处理远程无线WiFi操作请求也可以创建一个WifiMonitor来侦听无线上网相关的事件。
WifiStateTracker可以跟踪WiFi连接状态。
有关的无线网络事件的处理及状态更新都可以通过WifiStateTracker完成。
WifiMonitor侦听从wpa-supplicant服务器发出的事件请求并且处理事件请求然后发送到WifiStateTrackerWifiMonitor独立运行于自己的线程中。
WifiNative要求发送请求守护进程。
WifiStateTracker所处理的事件如下:1WIFI-STATE-CHANGED-ACTION:表示WiFi网络已经被启动、禁止、正在启动中。
正在禁止中和未知状态中。
2SUPPLICANT-STATE-CHANGED-ACTION:表示连接一个AP的状态信息已经改变了并且系统提供一个新状态信息。
3SUPPLICANT-CONNECTION-CHANGE-ACTION:表示与请求者的连接已经建立或者已经断开。
4SCAN-RESULTS-AVAILABLE-ACTION:表示AP扫描已经完成并且返回扫描信息。
5RSSI-CHANGED-ACTION:表示WiFi的信号强度已经改变。
6NETWORK-STATE-CHANGED-ACTION:表示WiFi网络的连接状态已经改变。
7NETWORK-IDS-CHANGED-ACTION:表示配置网络的网络ID号已经改变。
Android实现WiFi网络大致经过4个步骤:WiFi模块的初始化WiFi模块的启动AP扫描及配置AP参数WiFi连接及配置IP地址。
下面是
Android2.1中实现WiFi上网的4个步骤的
源码分析。
2.2WiFi模块的初始化当
Android系统启动WiFi模块时先对WiFi模块进行初始化
Android系统通过startServiceIntentservice可以启动一个Service通过Context.bindService可以绑定一个Serivce。
在系统启动SystemServer的时候通过ServiceManager调用addService函数生成一个ConnectivityService实例。
在ConnectivityService的构造函数里面创建WifiService和WifiStateTracker而WifiStateTracker却可以创建WifiMonitor接收来自底层的事件WifiService和WifiMonitor是整个WiFi模块的核心。
WifiService负责启动关闭wpa-supplicant、启动关闭WifiMonitor监视线程和把命令下发给wpa-supplicant而WifiMonitor则负责从wpa-supplicant接收事件通知。
WiFi模块初始化过程如图2所示。
图2WiFi模块初始化流程图2.3WiFi模块的启动
Android系统中WirelessSettings应用程序是负责启动WiFi模块的会调用WifiEnabler函数处理WiFi按钮。
当用户按下WiFi按钮后WirelessSettings应用程序会调用WifiEnabler的onPreferenceChange再由496成都信息工程学院学报第25卷Linux公社LinuxIDC.com于2006年9月25日注册并开通网站Linux现在已经成为一种广受关注和支持的一种操作系统IDC是互联网数据中心LinuxIDC就是关于Linux的数据中心。
LinuxIDC.com提供包括UbuntuFedoraSUSE技术以及最新IT资讯等Linux专业类网站。
并被收录到Google 网页目录-计算机 软件 操作系统 Linux 目录下。
Linux公社LinuxIDC.com设置了有一定影响力的Linux专题栏目。
包括Ubuntu专题Fedora专题RedHat专题SUSE专题红旗Linux专题
Android专题 Linux公社简介 - 广告服务 - 网站地图 - 帮助信息 - 联系我们 本站LinuxIDC所刊载文章不代表同意其说法或描述仅为提供更多信息也不构成任何建议。
本站带宽由6688.CC友情提供 Copyright ?? 2006-2011 Linux公社 All rights reserved WifiEnabler函数调用WifiManager的setWifiEnabled接口函数WifiService接着向自身发送一条MESSAGE-ENABLE-WIFI消息在处理该消息的代码中做真正的使能工作:首先装载WiFi内核模块该模块的位置硬编码为/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。
WiFi模块启动过程如图3所示。
图3WiFi模块启动流程图2.4AP扫描及配置AP参数当
Android扫描AP时WiFi模块执行AP扫描的函数startScan实质是给wpa-supplicant发送SCAN命令。
当wpa-supplicant接收处理SCAN命令后wpa-supplicant会向控制通道发送事件通知扫描结束当wifi-wait-for-event函数接收到该事件后WifiMonitor中的相应函数被调用处理该事件。
同时WifiStateTracker接着广播发送SCAN-RESULTS-AVAILABLE-ACTION在WifiLayer注册了接收SCAN-RESULTS-AVAILABLE-ACTION所以相关处理函数handleScanResultsAvailable会被调用在该函数中先得到AP扫描的结果最终是往wpa-supplicant发送SCAN-RESULT命令并读取返回值来实现的对每一个扫描返回的APWifiLayer会调用WifiSettings的onAccessPointSetChanged函数从而最终把该AP加到GUI显示列表中。
AP扫描过程如图4所示。
图4AP扫描流程图在
Android系统的WifiSettings界面上选择了一个AP后会显示配置AP参数的一个对话框用户要在AcessPointDialog对话框中正确地选择AP参数。
AP参数配置过程如图5所示。
2.5WiFi连接及配置IP地址在
Android系统的AcessPointDialog对话框中选择好加密方式和连接密钥之后点击连接按钮然后
Android系统就会自动连接AP。
WifiLayer会通过向wap-supplicant发送LIST-NETWORK命令实现检测AP是否之前被配置过。
如果wpa-supplicant没有AP的配置信息就会向wpa-supplicant发送命令添加该APWifiLayer得到返回的networkId再利用networkId参数向wpa-supplicantv发送连接该AP命令并且保存该AP配置信息为以后使用。
497第5期陈法海等:
Android系统中WiFi网络的研究与实现WiFi模块连接过程如图6所示。
图5AP参数配置流程图当wpa-supplicant成功连接上AP之后wpa-supplicant会向控制通道发送事件通知已经连接上AP然后执行WifiMonitor中的MonitorThread处理该事件。
WiFi模块连接到AP后
Android系统就要配置IP地址此时系统中的WifiMonitor再调用WifiStateTracker的notifyStateChange函数接着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函数处理消息。
调用函数成功后AndroidOS的IP地址配置结束
Android系统具有WiFi上网功能。
图6WiFi模块连接流程图3WiFi网络的实现3.1WiFi驱动的移植
Android系统可以通过WiFi模块无线上网在S3C6410开发板中WiFi模块与S3C6410处理器的接口是SDIO要让WiFi模块正常工作必须保证SDIO的驱动是配置正确因此WiFi模块的驱动移植需要配置两个地方分别是配置firmware和marvel8686SDIO驱动。
在内核配置界面中选择firmware的相关配置:GenericDriverOptionsPreventfirmwarefrombeingbuilt和GenericDriverOptionsUserspacefirmwareloadingsupportNEWIncludeinkernelfirmwareblobsinkernelbinary配置时要用到2个marvel8686的firmware文件。
内核配置时选择marvel8686SDIO的相关配置:NetworkdevicesupportWirelessLANWirelessLANIEEE802.11MarvellLibertasWLANdriversupportMarvellLibertas8385and8686SDIO802.11b/gcards、NetworkdevicesupportWirelessLANWirelessLANIEEE802.11MarvellLibertasWLANdriversupportEnablefulldebuggingoutputintheLibertasmodule和NetworkdevicesupportWirelessLANWirelessLANIEEE802.11Marvell8xxxLibertasWLANdriversupportwiththinfirmware。
退出内核配置界面后运行命令make来编译
Android的内核。
498成都信息工程学院学报第25卷3.2WiFi模块的测试通过USB将内核镜像文件下载到三星S3C6410开发板的内存中下载结束后复位板子或者断电重启。
在内核启动过程中从超级终端显示WiFi模块的信息:mmc0:newSDIOcardataddress0001libertas-sdiommc0:0001:1:firmware:usingbuiltinfirmwaresd8686-helper.bin图7
Android搜索的AP结果libertas-sdiommc0:0001:1:firmware:usingbuiltinfirmwaresd8686.binlibertas:00:22:43:73:26:bffw9.70.3p24cap0x000003a3libertas:PREP-CMD:command0x00a3failed:2libertas:PREP-CMD:command0x00a3failed:2libertas:eth1:MarvellWLAN802.11adapter以上显示的信息表明内核已经找到WIFI模块。
当S3C6410开发板成功运行
Android系统后选择settingswirelessnetworkWIFI然后在超级终端中输入logcat命令可以显示WiFi使用信息并且开发板上WiFi模块的指示灯LED1会闪烁。
点击
Android系统下的WifiSettings对话框
Android系统开始搜索AP搜索AP成功后界面显示出AP的情况选择需要连接的AP进行连接。
连接成功后S3C6410开发板具有了WiFi网络功能
Android系统中显示搜索的AP信息如图7所示。
4结束语对
Android智能手机操作系统来说WiFi网络系统是其中一个主要组成部分了解
Android系统中的WiFi网络的工作原理可以对应用程序性能上的提供有所帮助。
在
Android系统移植到其他嵌入式设备中
Android系统中WiFi的底层驱动移植是其中一个关键部分通过对底层WiFi接口以及对WiFi驱动移植的研究将更有效地实现
Android系统在其他嵌入式设备上的移植及开发相应WiFi网络的应用程序。
参考文献:1Androidprojectofficial.AndroidprojectEB/OL.http://www.
android.com/2008.2CodeHome.AndroidAnOpenHandsetAllianceProjectEB/OL.http://code.google.com/
android/whatisandroid.html2008.3陈憬陈平华李文亮.
Android内核分析J.现代计算机专业版.200911:112-114.4韩超梁泉.
Android系统原理及开发要点详解M.北京:电子工业出版社2010.ResearchandimplementationofWiFinetworkinAndroidsystemCHENFahaiYANGBinSchoolofInformationScienceTechnologySouthwestJiaotongUniversityChengdu610031ChinaAbstract:TheimplementationtechnologyofAndroidWiFiwasresearched.BasedonthedetailedanalysisofthecompositionofAndroidWiFimoduletheimplementationofinitializationstarttingAPscanningandIPaddressconfigurationofWiFimodulearedeeplyillustratedfromboththesystemusageandprogrammersaspects.BytransplantationanddebuggingoftheWiFidriveprogramtheimplementationprogressofWiFinetworkisvalidatedsuccessfully.Keywords:computerapplicationembeddedsystemAndroidWiFimoduleaccesspoint499第5期陈法海等:
Android系统中WiFi网络的研究与实现Linux公社LinuxIDC.com于2006年9月25日注册并开通网站Linux现在已经成为一种广受关注和支持的一种操作系统IDC是互联网数据中心LinuxIDC就是关于Linux的数据中心。
LinuxIDC.com提供包括UbuntuFedoraSUSE技术以及最新IT资讯等Linux专业类网站。
并被收录到Google 网页目录-计算机 软件 操作系统 Linux 目录下。
Linux公社LinuxIDC.com设置了有一定影响力的Linux专题栏目。
包括Ubuntu专题Fedora专题RedHat专题SUSE专题红旗Linux专题
Android专题 Linux公社简介 - 广告服务 - 网站地图 - 帮助信息 - 联系我们 本站LinuxIDC所刊载文章不代表同意其说法或描述仅为提供更多信息也不构成任何建议。
本站带宽由6688.CC友情提供 Copyright ?? 2006-2011 Linux公社 All rights reserved