android 4.0 wifi框架解析
android getnetworkcapabilities原理 -回复
android getnetworkcapabilities原理-回复Android中的getNetworkCapabilities是一个用于检查设备网络连接能力的方法。
它返回一个NetworkCapabilities对象,该对象提供了关于设备当前网络连接的详细信息,如网络类型、传输协议支持、连接速度等。
本文将一步一步解释getNetworkCapabilities方法的原理及其在Android中的应用。
一、什么是NetworkCapabilities?NetworkCapabilities是一个用于描述设备网络连接能力的类。
它包含了一系列的设置和属性,用于指示当前网络连接的各种能力和限制,如是否支持传输协议、是否支持多个连接等。
利用NetworkCapabilities,开发者可以根据设备当前的网络状态来做出合适的网络操作。
二、getNetworkCapabilities方法的作用getNetworkCapabilities方法是Android系统提供的一个用于查询设备网络连接能力的方法。
通过该方法,开发者可以获取当前设备网络连接的详细信息,以便进行相应的网络操作。
三、使用示例以下是一个使用getNetworkCapabilities方法的示例代码:javaConnectivityManager connectivityManager =(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);Network network = connectivityManager.getActiveNetwork(); NetworkCapabilities capabilities =connectivityManager.getNetworkCapabilities(network);首先,我们需要获取ConnectivityManager的实例,这个类是Android 系统中用于管理网络连接的关键类。
Android应用的无线网络测试指南
Android应用的无线网络测试指南无线网络已经成为我们生活中不可或缺的一部分,而Android应用的无线网络功能更是日益重要。
为了确保应用在各种网络环境下都能正常运行,进行系统化的无线网络测试是至关重要的。
本文将为您提供一份Android应用的无线网络测试指南,帮助您对应用的无线网络功能进行全面的测试和优化。
一、测试环境的搭建在进行无线网络测试之前,首先需要搭建适合的测试环境。
以下是一些测试环境的准备事项:1. 路由器:选择一款性能稳定、信号覆盖范围广的路由器。
设置路由器的无线网络名称和密码,确保手机能够正常连接并稳定传输数据。
2. 移动设备:准备多款不同型号的Android手机和平板电脑,覆盖不同的操作系统版本和屏幕分辨率。
3. 网络质量模拟工具:使用网络模拟器或者其他网络工具,模拟不同网络情况,包括网络延迟、丢包率、带宽等参数。
二、无线网络功能的测试点针对Android应用的无线网络功能,我们需要测试一些关键点以确保其正常工作。
以下是一些常见的测试点:1. 连接稳定性:测试应用在不同网络环境下的连接稳定性,包括WiFi和移动数据网络。
检查应用在弱信号环境下的表现,并观察是否出现连接中断、重连等问题。
2. 响应速度:测量应用在不同网络环境下的响应速度,包括数据请求和接收的时间。
比较在不同网络条件下的响应速度差异,发现潜在的性能瓶颈。
3. 数据传输质量:测试应用在网络传输过程中是否出现数据丢失、错误或者损坏的情况。
检查应用对数据包丢失或错误的处理能力,确保数据的完整性和准确性。
4. 节省流量:测试应用在使用移动数据网络时的流量消耗情况,比较应用在不同网络条件下的流量差异。
优化应用的流量使用,减少用户的流量费用。
5. 多任务处理:测试应用在同时处理多个网络请求时的性能表现,如并发下载、上传、推送通知等情况。
确保应用能够正常处理多个网络任务而不出现卡顿或崩溃。
三、测试工具的选择为了能够准确测试Android应用的无线网络功能,我们需要借助适当的测试工具。
Android之wifi分析(上)
NETWORK_STATE_CHANGED_ACTION EVENT_NETWORK_STATE_CHANGED EVENT_SUPPLICANT_STATE_CHANGED
WifiStateTracker
WifiService
notify WifiMonitor
WifiNative JNI
android_wifi_net_Wifi
第二步、启动supplicant服务
WifiService 负责启动关闭 wpa_supplicant、启动关闭 WifiMonitor 监视线程和把命令下发
Page 2
给 wpa_supplicant 第三步、启动MonitorThread线程,以下代码就是启动此线程
Sheet1
开始运行线程后先请求连接Suppliant,通过调用WifiStateTracker函数connectToSupplicant然后通过wifi_mtk.c的wifi_connect_to_supplicant 接着向wpa_ctrl的wpa_ctrl_open,然后通过CreateFile函数向wpa_supplicant读取数据。 连接成功后会发送EVENT_SUPPLICANT_CONNECTION消息启动获取DHCP地址线程阻塞调用(当连接上AP的时候,该线程会被执行起来 获取IP地址),并记录自己的MAC地址(因为MAC地址不会改变 ,所以请求一次即可) 接着开启一个死循环处理wpa_supplicant发送的事件。
Page 3
再到WifiStateTracker.java文件里scan
Sheet1
最后通过JNI调用到android_net_wifi_Wifi.cpp
所有的的消息下发来后都通过wifi_common.c文件里的send_command函数发给守护进程supplicant 函数wpa_ctrl_request()文件wpa_ctrl.c里就是负责把这些command发送到supplicant去,由supplicant负责去和wifi的driver打交道完成相应功能设置。 当 wpa_supplicant 处理完 SCAN 命令后,它会向控制通道发送事件通知扫描完成,从而wifi_wait_for_event 函数会接收到该事件 由此 WifiMonitor 中的 MonitorThread 会被执行来处理接扫描结果事件。此线程通过WifiStateTracker 广播 SCAN_RESULTS_AVAILABLE_ACTION这个Intent。 而WifiSettings注册了接收此Intent,最终由其相应函数updateAccessPoints将AP列表,以GUI的形式列出来。 WifiMonitor.java
android中wifi原理详解(转)
二:Wifi模块的初始化::在 SystemServer 启动的时候,会生成一个ConnectivityService 的实例,try {Log.i(TAG, "Starting Connectivity Service.");ServiceManager.addService(Context.CONNECTIVITY_SERVICE, newConnectivityService(context));} catch (Throwable e) {Log.e(TAG, "Failure starting Connectivity Service", e);}ConnectivityService 的构造函数会创建WifiService,if (DBG) Log.v(TAG, "Starting Wifi Service.");mWifiStateTracker = new WifiStateTracker(context, handler);WifiService wifiService = new WifiService(context, mWifiStateTracker); ServiceManager.addService(Context.WIFI_SERVICE, wifiService);WifiStateTracker 会创建WifiMonitor 接收来自底层的事件,WifiService 和WifiMonitor 是整个模块的核心。
WifiService 负责启动关闭wpa_supplicant、启动关闭WifiMonitor 监视线程和把命令下发给wpa_supplicant,而WifiMonitor 则负责从wpa_supplicant 接收事件通知。
具体流程图如下:第三部分:Wifi模块的启动(使能)WirelessSettings 在初始化的时候配置了由WifiEnabler 来处理Wifi 按钮,private void initToggles() {mWifiEnabler = new WifiEnabler(this,(WifiManager) getSystemService(WIFI_SERVICE),(CheckBoxPreference) findPreference(KEY_TOGGLE_WIFI));当用户按下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 中的监视线程。
android wifi详细
Contents1. Wifi扫盲 (2)2. Android Wifi框架的结构图 (3)3. wpa_supplient (3)4. Netd (5)5. FrameWork层架构 (5)6. 情景分析 (5)6.1. 情景1 (5)6.2. 情景2 (8)6.3. 情景3 (8)7.Ad hoc的支持 (10)8.wifi direct (12)9.Soft ap支持 (12)10.Wifi Tethering支持 (15)b Tethering支持 (15)12.Reverse usb Tethering (16)13.Ethernet Tethering (17)14.需要改动的地方 (17)15.测试 (17)16.调试中遇到的问题 (18)1. Wifi扫盲Access point:也叫hotspot(热点),家里的无线路由就是ap。
SoftAp:软ap,用无线网卡模拟ap的功能。
Wifi网络有两种模式:∙Infrastructure mode, in which wireless clients are connected to an access point. This is generally the default mode for 802.11b cards.∙Ad hoc mode, in which clients are connected to one another without any access point.请参考/contents/wifi/wifimodes.php3我们既可以通过Ad hoc也可以通过SoftAp方式来实现共享网络(例如手机可以通过笔记本访问internet),但是原理不同。
这里只是简单的概括,详细的解释请google或百度。
2. Android Wifi框架的结构图上图只是wifi工作于station模式时的图,当工作于soft ap模式时最基本的不同是不通过wpa_supplicant而是Framework层直接通过netd daemon来控制驱动。
原生安卓4.0 wifi连接设置方法
原生安卓4.0 wifi连接设置方法今天刷了原生的安卓4.0在用wlan 静态IP连接设置时那个”连接“按钮是灰色的无法连接保存,在网上也查了又的网友说是不支持!后找到原因注意:其实就是每一项都要自己输入一遍,不然的话,连接按钮会变成灰色,无法点击。
关于Android 4.0 系统下如何设置Wlan静态IP的设置方法近日,有部分机友不知道如何在android 4.0系统下设置wlan的静态IP地址,其实不是android4.0 的问题,只是设置的方法,下面就教大家一下如何在android 4.0 系统下设置wlan的静态ip地址。
1、打开WIFI,2、点击你需要连接的WIFI接入点名称。
3、输入密码以后,把输入法隐藏一下就会发现“显示密码”和“显示高级选项”。
4、勾选--显示高级选项。
5、下拉一下会出现“IP设置”。
6、将选项中的DHCP改为--静态。
7、改为静态以后,下面继续会出现几项,填写方式如下:IP地址:你手机的IP地址,一般是192.168.1.XXX(XXX可以在1-255之间,不能跟路由下的任一设备设置为一样的IP地址)。
这里需要强调一点,默认ip地址就显示为192.168.1.XXX,但是是灰色的,即使与你想要设置的相同,也要自己需要重新输入一遍。
)网关:你路由器的IP地址(大多数的路由默认IP会是192.168.1.1)。
默认,自己重新输入一次,变成黑色。
网络前缀长度:修改与默认相同即可。
域名1:WIFI接入点所使用的IP地址,一般是192.168.1.1或者192.168.0.1,具体要参考路由上的设置。
域名2:跟域名1一样就可以了。
转自深度安卓论坛:/thread-2189693-1-1.html。
Android-86 4.0连接wifi方法
Android-86 4.0连接wifi方法如果你想体验Google手机操作系统Android的神奇魅力,但不愿意花几千元钱购买昂贵的Android手机,那Android的pc移植版本可能是不错的一个选择Android X86-PC上的Android。
相信很多热爱Android-86的同学们都在为虚拟机安装Android-86联网而苦恼,本人也是,经过几天的摸索用过坛网们的各种方法都不是很满意,那么最好的方案是什么呢?那当然是Android-86的标准方案(wifi)。
不罗嗦了现在步入正题:一、准备工作:1、电脑一台,系统貌似很多都可以(本人测过winxp,win7,win8)2、USB无线网卡一个(本人用的是腾达W311M,其它的没测过,本人太穷就这一个宝贝)注:需有无线网络3、VMware Workstation虚拟机软件(为什么要用这个呢,因为其它加载USB无线网卡老出错)附下载地址(/viewthread-1120862-1-1.html)4、Android-86(需要什么版本的自已选)官方下载地址:(/p/android-x86/downloads/list?can=1&q=&colspec=Filename+Summary +Uploaded+ReleaseDate+Size+DownloadCount)二、在电脑上安装VMware Workstation虚拟机软件(不会装的自已问度娘)三、在VMware Workstation虚拟机软件里安装Android-86(不会装的自已问度娘)四、本贴的主题,连接wife1、将USB无线网卡插入电脑并装好驱动2、启动VMware Workstation虚拟机软件,点菜单栏的虚拟机/可移动设备/Ralink 802.11n WLAN(注:每种无线网卡的名字不同请根据自已的选)3、在虚拟机软件里启动安装好的Android-86(打开wifi,方法和手机开wifi一样)亲,连接成功了吗?激动吧,还没成功的话多试几次,还不成功的话或许是你的无线网卡有问题,因为方法是可行的。
Android平台网络连接架构分析-connectivityservice框架流程word版本
Android平台网络连接架构解析2016-09李国辉ligh6@一概述截止到最新的7.0版本,android网络连接管理系统一直都由四个service组成,分别是ConnectivityService,NetworkPolicyManagerService,NetworkManagementService,NetworkStatsService共同配合完成网络连接和管理功能,其中核心服务是ConnectivityService,而本文也会着重介绍该service的架构,四个service中NetworkPolicyManagerService通过NetworkPolicyManager对外提供SDK接口,而ConnectivityService通过ConnectivityManager对外提供SDK接口,整体的框架图如下:1. ConnectivityService提供数据连接管理服务,负责管理Mobile,WIFI,BT,Ethernet几大类网络连接,同时提供VPN和Tethering服务。
workPolicyManagerService提供网络策略管理服务,NetworkPolicyManagerService维护网络使用策略,策略可以从一个策略文件读取(策略文件保存在系统目录下的netpolicy.xml 文件中)。
也可以通过NetworkPolicyManager对外提供的设置策略接口(setNetworkPolicies及setUidPolicy)进行设置,NetworkPolicyManagerService能够根据这些设置或从策略文件中读取的策略控制网络连接。
另外NetworkPolicyManagerService还具有动态调节网络连接限额及动态设置网络连接的功能,动态调节网络连接限额机制是通过INetworkStatsService访问NetworkStatsService服务获得上面设置或读取的策略匹配的网络连接类型的传输统计信息(NetworkPolicyManagerService采用NetworkTemplate进行网络连接类型的匹配),并根据这些信息生成有效的规则,并提交给ConnectivityService服务,并调用NetworkManagementService 的setInterfaceQuota函数对网络连接的带宽限额。
android四层框架
Android 4层框架标签:it(一)Android系统框架详解Android采用分层的架构,分为四层,从高层到底层分为应用程序层,应用程序框架层,系统运行库层和Linux核心层1,Android应用程序层应用是用Java语言编写的运行在虚拟机上的程序,即图中最上层的蓝色部分,其实,Google 最开始时就在Android系统中捆绑了一些核心应用,比如e-mail客户端、SMS短消息程序、日历、地图、浏览器、联系人管理程序,等等。
2,应用程序框架层这一层即是编写Google发布的核心应用时所使用的API框架,开发人员同样可以使用这些框架来开发自己的应用,这样便简化了程序开发的架构设计,但是必须遵守其框架的开发原则,组件如下:丰富而又可扩展的视图(Views):可以用来构建应用程序,它包括列表(lists)、网格(grids)、文本框(text boxes)、按钮(buttons),甚至可嵌入的Web浏览器。
内容提供器(Content Providers):它可以让一个应用访问另一个应用的数据(如联系人数据库),或共享它们自己的数据资源管理器(Resource Manager):提供非代码资源的访问,如本地字符串、图形、和布局文件(layout files)。
通知管理器(Notification Manager):应用可以在状态栏中显示自定义的提示信息。
活动管理器(Activity Manager):用来管理应用程序生命周期并提供常用的导航退回功能。
窗口管理器(Window Manager):管理所有的窗口程序。
包管理器(Package Manager):Android系统内的程序管理在Android SDK中内置了一些对象,其中最重要的组件要属Activities、Intents、Services 以及Content Providers四个组件。
Activities活动一个活动就是一个用户界面。
Android-WIFI移植分析—曹颖
11
配置路径和权限
A)配置init.rc文件修改out/target/product/fs100/root/init.rc, 让wifi用户拥有相关 的权限, 在 #give system access to wpa_supplicant.conf for backup and restore后面增加:
3
SDIO WIFI部分
项目负责人:曹颖 项目目标:实现WIFI上网功能、并对WIFI休眠进行改善。 项目开发流程:
硬件分析:对Marvell8686 SDIO WIFI模块硬件工作特性了解和分析 工作原理分析:对Marvel8686 SDIO WIFI工作原理进行分析 Android WIFI框架分析:对Android WIFI系统框架分析 进行源码分析、编写、修改及编译 调试、并完善 2011-9-29至2011-10-7:硬件分析、了解驱动框架 2011-10-8至2011-10-16:Android SDIO WIFI移植及工作原理分析 2011-10-17至2011-10-23:Android WIFI框架分析 2011-10-24至2011-10-30:进行源码分析 2011-10-31至2011-11-5:准备答辩就业
7
配置内核支持SDIO WIF
make
menuconfig
[*] Networking support ---> [*] Wireless ---> --- Wireless <*> Improved wireless configuration API [*] cfg80211 regulatory debugging [*] nl80211 new netlink interface support -*- Common routines for IEEE802.11 drivers Device Drivers ---> [*] Network device support ---> Wireless LAN ---> <*> Marvell 8xxx Libertas WLAN driver support <M> Marvell Libertas 8385 and 8686 SDIO 802.11b/g cards
wifi框架简介
一、wifi 组建原理:WIFI就是一种无线联网的技术,以前通过网线连接电脑,而现在则是通过无线电波来连网;常见的就是一个无线路由器,那么在这个无线路由器的电波覆盖的有效范围都可以采用WIFI连接方式进行联网,如果无线路由器连接了一条ADSL线路或者别的上网线路,则又被称为“热点”。
一般架设无线网络的基本配备就是无线网卡及一个AP(无线接入点)。
有了AP,就像一般有线网络的Hub一般,无线工作站可以快速且轻易地与网络相连。
特别是对于宽带的使用,WiFi更显优势,有线宽带网络(ADSL、小区LAN等)到户后,连接到一个AP,然后在电脑中安装一块无线网卡即可上网。
普通的家庭有一个AP已经足够,甚至用户的邻里得到授权后,则无需增加端口,也能以共享的方式上网。
二、=================== android WIFI 框架=======================---------------------------------------------------------------------------------------------------三、Android平台Wifi 编译前基本代码路径及文件名(根文件系统的源码下)1、Wifi setting 部分(Java应用层)位于packages/apps/Settings/src/com/android/settings/wifi/WifiSettings.java&WifiEnabler.java2、JAVA Framework部分位于frameworks/base/services/java/com/android/server/WifiService.jav a&Wifi Watchdog Service.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/wireless drivers/wlan_sd8688 arch/arm/mach-pxa/wlan_pm.c四、每一层编译后的所在位置Java应用层-- Settings, Wifi Switcher等应用--> /system/app/Java Framework层-->/system/framework/services.jarJNI层--> /system/framework/framework.jarwpa_supplicant 适配器层--> /system/lib/libhardware_legacy.sowpa_supplicant 程序--> /system/bin/wpa_supplicant/system/lib/libwpa_client.soKernel层-- kernel network drivers===================== android WIFI 框架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版本,driver WPA_SUPPLICANT_VERSION := VER_0_6_XBOARD_WPA_SUPPLICANT_DRIVER := WEXT2) root/init.rc //wpa_supplicant servicesetprop wifi.interface wlan0service wpa_supplicant /system/bin/wpa_supplicant -Dwext -iwlan0 -d -c/data/misc/wifi/wpa_supplicant.confsocket wpa_wlan0 dgram 0666 wifi wifi3) /system/etc/wifi/wpa_supplicant.conf//config for wpa_supplicant service update_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当前所有的b ssid4、检查扫描的参数是否和用户设置的想否5、如果相符,通知驱动进行权限认证操作6、连上AP4.Wifi模块代码:Wifi Application代码packages/apps/Settings/src/com/android/settings/wifiWifi Frameworkframeworks/base/wifi/java/android/net/wififrameworks/base/services/java/com/android/serverWifi JNIframeworks/base/core/jni/android_net_wifi_Wifi.cppWifi toolexternal/wpa_supplicantWifi kernelnet/wireless drivers/wlan_sd8688 arch/arm/mach-pxa/wlan_pm.cWifi Hardwarehardware/libhardware_legacy/wifi/wifi.c5.WIFI的基本运行单元流程:【休眠设置】由于WIFI模块是用电大户,所有为了省电,android的WIFI加了一个休眠策略,可以设置永远不断开,充电时不断开和锁屏时断开。
Android开发入门_WiFi_代码
Android开发入门——WIFI网络操作一.什么是WIFIWIFI 就是一种无线联网技术,常见的一个就是无线路由器。
那么在这个无线路由器的电波覆盖的有效范围内都可以采用WIFI 连接的方式进行联网。
如果无线路由器连接了一个ADLS线路或者别的联网线路,则又被称为“热点”。
流程:初始化---》使能wifi-→查找ap-→配置ap参数-→连接-→配置ip地址1、wifi网卡有以下几种状态:2、要对wifi进行操作,首先要在AndroidMenifest.xml中取得权限的,如下:<!-- 以下是使用wifi访问网络所需要的权限--><uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"></uses-permission> //修改网络状态的权限<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission> //修改wifi状态的权限<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> //访问网络权限<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> //访问wifi权限3、对wifi网卡进行操作需要通过WifiManger对象来进行,获取该对象的方法如下:WifiManger wifiManger =(WifiManger)Context.getSystemService(Service.WIFI_SERVICE);打开wifi网卡Wifimanger.setWifiEnabled(true);关闭wifi网卡wifiManger.setWifiEnablee(false);获取网卡的当前的状态wifiManger.getWifiState();========================================主要代码如下=============================================JAVA CODE :No Title Code1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 package mars .wifi ;import android.app.Activity ;import android.content.Context ;import .wifi.WifiManager ;import android.os.Bundle ;import android.view.View ;import android.view.View.OnClickListener ;import android.widget.Button ;import android.widget.Toast ;public class WifiActivity extends Activity {/** Called when the activity is first created. */private Button startButton = null ;private Button stopButton = null ;private Button checkButton = null ;private WifiManager wifiManager = null ;@Overridepublic void onCreate (Bundle savedInstanceState ) {super .onCreate (savedInstanceState );setContentView (R .layout .main );startButton = (Button )findViewById (R .id .startWifi );stopButton = (Button )findViewById (R .id .stopWifi );checkButton = (Button )findViewById (R .id .checkWifi );startButton .setOnClickListener (new StartWifiListener ()); stopButton .setOnClickListener (new StopWifiListener ());checkButton .setOnClickListener (new CheckWifiListener ()); }class StartWifiListener implements OnClickListener {@Overridepublic void onClick (View v ) {wifiManager =34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 (WifiManager )WifiActivity .this .getSystemService (Context .WIFI_SERVICE ); wifiManager .setWifiEnabled (true );System .out .println ("wifi state --->" + wifiManager .getWifiState ()); Toast .makeText (WifiActivity .this , "当前Wifi 网卡状态为" +wifiManager .getWifiState (), Toast .LENGTH_SHORT ).show ();}}class StopWifiListener implements OnClickListener {@Overridepublic void onClick (View arg0) {// TODO Auto-generated method stubwifiManager =(WifiManager )WifiActivity .this .getSystemService (Context .WIFI_SERVICE ); wifiManager .setWifiEnabled (false );System .out .println ("wifi state --->" + wifiManager .getWifiState ()); Toast .makeText (WifiActivity .this , "当前Wifi 网卡状态为" +wifiManager .getWifiState (), Toast .LENGTH_SHORT ).show ();}}class CheckWifiListener implements OnClickListener {@Overridepublic void onClick (View v ) {wifiManager =(WifiManager )WifiActivity .this .getSystemService (Context .WIFI_SERVICE ); System .out .println ("wifi state --->" + wifiManager .getWifiState ()); Toast .makeText (WifiActivity .this , "当前Wifi 网卡状态为" +wifiManager .getWifiState (), Toast .LENGTH_SHORT ).show ();}}}1. StringBuffer sb = new StringBuffer();2. sb.append("Wifi 信息\n");3. sb.append("MAC 地址:" + wifiInfo.getMacAddress() + "\n");4. sb.append("接入点的BSSID :" + wifiInfo.getBSSID() + "\n");5. sb.append("IP 地址(int ):" + wifiInfo.getIpAddress() + "\n");6. sb.append("IP 地址(Hex):" + Integer .toHexString(wifiInfo.getIpAddress()) + "\n"); sb.append("IP地址:" + ipIntToString(wifiInfo.getIpAddress()) + "\n");7.sb.append("网络ID:" + wifiInfo.getNetworkId() + "\n");WifiInfo.setText(sb.toString());61.143.168.192。
android wifi原理
android wifi原理在Android设备中,Wifi技术被广泛应用于无线网络连接。
Wifi是一种基于无线局域网(WLAN)技术,通过无线信号进行数据传输。
下面将介绍Android Wifi的工作原理。
Wifi连接分为两个主要的角色:Wifi客户端和Wifi接入点(AP)。
Wifi客户端可以是Android手机、平板电脑或其他支持Wifi连接的设备。
Wifi接入点通常是无线路由器。
当启动Wifi功能时,Android设备将会搜索附近的Wifi网络。
这个搜索过程使用的是Wifi扫描机制,设备会广播请求附近的Wifi接入点响应,从而获取可用网络列表。
通过比较网络信号强度和其他网络参数,设备将选择一个最佳的网络连接。
通过用户选择列表中的网络,设备将尝试和所选的Wifi接入点建立连接。
连接过程可以通过以下步骤完成:1. 设备将向Wifi接入点发送连接请求,并传递设备的唯一身份标识符(即MAC地址)以进行身份验证。
2. Wifi接入点接收到连接请求后,会验证设备的身份。
这通常涉及到密码的验证,以确保只有具有正确凭据的设备可以连接到网络。
3. 如果设备通过了身份验证,Wifi接入点将向设备分配一个IP地址。
通过这个IP地址,设备将能够在Wifi网络上进行数据传输和通信。
4. 连接建立后,设备和Wifi接入点之间会建立一个稳定的通信链路,允许设备在网络上发送和接收数据。
一旦Wifi连接建立,Android设备将自动管理Wifi连接状态。
它会尝试保持和所选Wifi接入点的连接,直到另一个更好的网络出现或用户手动断开连接。
总之,Android Wifi的工作原理涉及到设备的Wifi扫描、连接请求、身份验证和IP地址分配等步骤。
通过这些步骤,Android设备能够和所选的Wifi接入点建立连接,并在无线网络上进行数据传输和通信。
android wifi框架简介
一、wifi 组建原理:WIFI就是一种无线联网的技术,以前通过网线连接电脑,而现在则是通过无线电波来连网;常见的就是一个无线路由器,那么在这个无线路由器的电波覆盖的有效范围都可以采用WIFI连接方式进行联网,如果无线路由器连接了一条ADSL线路或者别的上网线路,则又被称为“热点”。
一般架设无线网络的基本配备就是无线网卡及一个AP(无线接入点)。
有了AP,就像一般有线网络的Hub一般,无线工作站可以快速且轻易地与网络相连。
特别是对于宽带的使用,WiFi更显优势,有线宽带网络(ADSL、小区LAN等)到户后,连接到一个AP,然后在电脑中安装一块无线网卡即可上网。
普通的家庭有一个AP已经足够,甚至用户的邻里得到授权后,则无需增加端口,也能以共享的方式上网。
二、=================== android WIFI 框架=======================---------------------------------------------------------------------------------------------------三、Android平台Wifi 编译前基本代码路径及文件名(根文件系统的源码下)1、Wifi setting 部分(Java应用层)位于packages/apps/Settings/src/com/android/settings/wifi/WifiSettings.java&WifiEnabler.java2、JAVA Framework部分位于frameworks/base/services/java/com/android/server/WifiService.jav a&Wifi Watchdog Service.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/wireless drivers/wlan_sd8688 arch/arm/mach-pxa/wlan_pm.c 四、每一层编译后的所在位置Java应用层-- Settings, Wifi Switcher等应用--> /system/app/Java Framework层-->/system/framework/services.jarJNI层--> /system/framework/framework.jarwpa_supplicant 适配器层--> /system/lib/libhardware_legacy.sowpa_supplicant 程序--> /system/bin/wpa_supplicant/system/lib/libwpa_client.soKernel层-- kernel network drivers===================== android WIFI 框架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版本,driver WPA_SUPPLICANT_VERSION := VER_0_6_XBOARD_WPA_SUPPLICANT_DRIVER := WEXT2) root/init.rc //wpa_supplicant servicesetprop wifi.interface wlan0service wpa_supplicant /system/bin/wpa_supplicant -Dwext -iwlan0 -d -c/data/misc/wifi/wpa_supplicant.confsocket wpa_wlan0 dgram 0666 wifi wifi3) /system/etc/wifi/wpa_supplicant.conf//config for wpa_supplicant service update_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模块代码:Wifi Application代码packages/apps/Settings/src/com/android/settings/wifiWifi Frameworkframeworks/base/wifi/java/android/net/wififrameworks/base/services/java/com/android/serverWifi JNIframeworks/base/core/jni/android_net_wifi_Wifi.cppWifi toolexternal/wpa_supplicantWifi kernelnet/wireless drivers/wlan_sd8688 arch/arm/mach-pxa/wlan_pm.cWifi Hardwarehardware/libhardware_legacy/wifi/wifi.c5.WIFI的基本运行单元流程:【休眠设置】由于WIFI模块是用电大户,所有为了省电,android的WIFI加了一个休眠策略,可以设置永远不断开,充电时不断开和锁屏时断开。
wifi架构
wifi的层次结构wifi分为以下几个层次:1.wifi setting,UI界面2.wifi framework3.wifi 硬件抽象层4.wifi 服务层5.wifi驱动层wifi settingwifi的ui界面主要在如下的目录中:packages\apps\Settings\src\com\android\settings\wifi.∙WifiSettings.java负责显示wifi的设置界面。
∙WifiEnabler.java主要是wifi的开关逻辑∙WifiDialog.java负责wifi的对话框显示∙AdvancedSettings.java负责wifi的高级选项的显示∙AccessPoint.java表示一个ap所有属性的一个类∙WifiInfo.java主要是wifi的一些配置信息,列如鉴权方式,密码,ssid 等wifi界面的编译输出是在settings.apk中。
为什么要说每层的编译输出结果呢,因为在调试中,你可能只是修改了某一层的某几个文件而已,这时候,你没必要重新编译整个文件系统,而只要编译这一层对应的输出,然后通过adb或其他的途径替换原有的包,再重起目标板,就可以生效了。
wifi frameworkwifi的framework主要有如下几个类:∙framework/base/wifi/java/android/net/wifi/wifiManager.java∙framework/base/services/java/com/android/wifiService.java∙framework/base/wifi/java/android/net/wifi/wifiMonitor.java∙framework/base/core/jni/android_net_wifi_wifi.cpp他们的编译输出主要有两个类:一个framework.jar,另一个是services.jar,由于这一层的修改要编译整个framework 或services,所以编译时间长,调试花费时间长。
Android settings之Wifi学习
Android wifi模块学习wifi相关的文件位置:WIFI Settings应用程序位于packages/apps/Settings/src/com/android/settings/wifi/JAVA部分:frameworks/base/services/java/com/android/server/frameworks/base/wifi/java/android/net/wifi/JNI部分:frameworks/base/core/jni/android_net_wifi_Wifi.cppwifi管理库。
hardware/libhardware_legary/wifi/wifi用户空间的程序和库:external/wpa_supplicant/生成库libwpaclient.so和守护进程wpa_supplicant。
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:未知网卡状态WIFI 访问网络需要的权限<uses-permissionandroid:name=“android.permission.CHANGE_NETWORK_STATE”> </uses-permission>网络状态改变的权限<uses-permissionandroid:name=“android.permission.CHANGE_WIFI_STATE”></uses-permission>修改WIFI状态的权限<uses-permissionandroid:name=“android.permission.ACCESS_NETWORK_STATE”> </uses-permission>访问网络权限<uses-permissionandroid:name=“android.permission.ACCESS_WIFI_STATE”></uses-permission>访问WIFI权限Android提供了frameworks/base/wifi/java/android/net/wifi包供我们操作WiFi。
Android WiFi工作原理
Android Wi-Fi工作原理刘洋第一部分Android概述在介绍Wi-Fi之前,先简要介绍一下Android系统,主要分析一下Android的按层实现的原理。
Android层次结构是整个Android体系中所有应用实现的基础框架,而Android源代码结构则与Wi-Fi的实现细节有关。
1.1 基础知识Android是一款当前最为流行的手机操作系统,它本身的开放性加上Google 公司的大力推广,使其获得了大量手机生产厂商、科研院校、软件公司以及个人开发者的青睐,它属于一个全开放的平台,因此开发者可以得到整个系统的源代码,并能对其进行修改,修改的结果可以通过互联网上传到Android官方网站,倘若被审核通过,就能加入到Android的源代码中,这绝对是一件令人兴奋的事情。
1.2 Android层次结构Android系统是在Linux系统的基础上,经过了层层封装,最终提供给开发者的是大量的Java API,在这里被叫做Android API,于是,开发者就可以像开发一般的Java程序那样开发Android应用程序,这样的设计不仅降低了开发Android 应用程序的难度,还增加了Android系统的界面友好度。
和一般的操作系统一样,Android也是对硬件进行了多层的封装,使得应用程序的开发者和用户能轻松地操作硬件,完成他们所希望完成的事情。
Android 所针对的硬件就是手机,这里主要指智能手机,这种智能手机与传统的手机相比电话功能被弱化,而更偏向于一台笔记本电脑,因此它的CPU、内存等硬件配置要比传统的手机高。
它需要提供给用户一些电脑所拥有的功能,比如说Wi-Fi上网、鼠标或触屏控制的界面、收发电子邮件、玩大型游戏等,但同时又必须拥有传统手机所支持的电话、摄像头、蓝牙等功,这些挑战都增加了Android的设计难度。
Android从下至上可以分为这样几个层次:(1)Linux内核及驱动层(C实现);(2)本地库(C库和C++库)和Java运行时环境层(主要由C、C++实现);(3)Java框架层(主要由Java实现);(4)Java应用程序层(Java实现)。
Wifi模块—源码分析Wifi热点的开启(AndroidP)
Wifi模块—源码分析Wifi热点的开启(AndroidP)一前言Android使用一个修改版wpa_supplicant作为daemon来控制WIFI,它是一个安全中间件,代码位于external/wpa_supplicant,为各种无线网卡提供统一的安全机制。
当然在这里只是介绍一下wpa_supplicant和 hostapd,研究分析的部分主要还是应用层和java 框架层,有时也会涉及Native层。
wpa_supplicant_8主要有三个子目录:hostapd:当手机进入Soft AP模式时,手机将扮演AP的角色,需要hostapd来提供AP的功能,也就是wifi热点的实现。
wpa_supplicant:Station模式,也叫Managed模式,这是平时最常见的使用wifi连接AP的情况。
src:hostapd和wpa_supplicant中都包含一些通用的数据结构和处理方法,这些内容都放在此src目录中。
二图示调用流程三具体代码流程Android P之后,Wifi模块增加了packages/apps/Settings/src/com/android/settings/wifi/tether/路径,相当于把Wifi热点独立放到了tether文件夹下面,并添加了WifiTetherSettings.java类,对应着Wifi热点的界面,而Android P 之前是没有的,Wifi热点界面之前是对应在TetherSettings的一部分,有些厂商也还是会改到TetherSettings上。
1packages/apps/Settings/src/com/android/settings/wifi/tether/ WifiTetherSettings.java1.@Override2.public void onActivityCreated(Bundle savedInstanceState) {3.super.onActivityCreated(savedInstanceState);4.// Assume we are in a SettingsActivity. This is only safe because we currently use5.// SettingsActivity as base for all preference fragments.6.final SettingsActivity activity = (SettingsActivity) getActivity();7.final SwitchBar switchBar = activity.getSwitchBar();8.mSwitchBarController = new WifiTetherSwitchBarController(activity,9.new SwitchBarController(switchBar));10.getLifecycle().addObserver(mSwitchBarController);11.switchBar.show();12.}初始化mSwitchBarController,这个类含有SwitchBar的实例。
Android路由框架ARouter分析
Android路由框架ARouter分析⼀、路由⽅案原⽣的路由⽅案缺点:显式:直接的类依赖,耦合严重隐式:规则集中式管理,协作困难Manifest扩展性较差跳转过程⽆法控制失败⽆法降级ARouter的优势:使⽤注解,实现了映射关系⾃动注册与分布式路由管理编译期间处理注解,并⽣成映射⽂件,没有使⽤反射,不影响运⾏时性能映射关系按组分类、多级管理,按需初始化灵活的降级策略,每次跳转都会回调跳转结果,避免StartActivity()⼀旦失败将会抛出运营级异常⾃定义拦截器,⾃定义拦截顺序,可以对路由进⾏拦截,⽐如登录判断和埋点处理⽀持依赖注⼊,可单独作为依赖注⼊框架使⽤,从⽽实现跨模块API调⽤⽀持直接解析标准URL进⾏跳转,并⾃动注⼊参数到⽬标页⾯中⽀持获取Fragment⽀持多模块使⽤,⽀持组件化开发…….这么多好处,是时候来了解⼀下ARouter了。
⼆、ARouter框架上图是根据ARouter⼀次基本的路由导航过程,整理的基本框架图,涉及到主要流程,下⾯进⾏详细介绍。
三、路由管理1.注册通过注解,在编译时收集使⽤了注解的类或变量并经过Android Process Tool处理进⾏统⼀管理。
包含三种注解@Autowired,@Interceptor,@Route。
@Route注解定义String path();//路径URL字符串String group() default "";//组名,默认为⼀级路径名;⼀旦被设置,跳转时必须赋值String name() default "undefined";//该路径的名称,⽤于产⽣JavaDocint extras() default Integer.MIN_VALUE;//额外配置的开关信息;譬如某些页⾯是否需要⽹络校验、登录校验等int priority() default -1;//该路径的优先级实现 @Route 注解BlankFragment @Route(path = "/test/fragment")Test1Activity @Route(path = "/test/activity1")该注解主要⽤于描述路由中的路径URL信息,使⽤该注解标注的类将被⾃动添加⾄路由表中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
wifi相关的文件位置:WIFI Settings应用程序位于packages/apps/Settings/src/com/android/settings/wifi/涉及到的文件:WifiSettings.javaframeworks部分:frameworks/base/services/java/com/android/server/frameworks/base/wifi/java/android/net/wifi/涉及到的文件有:SystemServer.javaWifiManager.javaWifiService.javaWifiStateMachine.javaWifinative.javaJNI部分:frameworks/base/core/jni/android_net_wifi_Wifi.cppwifi管理库。
hardware/libhardware_legary/wifi/涉及到的文件:Wifi.cwifi用户空间的程序和库:external/wpa_supplicant_8/生成守护进程wpa_supplicant一Framesworks层相应的类以及处理流程的介绍1注册serviceAndroid系统起来后,SystemServer进程的名字实际上是system_server,是由Zygote 进程创建的,SystemServer进程创建后会调用SystemServer.java中的main函数,main函数回调SystemServer中的init2函数,启动android services,在init2函数中启动一个ServerThread 线程,在该线程的run函数中会创建一系列的Android Services,将与网络以及wifi相关的service在systemserver.java里面的线程systemthread里面注册,也就是把网络与wifi相关的service的实例用ServiceManager.addService(String name, IBinder service)进行注册,与wifi相关的就是wifiservice类,相关代码如下:try {Slog.i(TAG, "Wi-Fi Service");wifi = new WifiService(context);ServiceManager.addService(Context.WIFI_SERVICE, wifi);} catch (Throwable e) {reportWtf("starting Wi-Fi Service", e);}try {Slog.i(TAG, "Connectivity Service");connectivity = new ConnectivityService(context, networkManagement, networkStats, networkPolicy);ServiceManager.addService(Context.CONNECTIVITY_SERVICE, connectivity);networkStats.bindConnectivityManager(connectivity);networkPolicy.bindConnectivityManager(connectivity);wifi.checkAndStartWifi();wifiP2p.connectivityServiceReady();} catch (Throwable e) {reportWtf("starting Connectivity Service", e);}上面的代码告诉我们将与网络相关的service实例networkStats与networkPolicy与connectivityservice相关联,所谓相关联,我的理解是,在networkStats与networkPolicy这两个实例对应的service类中定义一个ConnectivityService类的父类的实例;2 Wifiservice简介wifiservice是整个框架的核心部分,application层触发事件后,会调用这个service里面的方法来处理事件,包括加载驱动,开启wpa_supplicant,扫描AP都是调用这个service 里面的方法实现的,实际上这些方法最终调用的是wifistatemachine里面的方法去发送消息。
由wifistatemachine里面的描述wifi事件的内部类去处理这些消息。
在这个类的构造函数中主要就是实例化了一个描述wifi状态机的类wifistatumachine ,重写了广播事件的onReceive函数。
3Wifistatusmachine简介以及android wifi信息传递机制与流程简介。
上面已经提到,wifiservice中的方法最终是调用这个service里面的方法来实现的,主要就是对sendmessage()的封装。
在这个service中,需要传递到wpa_supplicant来实现wifi功能的命令,都在这个service中做了定义。
针对每一个wifi状态,都声明了一个内部类去描述,比如描述加载驱动,开启wpa_supplicant等,每一个状态类都有三个函数构成,enter (),statue().processmessage(),只不过不同类的这三个函数里面的程序不同而已。
Wifistatusmachine的构造函数里面,主要的工作是实例化了wifi的监视器mWifiMonitor = new WifiMonitor(this),这个监视器的作用下面再做解释,简单地讲,就是通过这个监视器,阻塞监听wpa_supplicant传递上来的信息,对信息进行处理后通知上层采取相应的形式去实现。
在这个构造函数中,对每一个描述wifi状态的内部类的实例,都使用add()函数把这些内部类的实例添加到状态机中,这两项主要工作对应的代码如下:mWifiMonitor = new WifiMonitor(this);addState(mDefaultState);addState(mInitialState, mDefaultState);addState(mDriverUnloadingState, mDefaultState);addState(mDriverUnloadedState, mDefaultState);addState(mDriverFailedState, mDriverUnloadedState);addState(mDriverLoadingState, mDefaultState);addState(mDriverLoadedState, mDefaultState);addState(mSupplicantStartingState, mDefaultState);addState(mSupplicantStartedState, mDefaultState);addState(mDriverStartingState, mSupplicantStartedState);addState(mDriverStartedState, mSupplicantStartedState);addState(mScanModeState, mDriverStartedState);addState(mConnectModeState, mDriverStartedState);addState(mConnectingState, mConnectModeState);addState(mConnectedState, mConnectModeState);addState(mDisconnectingState, mConnectModeState);addState(mDisconnectedState, mConnectModeState);addState(mWaitForWpsCompletionState, mConnectModeState);addState(mDriverStoppingState, mSupplicantStartedState);addState(mDriverStoppedState, mSupplicantStartedState);addState(mSupplicantStoppingState, mDefaultState);addState(mSoftApStartingState, mDefaultState);addState(mSoftApStartedState, mDefaultState);addState(mTetheringState, mSoftApStartedState);addState(mTetheredState, mSoftApStartedState);addState(mSoftApStoppingState, mDefaultState);addState(mWaitForP2pDisableState, mDefaultState);之后,使用setInitialState(mInitialState)使wifi状态机进入初始化状态,并通过函数start()开启状态机。
通过把各种wifi状态类的实例添加到wifi状态机,以后通过sendmessage(Message message)方法发送消息,参数message会写进消息队列汇总,wifi状态机会根据相应的message调用相应的wifi状态类里面的函数对消息进行处理。
例如wifi驱动的加载。
sendmessage(CMD_LOAD_DRIVER)发送加载驱动的消息到消息队列后,会触发wifi状态机的里面的状态类DriverLoadingState,调用里面的方法去加载驱动。
4Wifimonitor前面已经简单介绍过,这个类主要功能就是阻塞等待wpa_supplicant传上来的命令后根据命令来进行相应的处理。
那么这个监视器是什么时候打开的呢,我们来分析它的打开流程。
在系统起来之后,把wifiservice 和connectivity的实例添加到android的service管理器,这前面已经介绍过,之后,调用wifiservice的方法wifi.checkAndStartWifi();实际上调用了wifimachine的方法setWifiEnabled(wifiEnabled),在这个方法里面,加载驱动,开启wpa_supplicant,对应的代码如下:if (enable) {/* Argument is the state that is entered prior to load */sendMessage(obtainMessage(CMD_LOAD_DRIVER, WIFI_STATE_ENABLING, 0));sendMessage(CMD_START_SUPPLICANT);} else {sendMessage(CMD_STOP_SUPPLICANT);/* Argument is the state that is entered upon success */sendMessage(obtainMessage(CMD_UNLOAD_DRIVER,WIFI_STATE_DISABLED, 0));}}之后wifi状态机就会进入DriverLoadedState 状态,通过native层调用wifi.c开启wpa_supplicant的函数后就开启wifimonitor,也就是说,监视器的开启必须是在驱动加载成功以及开启wpa_supplicant后才开启,相应的代码如下:if(WifiNative.startSupplicant()) {if (DBG) log("Supplicant start successful");mWifiMonitor.startMonitoring();transitionTo(mSupplicantStartingState);} else {loge("Failed to start supplicant!");sendMessage(obtainMessage(CMD_UNLOAD_DRIVER,WIFI_STATE_UNKNOWN, 0));}介绍下wifimonitor是如何阻塞监听wpasupplicant传过来的信息的,在监视器开启之后:在监视线层的循环体里面,调用wifi.c里面的waitForEvent()函数来监听接收wpa_supplicant 传过来的消息,相应的代码如下:public void run() {if (connectToSupplicant()) {// Send a message indicating that it is now possible to send commands// to the supplicantmStateMachine.sendMessage(SUP_CONNECTION_EVENT);} else {mStateMachine.sendMessage(SUP_DISCONNECTION_EVENT);return;}//noinspection InfiniteLoopStatementfor (;;) {String eventStr = WifiNative.waitForEvent();根据字符串eventStr的不同值调用相应的处理流程来对事件进行不同的处理,上层做出相应的回应。