android wifi详细

合集下载

Android应用的无线网络测试指南

Android应用的无线网络测试指南

Android应用的无线网络测试指南无线网络已经成为我们生活中不可或缺的一部分,而Android应用的无线网络功能更是日益重要。

为了确保应用在各种网络环境下都能正常运行,进行系统化的无线网络测试是至关重要的。

本文将为您提供一份Android应用的无线网络测试指南,帮助您对应用的无线网络功能进行全面的测试和优化。

一、测试环境的搭建在进行无线网络测试之前,首先需要搭建适合的测试环境。

以下是一些测试环境的准备事项:1. 路由器:选择一款性能稳定、信号覆盖范围广的路由器。

设置路由器的无线网络名称和密码,确保手机能够正常连接并稳定传输数据。

2. 移动设备:准备多款不同型号的Android手机和平板电脑,覆盖不同的操作系统版本和屏幕分辨率。

3. 网络质量模拟工具:使用网络模拟器或者其他网络工具,模拟不同网络情况,包括网络延迟、丢包率、带宽等参数。

二、无线网络功能的测试点针对Android应用的无线网络功能,我们需要测试一些关键点以确保其正常工作。

以下是一些常见的测试点:1. 连接稳定性:测试应用在不同网络环境下的连接稳定性,包括WiFi和移动数据网络。

检查应用在弱信号环境下的表现,并观察是否出现连接中断、重连等问题。

2. 响应速度:测量应用在不同网络环境下的响应速度,包括数据请求和接收的时间。

比较在不同网络条件下的响应速度差异,发现潜在的性能瓶颈。

3. 数据传输质量:测试应用在网络传输过程中是否出现数据丢失、错误或者损坏的情况。

检查应用对数据包丢失或错误的处理能力,确保数据的完整性和准确性。

4. 节省流量:测试应用在使用移动数据网络时的流量消耗情况,比较应用在不同网络条件下的流量差异。

优化应用的流量使用,减少用户的流量费用。

5. 多任务处理:测试应用在同时处理多个网络请求时的性能表现,如并发下载、上传、推送通知等情况。

确保应用能够正常处理多个网络任务而不出现卡顿或崩溃。

三、测试工具的选择为了能够准确测试Android应用的无线网络功能,我们需要借助适当的测试工具。

Android之wifi分析(上)

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原理详解(转)

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 中的监视线程。

Androidwifi调试详解及简单实例

Androidwifi调试详解及简单实例

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,如果不切换的话,以后调试就再也不⽤数据线了
感谢阅读,希望能帮助到⼤家,谢谢⼤家对本站的⽀持!。

Android -wifi 直连 wifi direct

Android -wifi 直连 wifi direct

3、WIFI_P2P_THIS_DEVICE_CHANGED_ACTION :该设备的细节已经改变。
见的WifiP2pManager文档了解更多信息。 也期待在Wi - Fi的直接演示示例应用程序。
/reference/android/net/wifi/p2p/package-summary.html Wi-Fi Direct与ad-hoc模式有哪些不同?
.wifi.p2p ,一个新的软件包,包含所有的API执行同行等连接与Wi - Fi。 你需要与主类是WifiP2pManager ,您可以调用getSystemService(WIFI_P2P_SERVICE)收购。WifiP2pManager包括API,允许您:
1、您P2P连接的应用程序通过调用initialize
ห้องสมุดไป่ตู้
DIGITIMES中文网 原文网址: Wi-Fi Direct 10大问答/tw/dt/n/shwnws.asp?id=0000205310_A224IE390EPO7S191B4CM#ixzz1iDK5ewPn
两者在安全性上有所不同,Wi-Fi Direct采用WPA2(Wi-Fi Protection Access Version 2)加密,在Windows ad-hoc网络下,最高安全支持为WEP。不过Windows 7亦支持WPA2
Android -wifi 直连(wifi direct )2011-12-23 15:02
现在,Android的支持Wi - Fi的直接点对点点对点(P2P)Android系统的供电设备和其他类型的设备,没有一个热点或互联网连接之间的连接。 Android框架提供了一套Wi - Fi的P2P的API,允许你去发现和连接到其他设备时,每个设备的Wi - Fi的直接支持,然后沟通跨越距离远远长于蓝牙连接迅速??连接。

