您好,欢迎访问三七文档
一、wifi组建原理:WIFI就是一种无线联网的技术,以前通过网线连接电脑,而现在则是通过无线电波来连网;常见的就是一个无线路由器,那么在这个无线路由器的电波覆盖的有效范围都可以采用WIFI连接方式进行联网,如果无线路由器连接了一条ADSL线路或者别的上网线路,则又被称为“热点”。一般架设无线网络的基本配备就是无线网卡及一个AP(无线接入点)。有了AP,就像一般有线网络的Hub一般,无线工作站可以快速且轻易地与网络相连。特别是对于宽带的使用,WiFi更显优势,有线宽带网络(ADSL、小区LAN等)到户后,连接到一个AP,然后在电脑中安装一块无线网卡即可上网。普通的家庭有一个AP已经足够,甚至用户的邻里得到授权后,则无需增加端口,也能以共享的方式上网。二、===================androidWIFI框架=======================---------------------------------------------------------------------------------------------------三、Android平台Wifi编译前基本代码路径及文件名(根文件系统的源码下)1、Wifisetting部分(Java应用层)位于packages/apps/Settings/src/com/android/settings/wifi/WifiSettings.java&WifiEnabler.java2、JAVAFramework部分位于frameworks/base/services/java/com/android/server/WifiService.java&WifiWatchdogService.java位于frameworks/base/wifi/java/android/net/wifi/WifiManager.java&WifiMonitoer.java&WifiStateTracker.java&WifiNative.java3.Wifi的JNI部分位于frameworks/base/core/jni/android_net_wifi_Wifi.cpp4.Wifi的HAL层代码(wpa_supplicant适配器层)位于hardware/libhardware_legary/wifi/wifi.c5.Wpa_supplicant程序的源码部分(tools)位于external/wpa_supplicant_6/external/wpa_supplicant/生成库libwpa_client.so和守护进程wpa_supplicant6.kernel(wifi驱动*.ko)位于net/wirelessdrivers/wlan_sd8688arch/arm/mach-pxa/wlan_pm.c四、每一层编译后的所在位置Java应用层--Settings,WifiSwitcher等应用--/system/app/JavaFramework层--/system/framework/services.jarJNI层--/system/framework/framework.jarwpa_supplicant适配器层--/system/lib/libhardware_legacy.sowpa_supplicant程序--/system/bin/wpa_supplicant/system/lib/libwpa_client.soKernel层--kernelnetworkdrivers=====================androidWIFI框架end====================================Wifi网卡状态1.WIFI_STATE_DISABLED:WIFI网卡不可用2.WIFI_STATE_DISABLING:WIFI正在关闭3.WIFI_STATE_ENABLED:WIFI网卡可用4.WIFI_STATE_ENABLING:WIFI网卡正在打开5.WIFI_STATE_UNKNOWN:未知网卡状态Rootfs中关于wpa_supplicant的配置1)/device/amlogic/f08refe1/BoardConfig.mk//wpa_supplicant版本,driverWPA_SUPPLICANT_VERSION:=VER_0_6_XBOARD_WPA_SUPPLICANT_DRIVER:=WEXT2)root/init.rc//wpa_supplicantservicesetpropwifi.interfacewlan0servicewpa_supplicant/system/bin/wpa_supplicant-Dwext-iwlan0-d-c/data/misc/wifi/wpa_supplicant.confsocketwpa_wlan0dgram0666wifiwifi3)/system/etc/wifi/wpa_supplicant.conf//configforwpa_supplicantserviceupdate_config=1ctrl_interface=wlan0eapol_version=1ap_scan=1fast_reauth=1---------------------android-wifi原理1.Wifi模块框图:2.Wifi工作步骤:a.wifi启动b.扫描c.显示扫描的APd.配置连接APe.获取IP地址f.正常上网3.模块细解:【WifiService】由SystemServer启动的时候生成的ConnecttivityService创建,负责启动关闭wpa_supplicant,启动和关闭WifiMonitor线程,把命令下发给wpa_supplicant以及跟新WIFI的状态WifiMonitor负责从wpa_supplicant接收事件通知【Wpa_supplicant】执行过程1、读取配置文件2、初始化配置参数,驱动函数3、让驱动scan当前所有的bssid4、检查扫描的参数是否和用户设置的想否5、如果相符,通知驱动进行权限认证操作6、连上AP4.Wifi模块代码:WifiApplication代码packages/apps/Settings/src/com/android/settings/wifiWifiFrameworkframeworks/base/wifi/java/android/net/wififrameworks/base/services/java/com/android/serverWifiJNIframeworks/base/core/jni/android_net_wifi_Wifi.cppWifitoolexternal/wpa_supplicantWifikernelnet/wirelessdrivers/wlan_sd8688arch/arm/mach-pxa/wlan_pm.cWifiHardwarehardware/libhardware_legacy/wifi/wifi.c5.WIFI的基本运行单元流程:【休眠设置】由于WIFI模块是用电大户,所有为了省电,android的WIFI加了一个休眠策略,可以设置永远不断开,充电时不断开和锁屏时断开。要测试休眠设置是否有效,可以在路由器上PING手机的IP,PING通就是连接状态。OPAL手机的休眠策略属于完全失效,现在的情况是无论选哪个都会一直保持连接,锁屏后15分钟再休眠。【设置静态IP】Android系统里对IP设置的输入限制很有问题,我一直认为这是弱智的限制。正常IP的范围在0-255之间,android对IP输入的限制是整数0到整数255之间,也就是说0000.000200.001.001这样一个IP都能合法输入。【初始化】1在SystemServer启动的时候,会生成一个ConnectivityService的实例2ConnectivityService的构造函数会创建WifiService3WifiStateTracker会创建WifiMonitor接收来自底层的事件,WifiService和WifiMonitor是整个模块的核心。WifiService负责启动关闭wpa_supplicant、启动关闭WifiMonitor监视线程和把命令下发给wpa_supplicant,而WifiMonitor则负责从wpa_supplicant接收事件通知。【连接AP】1WirelessSettings在初始化的时候配置了由WifiEnabler来处理Wifi按钮2当用户按下Wifi按钮后,Android会调用WifiEnabler的onPreferenceChange,再由WifiEnabler调用WifiManager的setWifiEnabled接口函数,通过AIDL,实际调用的是WifiService的setWifiEnabled函数,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扫描的入口函数是WifiService的startScan,它其实也就是往wpa_supplicant发送SCAN命令。2当wpa_supplicant处理完SCAN命令后,它会向控制通道发送事件通知扫描完成,从而wifi_wait_for_event函数会接收到该事件,由此WifiMonitor中的MonitorThread会被执行来出来这个事件。3WifiStateTracker则接着广播发送SCAN_RESULTS_AVAILABLE_ACTION这个Intent。4WifiLayer注册了接收SCAN_RESULTS_AVAILABLE_ACTION这个Intent,所以它的相关处理函数handleScanResultsAvailable会被调用,在该函数中,先会去拿到SCAN的结果(最终是往wpa_supplicant发送SCAN_RESULT命令并读取返回值来实现的),ListScanResultlist=mWifiManager.getScanResults();对每一个扫描返回的AP,WifiLayer会调用WifiSettings的onAccessPointSetChanged函数,从而最终把该AP加到GUI显示列表中。【配置AP参数】当用户在WifiSettings界面上选择了一个AP后,会显示配置AP参数的一个对话框。showAccessPointDialog(state,AccessPointDialog.MODE_INFO);【连接】当用户在AcessPointDialog中选择好加密方式和输入密钥之后,再点击连接按钮,Android就会去连接这个AP。1WifiLayer会先检测这个AP是不是之前被配置过,这个是通过向wpa_supplicant发送LIST_NETWORK命令并且比较返回值来实现的,//NeedWifiConfigurationfortheAPWifiConfigurationconfig=findConfiguredNetwork(state);如果wpa_suppl
本文标题:wifi框架简介
链接地址:https://www.777doc.com/doc-3544162 .html