android wifi详细
- 格式:pdf
- 大小:783.28 KB
- 文档页数:18
Android应用的无线网络测试指南无线网络已经成为我们生活中不可或缺的一部分,而Android应用的无线网络功能更是日益重要。
为了确保应用在各种网络环境下都能正常运行,进行系统化的无线网络测试是至关重要的。
本文将为您提供一份Android应用的无线网络测试指南,帮助您对应用的无线网络功能进行全面的测试和优化。
一、测试环境的搭建在进行无线网络测试之前,首先需要搭建适合的测试环境。
以下是一些测试环境的准备事项:1. 路由器:选择一款性能稳定、信号覆盖范围广的路由器。
设置路由器的无线网络名称和密码,确保手机能够正常连接并稳定传输数据。
2. 移动设备:准备多款不同型号的Android手机和平板电脑,覆盖不同的操作系统版本和屏幕分辨率。
3. 网络质量模拟工具:使用网络模拟器或者其他网络工具,模拟不同网络情况,包括网络延迟、丢包率、带宽等参数。
二、无线网络功能的测试点针对Android应用的无线网络功能,我们需要测试一些关键点以确保其正常工作。
以下是一些常见的测试点:1. 连接稳定性:测试应用在不同网络环境下的连接稳定性,包括WiFi和移动数据网络。
检查应用在弱信号环境下的表现,并观察是否出现连接中断、重连等问题。
2. 响应速度:测量应用在不同网络环境下的响应速度,包括数据请求和接收的时间。
比较在不同网络条件下的响应速度差异,发现潜在的性能瓶颈。
3. 数据传输质量:测试应用在网络传输过程中是否出现数据丢失、错误或者损坏的情况。
检查应用对数据包丢失或错误的处理能力,确保数据的完整性和准确性。
4. 节省流量:测试应用在使用移动数据网络时的流量消耗情况,比较应用在不同网络条件下的流量差异。
优化应用的流量使用,减少用户的流量费用。
5. 多任务处理:测试应用在同时处理多个网络请求时的性能表现,如并发下载、上传、推送通知等情况。
确保应用能够正常处理多个网络任务而不出现卡顿或崩溃。
三、测试工具的选择为了能够准确测试Android应用的无线网络功能,我们需要借助适当的测试工具。
二: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 中的监视线程。
Androidwifi调试详解及简单实例
Android wifi 调试
前⾔:
做android开发的时候,经常遇到的⼀个问题就是真机调试次数多了,会导致usb⼝,损坏,⽽且长期给⼿机充电也会损坏⼿机,所以我想了想是否可以拿usb调试,⽹上找了下,还真可以,但都写的⽐较繁琐,今天我们就使⽤3条命令完成任务
⾸先我们需要使⽤的⼯具是adb,它基于tcp协议之上
1.开始我们需要给⼿机开启tcpip模式,这个时候需要usb线连接⼿机
adb tcpip 端⼝号(随便写个⼤点的⽐如:5555)
写完这个之后,usb就没⽤了
2.你需要查看你⼿机的ip地址,⽅法很多
如果想使⽤命令的话(如果使⽤命令查看,usb还不能拔,查完再拔)
adb shell ifconfig wlan0
如果不使⽤的话,⼿机上也可以查到
查到Ip后,就可以连接了
3.连接⼿机
adb connect ⼿机ip
4.如果想断开连接的话
adb disconnect ⼿机ip
⼤功告成,注意⼿机和PC应该在同⼀wifi下,实际你只要PC能ping通⼿机ip就没问题,如果没有路由器怎么办?你电脑⾥⾯的360wifi是⼲什么的?
补充:
如果想切换回usb模式
adb usb
如果切换回去的话,下次连接还需要数据线开启tcpip,如果不切换的话,以后调试就再也不⽤数据线了
感谢阅读,希望能帮助到⼤家,谢谢⼤家对本站的⽀持!。
一、安卓手机或者安卓平板无线网络使用说明1.连接上无线网络:a. 终端收到“SWUPL”信号后请连接上它。
b.连接上后会自动跳转到客户端下载地址http://172.16.96.4。
c.在客户端下载页面上选择安卓客户端下载,d 如没自动跳转到客户端下载地址,需打开游览器输入172.16.96.4登陆即可。
如图2.安装安卓客户端:点击安装客户端,并信任程序!安装成功后如图所示:3.登陆客户端:a. 登陆输入账号密码,和电脑客户端用户名密码相同。
b. 登陆成功后,如下图所示,直接主键(home),返回到手机(平板)桌面,即可正常使用网络。
二、苹果手机或者苹果平板无线网络使用说明1.连接上无线网络:苹果需要预先在APP store中搜索【 客户端】下载图标右下角带有“校”标志的校园网客户端2.安装苹果客户端:点击安装客户端,并信任程序!安装客户端时需要输入苹果账号密码(Apple ID)。
3.设备连接上“SWUPL”无线信号4.登陆客户端:a. 登陆的账号密码,同电脑相同。
b. 登陆成功,如下图,直接主键(home),返回到手机(平板)桌面,即可正常使用网络。
三、笔记本无线网络使用说明1.终端设备连接“SWUPL”无线信号。
2.连接上“SWUPL”无线信号后自动跳转至学校下载客户端网页,如无法自动跳转下载客户端网页,请在浏览器输入172.16.96.4登录到下载客户端网页下载相应系统客户端。
3.window系统双击下载下来的安装文件安装客户端。
苹果系统把下载下来的客户端放置在桌面上(不能放快捷方式在桌面上,必须是下载下来的客户端直接放在桌面上)。
4.安装完成后双击客户端输入用户名、密码成功登录客户端之后可正常访问外部网络。
(苹果客户端不用安装,直接点击放在桌面上的客户端,输入账号密码之后即可正常使用网络)。
WifiManager工具类:android包中自带有WifiManager工具类,专门用于wifi管理:?1 import .wifi.WifiManager;取得WifiManager对象:?1 W ifiManager mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVI 打开WIFI:?1 2 3 if (!mWifiManager.isWifiEnabled()) { mWifiManager.setWifiEnabled(true); }创建一个WIFI信息:?1 2 3 4 5 6 7 8 91011121314 public WifiConfiguration CreateWifiInfo(String SSID, String Password, int Type) {WifiConfiguration config = new WifiConfiguration();config.allowedAuthAlgorithms.clear();config.allowedGroupCiphers.clear();config.allowedKeyManagement.clear();config.allowedPairwiseCiphers.clear();config.allowedProtocols.clear();config.SSID = "\"" + SSID + "\"";WifiConfiguration tempConfig = this.IsExsits(SSID);if (tempConfig != null) {mWifiManager.removeNetwork(workId);}151617181920212223242526272829303132333435363738394041424344454647484950515253if (Type == 1) // WIFICIPHER_NOPASS{config.wepKeys[0] = "";config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);config.wepTxKeyIndex = 0;}if (Type == 2) // WIFICIPHER_WEP{config.hiddenSSID = true;config.wepKeys[0] = "\"" + Password + "\"";config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);config.allowedGroupCiphers.set(MP);config.allowedGroupCiphers.set(IP);config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);config.wepTxKeyIndex = 0;}if (Type == 3) // WIFICIPHER_WPA{config.preSharedKey = "\"" + Password + "\"";config.hiddenSSID = true;config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);config.allowedGroupCiphers.set(IP);config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);config.allowedPairwiseCiphers.set(IP);// config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);config.allowedGroupCiphers.set(MP);config.allowedPairwiseCiphers.set(MP);config.status = WifiConfiguration.Status.ENABLED;}return config;}这里只介绍第三个参数:Type。
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技术被广泛应用于无线网络连接。
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接入点建立连接,并在无线网络上进行数据传输和通信。
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的实例。
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来控制驱动。
3. wpa_supplient虽然本文不关心JNI层以下的部分,但wpa_supplient是什么需要解释一下。
WPA是WiFi Protected Access的缩写,wpa_supplicant是“WiFi网络安全存取认证”的意思。
Android是用的wpa_supplicant的修改版本。
在Android wifi框架里,wpa_supplcant起着承上启下的作用。
它向上提供netlink socket接口,向下依赖wifi 驱动的wireless extention标准接口。
也就是说驱动必须支持wireless extention才可以。
wireless extention其实是一个将要过时的标准,Android也将向nl80211标准过度,采用未修改的wpa_supplicant。
请参见/en/developers/Documentation/Android。
本节以下部分摘自《Android平台上无线网卡自动扫描并关联AP的实现》:/xyp86/blog/item/d371a1d78d4162d7a144dfd3.html。
Android平台使用的WiFi控制框架是基于大名鼎鼎的wpa_supplicant,它是一个安全中间件,为各种无线网卡提供统一的安全机制,如下图所示:客户端程序,包括wpa_cli命令行或java图形界面程序,通过unix本地socket与wpa_supplicant daemon服务通信,发送命令并接收结果;wpa_supplicant daemon服务,对应上述中间部分,功能是“上传下达”。
所有客户端通过它控制硬件网卡,通过发送字符串命令控制是否扫描AP,提取扫描结果和是否关联AP等操作,同时将驱动的执行状态发送给用户。
该服务是设计支持多种无线网卡芯片,因此各个厂商共同提供了一个通用接口给wpa_supplicant调用4. NetdNetd是android的一个守护进程,是专门为Android开发的。
它功能很广,包括设置nat,usb tethering,wifi tethering,soft ap设置,还有网络接口add,remove,change事件的通知。
在FrameWork有NetworkManagementService负责和netd通信,framework代码可以通过NetworkManagementService利用netd 的全部功能。
Netd的代码位于“android sources”/system/netd。
5. FrameWork层架构6. 情景分析6.1. 情景1当前系统正连接了以太网,Wifi是未使能的,有无密码的Wifi信号存在,Wifi的优先级高于以太网。
此时在Settings使能Wifi,系统就会连接到Wifi网络,那么整个过程是怎样的呢?下面是整个过程的UML序列图。
当在settings使能Wifi后,首先会调用WifiService.setApEnabled(false),也就是禁止Wifi模块的作为Ap(Access Point,即一个接入点)的功能。
需要了解的是,现在的硬件Wifi模块即支持去连接附近的Ap, 也可以作为Ap供其它设备接入。
那么给其它设备接入有什么用处呢?那就是tethering,即网络共享。
假设你的设备当前可以通过以太网访问因特网,当在Wifi上使能Ap功能时,其它连入的设备就可以通过这台设备访问因特网。
当然在同一时刻,只能有一种身份。
接着会调用WifiService.setWifiEnabled(true),去加载wifi适配层,启动supplient守护进程,启动MonitorThread 开始监听supplient的事件。
首先MonitorThread会收到DRIVER_STATE事件,意味着硬件启动成功。
接着会调用到WifiNative.scanCommand()向supplient发送搜索Ap的命令。
然后MonitorThread又进入等待事件的状态。
当supplient搜索Ap结束时,MonitorThread会收到SCAN_RESULTS事件。
接下来会调用WifiNative. setScanResultHandlingCommand(NormalMode)来让supplient自行决定去连接到哪个Ap, supplient会挑选信号最强并且没有密码的Ap进行连接。
同时WifiSettings会收到WifiManager.SCAN_RESULTS_AVAILABLE_ACTION 广播,调用mWifiManager.getScanResults()得到扫描到得ap列表。
ScanResult里包含如下信息:当supplient连接到一个Ap时,MonitorThread会收到CONNECTED事件。
接下来就会尝试配置IP地址,如果IP地址配置成功就会发送EVENT_STATE_CHANGED给ConnectivityService,ConnectivityService就会根据网络优先级决定关掉以太网而通过Wifi联网的决定。
这里要区分网络接口的disconnect和disable的不同之处,disconnected的接口依然可能enable,disable是指硬件上的。
在pc上当切换到其他网络只是disconnected以前的网络,而Android为了省电,是disable以前网络的。
6.2. 情景2系统启动时,Wifi和Ethernet都处于使能状态,并且附近有没有密码的Wifi信号,Ethernet也是通的。
系统启动后就会自动连接到Wifi网络,那么系统启动时如何决定连接到哪个网络呢?在上一篇《Android的网络支持和管理(一)---以太网》中,我们分析了从网线插上到以太网通畅的全过程。
这过程中驱动层一共向上发出了两个信号,第一个代表硬件连接上了,第二个代表网络连接上了(即IP地址配置成功)。
刚才我们又分析了当使能Wifi到Wifi通畅的全过程。
这过程中驱动层一共向上发了三个信号,第一个代表硬件使能成功,第二个代表搜索Ap完毕,第三个代表网络连接上了(即IP地址配置成功)。
在IP地址配置成功以前,以太网和Wifi都是默默做着自己的工作,丝毫没有参与网络管理。
当即IP地址配置成功后,能够确保各自网络通畅时,才通知ConnectivityManager。
当启动时,如果以太网使能的话,不管有没有网线连接都会去尝试根据保存的设置配置IP地址,如果IP地址配置成功就会通知ConnectivityManager。
同样,如果Wifi使能的话,就会加载Wifi驱动和启动wpa_supplient,然后搜索AP并尝试连接,接下来配置IP地址,如果成果的话就会通知ConnectivityManager。
(注:WifiService.startWifi函数会在ConnectivityManager的构造函数里面调用去判断是不是要使能Wifi)无论ConnectivityManager先收到Wifi发出的信号还是以太网发出的信号,最后的结果都是一样的,当收到第二个信号时就会禁掉优先级小的以太网。
6.3. 情景3系统中只有Wifi,附近有好几个有密码的Ap,当在Settings里使能Wifi后,会搜索到这些Ap并显示出来。
我们选择一个Ap后会弹出WifiDialog要求输入密码,输入密码后点确定。
下面是随后的过程。
我们在WifiDialog中配置的信息可以用WifiConfigure来表示,它包含的信息如下:ScanResult是Ap广播的信息,而WifiConfigure是wpa_supplicant用来尝试和Ap进行连接的信息。
ScanResult 说“窗前明月光”,WifiConfigure只有说“疑是地上霜”才能匹配。
WifiConfigure和wpa_supplicant配置文件里保存的信息格式是对应的,关于wpa_supplicant更详细的介绍请看源码下的readme。
可以说wpa_supplicant 实现了所有我们需要的功能,包括ap搜索,连接,甚至设置的保存。
Settings界面通过WifiManager来和wpa_supplicant通信。
7.Ad hoc的支持添加ad hoc的支持有两种方式,改wpa_supplicant和改Android Framework。
改wpa_supplicant的原理和方法请参考/android/android-ad-hoc-wireless-network-support/,这种方法不推荐,不是解决问题的根本。