无线WIFI使用方法手册

无线WIFI使用方法手册

一、安卓手机或者安卓平板无线网络使用说明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.安装完成后双击客户端输入用户名、密码成功登录客户端之后可正常访问外部网络。

(苹果客户端不用安装,直接点击放在桌面上的客户端,输入账号密码之后即可正常使用网络)。

android自动连接wifi——WifiManager

android自动连接wifi——WifiManager

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_代码

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原理在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)

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 wifi原理

android wifi原理

android wifi原理Android Wi-Fi原理Wi-Fi(Wireless Fidelity)是一种无线网络技术,它使用无线电波进行数据传输,广泛应用于移动设备和电脑之间的无线连接。

Android作为目前最流行的移动操作系统之一,自然也支持Wi-Fi 连接。

本文将介绍Android Wi-Fi的原理及其相关知识。

1. Wi-Fi工作原理Wi-Fi是基于IEEE 802.11标准的无线局域网技术,它使用无线电波在2.4GHz或5GHz频段进行数据传输。

Wi-Fi网络由一个无线路由器和多个无线设备组成,无线路由器负责接收和发送无线信号,而无线设备则通过Wi-Fi模块接收和发送信号。

通过Wi-Fi连接,无线设备可以与互联网进行数据交换。

2. Android Wi-Fi模块Android设备通常配备有Wi-Fi模块,该模块负责与无线路由器进行通信。

在Android系统中,Wi-Fi模块由驱动程序和一系列系统服务组成。

驱动程序负责控制Wi-Fi硬件,而系统服务则提供了Wi-Fi配置、连接管理和网络协议支持等功能。

3. Wi-Fi扫描Android设备在连接Wi-Fi网络之前,需要先进行Wi-Fi扫描,以搜索附近的无线网络。

Wi-Fi扫描通过监听无线信道,获取周围无线网络的信息,包括网络名称(SSID)、信号强度和加密方式等。

Android系统会将扫描到的网络信息存储在一个列表中,供用户选择连接。

4. Wi-Fi连接一旦用户选择了要连接的Wi-Fi网络,Android设备会与该网络建立连接。

在连接过程中,Android系统会与无线路由器进行握手,交换安全密钥或证书,并建立一个安全的通信通道。

一旦连接成功,Android设备就可以通过Wi-Fi网络与互联网进行数据交换。

5. Wi-Fi管理Android系统提供了多种方式来管理Wi-Fi连接。

用户可以通过设置界面手动连接或断开Wi-Fi网络,也可以设置Wi-Fi自动连接开关。

Wifi模块分析_android

Wifi模块分析_android

Wifi模块分析博客分类:Android转自:/ylyuanlu/article/details/6622943最近研究Wifi模块,查了不少的相关资料,但发现基本上是基于android2.0版本的的分析,而现在研发的android移动平台基本上都是 2.3的版本,跟2.0版本的差别,在Wifi模块上也是显而易见的。

2.3版本Wifi模块没有了WifiLayer,之前的WifiLayer主要负责一些复杂的Wifi功能,如AP选择等以提供给用户自定义,而新的版本里面的这块内容基本上被WifiSettings所代替。

本文就是基于android2.3版本的Wifi分析,主要分为两部分来分别说明:(1) Wifi模块相关文件的解析(2) Wpa_supplicant解析(3) Wifi的启动流程(有代码供参考分析)一,Wifi模块相关文件解析1) wifisettings.javapackages/apps/Settings/src/com/android/settings/wifiwifisettings.java该类数据部分主要定义了下面几个类的变量:{private final IntentFilter mFilter;//广播接收器,用来接收消息并做响应的处理工作privatefinal BroadcastReceiver mReceiver;//这是一个扫描类,会在用户手动扫描 AP时被调用privatefinal Scanner mScanner;private WifiInfo mLastInfo;//服务代理端,作为WifiService对外的接口类呈现privateWifiManager mWifiManager;//这个类主要实现Wifi的开闭工作privateWifiEnabler mWifiEnabler;//APprivate AccessPoint mSelected;private WifiDialog mDialog;……}wifiSettings类的构造函数的主要工作:定义了一个IntentFilter (Intent过滤器)变量,并添加了六个动作,(了解 Android的intent机制的同学都知道什么意思,不明白的同学参考Intent机制的资料)接着定义一个广播接收器,并有相应的消息处理函数,下面是该构造函数的定义:public WifiSettings() {mFilter = new IntentFilter();//intent机制中的intent消息过滤器,下面添加可以处理的动作mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);mFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); mFilter.addAction(WORK_IDS_CHANGED_ACTION);mFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION); mFilter.addAction(WORK_STATE_CHANGED_ACTION); mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION);//注册了广播接收器,用来处理接收到的消息事件mReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context,Intent intent) { handleEvent(intent); //事件处理函数}};mScanner= new Scanner(); //手动扫描类}在广播接收器中的相应函数onReceive函数中有个handleEvent函数,它就是用来处理广播接收器接受到的intent消息的,它的功能是根据intent 消息中的动作类型,来执行相应的操作,每一种动作对应了activity的一项消息处理能力。

android wifi 代理 原理

android wifi 代理 原理

android wifi 代理原理Android中的WiFi代理原理是通过设置系统的网络配置来实现的。

当用户在Android设备上设置了WiFi代理,所有通过WiFi连接的应用程序都会使用该代理服务器进行网络请求。

Android设备上的网络配置包括全局代理和WiFi代理两种类型。

全局代理是应用于所有网络连接,而WiFi代理只应用于通过WiFi连接的网络请求。

在Android系统中,当用户设置了WiFi代理时,系统会自动创建一个本地的HTTP代理服务器,该代理服务器监听特定端口(默认为8888)。

当设备上的应用程序发起网络请求时,请求会先发送给该本地代理服务器,然后由代理服务器根据用户设置的代理规则进行转发或处理。

具体而言,当Android设备连接到一个WiFi网络时,系统会自动获取该网络的代理设置。

如果用户在WiFi设置中手动配置了代理服务器,系统将使用该代理服务器进行网络请求。

如果用户没有配置代理服务器,则系统不会使用任何代理进行网络请求。

通过设置WiFi代理,用户可以实现以下功能:1. 监控和分析网络流量:用户可以使用代理服务器捕获和分析设备上的网络请求,以便调试和优化应用程序。

2. 绕过网络限制:如果用户所连接的WiFi网络存在某些限制(如防火墙、内容过滤等),通过设置代理服务器,用户可以绕过这些限制,访问被封锁的网站或服务。

3. 篡改请求和响应:通过代理服务器,用户可以修改请求和响应的内容,以达到某些特定的目的,如劫持广告、修改页面内容等。

需要注意的是,WiFi代理只会应用于通过WiFi连接的网络请求,对于使用移动数据连接的网络请求不会生效。

另外,Android设备上的WiFi代理设置仅适用于当前用户的配置,不会影响其他用户的网络连接。

Android settings之Wifi学习

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手机获取当前连接的wifi配置信息

android⼿机获取当前连接的wifi配置信息main.xml[html] view plain copy1. <?xml version="1.0" encoding="utf-8"?>2. <LinearLayout xmlns:android="/apk/res/android"3. android:orientation="vertical"4. android:layout_width="fill_parent"5. android:layout_height="fill_parent"6. >7. <TextView8. android:layout_width="fill_parent"9. android:layout_height="wrap_content"10. android:text="@string/hello"11. android:id="@+id/info"/>12. </LinearLayout>AndroidManifest.xml[java] view plain copy1. <?xml version="1.0" encoding="utf-8"?>2. <manifest xmlns:android="/apk/res/android"3. package="proj.javaangle" android:versionCode="1" android:versionName="1.0">4. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />5. <uses-permission android:name="android.permission.INTERNET" />6. <application android:icon="@drawable/icon" android:label="@string/app_name">7. <activity android:name=".Mac" android:label="@string/app_name">8. <intent-filter>9. <action android:name="android.intent.action.MAIN" />10. <category android:name="UNCHER" />11. </intent-filter>12. </activity>13. </application>14. </manifest>java代码[java] view plain copy1. import android.app.Activity;2. import android.content.Context;3. import .wifi.WifiInfo;4. import .wifi.WifiManager;5. import android.os.Bundle;6. import android.widget.TextView;7. public class Mac extends Activity8. {9. @Override10. public void onCreate(Bundle savedInstanceState)11. {12. super.onCreate(savedInstanceState);13. setContentView(yout.main);。

Android 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实现)。

Android获取wifi列表的方法

Android获取wifi列表的方法

Android获取wifi列表的⽅法本⽂实例为⼤家分享了Android获取wifi列表的具体代码,供⼤家参考,具体内容如下接着上篇的,这次我们来获取android设备的wifi列表,话不多少直接上代码!1.⾸先我们先获取wifi权限<!-- 以下是使⽤wifi访问⽹络所需的权限 --><uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /><uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><uses-permission android:name="android.permission.INTERNET" />接下来我们直接来定义wifiUtilpublic class WifiUtil {private Context context;public WifiUtil(Context context) {this.context = context;}// TODO: 2021/9/15 获取本机WIFI设备详细信息@SuppressLint("MissingPermission")public void getDetailsWifiInfo() {StringBuffer sInfo = new StringBuffer();WifiManager mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);WifiInfo mWifiInfo = mWifiManager.getConnectionInfo();int Ip = mWifiInfo.getIpAddress();String strIp = "" + (Ip & 0xFF) + "." + ((Ip >> 8) & 0xFF) + "." + ((Ip >> 16) & 0xFF) + "." + ((Ip >> 24) & 0xFF);sInfo.append("\n--BSSID : " + mWifiInfo.getBSSID());sInfo.append("\n--SSID : " + mWifiInfo.getSSID());sInfo.append("\n--nIpAddress : " + strIp);sInfo.append("\n--MacAddress : " + mWifiInfo.getMacAddress());sInfo.append("\n--NetworkId : " + mWifiInfo.getNetworkId());sInfo.append("\n--LinkSpeed : " + mWifiInfo.getLinkSpeed() + "Mbps");sInfo.append("\n--Rssi : " + mWifiInfo.getRssi());sInfo.append("\n--SupplicantState : " + mWifiInfo.getSupplicantState()+mWifiInfo);sInfo.append("\n\n\n\n");Log.d("getDetailsWifiInfo", sInfo.toString());}// TODO: 2021/9/15 获取附近wifi信号public List<String> getAroundWifiDeviceInfo() {StringBuffer sInfo = new StringBuffer();WifiManager mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);WifiInfo mWifiInfo = mWifiManager.getConnectionInfo();List<ScanResult> scanResults = mWifiManager.getScanResults();//搜索到的设备列表List<ScanResult> newScanResultList = new ArrayList<>();for (ScanResult scanResult : scanResults) {int position = getItemPosition(newScanResultList,scanResult);if (position != -1){if (newScanResultList.get(position).level < scanResult.level){newScanResultList.remove(position);newScanResultList.add(position,scanResult);}}else {newScanResultList.add(scanResult);}}List<String> stringList = new ArrayList<>();for (int i = 0; i <newScanResultList.size() ; i++) {StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("设备名(SSID) ->" + newScanResultList.get(i).SSID + "\n");stringBuilder.append("信号强度 ->" + newScanResultList.get(i).level + "\n");stringBuilder.append("BSSID ->" + newScanResultList.get(i).BSSID + "\n");stringBuilder.append("level ->" + newScanResultList.get(i).level + "\n");stringBuilder.append("采集时间戳 ->" +System.currentTimeMillis() + "\n");stringBuilder.append("rssi ->" + (mWifiInfo != null && (mWifiInfo.getSSID().replace("\"", "")).equals(newScanResultList.get(i).SSID) ? mWifiInfo.getRssi() : null) + "\n"); //是否为连接信号(1连接,默认为null)stringBuilder.append("是否为连接信号 ->" + (mWifiInfo != null && (mWifiInfo.getSSID().replace("\"", "")).equals(newScanResultList.get(i).SSID) ? 1: null) + "\n");stringBuilder.append("信道 - >" +getCurrentChannel(mWifiManager) + "\n");//1 为2.4g 2 为5gstringBuilder.append("频段 ->" + is24GOr5GHz(newScanResultList.get(i).frequency));stringList.add(stringBuilder.toString());}Log.d("getAroundWifiDeviceInfo", sInfo.toString());return stringList;}public static String is24GOr5GHz(int freq) {if (freq > 2400 && freq < 2500){return "1";}else if (freq > 4900 && freq < 5900){return "2";}else {return "⽆法判断";}}/*** 返回item在list中的坐标*/private int getItemPosition(List<ScanResult>list, ScanResult item) {for (int i = 0; i < list.size(); i++) {if (item.SSID.equals(list.get(i).SSID)) {return i;}}return -1;}public static int getCurrentChannel(WifiManager wifiManager) {WifiInfo wifiInfo = wifiManager.getConnectionInfo();// 当前wifi连接信息 List<ScanResult> scanResults = wifiManager.getScanResults();for (ScanResult result : scanResults) {if (result.BSSID.equalsIgnoreCase(wifiInfo.getBSSID())&& result.SSID.equalsIgnoreCase(wifiInfo.getSSID().substring(1, wifiInfo.getSSID().length() - 1))) {return getChannelByFrequency(result.frequency);}}return -1;}/*** 根据频率获得信道** @param frequency* @return*/public static int getChannelByFrequency(int frequency) {int channel = -1;switch (frequency) {case 2412:channel = 1;break;case 2417:channel = 2;break;case 2422:channel = 3;break;case 2427:channel = 4;break;case 2432:channel = 5;break;case 2437:channel = 6;break;case 2442:channel = 7;break;case 2447:channel = 8;break;case 2452:channel = 9;break;case 2457:channel = 10;break;case 2462:channel = 11;break;case 2467:channel = 12;break;case 2472:channel = 13;break;case 2484:channel = 14;break;case 5745:channel = 149;break;case 5765:channel = 153;break;case 5785:channel = 157;break;case 5805:channel = 161;break;case 5825:channel = 165;break;}return channel;}}记得获取wifi的过程中要去掉重复的信号哈,去重代码for (ScanResult scanResult : scanResults) {int position = getItemPosition(newScanResultList,scanResult);if (position != -1){if (newScanResultList.get(position).level < scanResult.level){newScanResultList.remove(position);newScanResultList.add(position,scanResult);}}else {newScanResultList.add(scanResult);}}2.在需要获取列表的地⽅设置数据,记得动态获取权限哈// TODO: 2021/9/18 设置wifi管理器并动态获取⼿机权限@SuppressLint({"CheckResult","NotifyDataSetChanged"})private void setWifiManager() {RxPermissions rxPermissions = new RxPermissions(this);rxPermissions.requestEach(Manifest.permission.ACCESS_FINE_LOCATION).subscribe(permission -> {if (.equalsIgnoreCase(Manifest.permission.ACCESS_FINE_LOCATION)) { wifiUtil = new WifiUtil(this);wifiListAdapter.getDatas().clear();wifiList.clear();wifiList.add(getString(R.string.wifi_list));wifiList.addAll(wifiUtil.getAroundWifiDeviceInfo());for (int i = 0; i < wifiList.size(); i++) {typeBeanList.add(new TypeBean(true, wifiList.get(i)));}wifiListAdapter.notifyDataSetChanged();}});}3.展⽰结果以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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/,这种方法不推荐,不是解决问题的根本。

相关文档
最新文档