Android settings之Wifi学习 - 图文

2020-02-20 22:41

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.cpp wifi管理库。

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 访问网络需要的权限

android:name=“android.permission.CHANGE_NETWORK_STATE”> 网络状态改变的权限

android:name=“android.permission.CHANGE_WIFI_STATE”> 修改WIFI状态的权限

android:name=“android.permission.ACCESS_NETWORK_STATE”> 访问网络权限

android:name=“android.permission.ACCESS_WIFI_STATE”>

访问WIFI权限

Android提供了frameworks/base/wifi/java/android/net/wifi包供我们操作WiFi。首先介绍一下几个类:

WifiManager:用来管理我们的wifi 连接(提供了管理WiFI连接的大部分API ) addNetwork(WifiConfiguration config) 通过获取到的网络的链接状态信息,来添加网络 calculateSignalLevel(int rssi , int numLevels) 计算信号的等级 compareSignalLevel(int rssiA, int rssiB) 对比连接A 和连接B

createWifiLock(int lockType, String tag) 创建一个wifi 锁,锁定当前的wifi 连接 disableNetwork(int netId) 让一个网络连接失效 disconnect() 断开连接

enableNetwork(int netId, Boolean disableOthers) 连接一个连接 getConfiguredNetworks() 获取网络连接的状态 getConnectionInfo() 获取当前连接的信息 getDhcpInfo() 获取DHCP 的信息 getScanResulats() 获取扫描测试的结果 getWifiState() 获取一个wifi 接入点是否有效 isWifiEnabled() 判断一个wifi 连接是否有效 pingSupplicant() ping 一个连接,判断是否能连通 ressociate() 即便连接没有准备好,也要连通 reconnect() 如果连接准备好了,连通 removeNetwork() 移除某一个网络 saveConfiguration() 保留一个配置信息 setWifiEnabled() 让一个连接有效 startScan() 开始扫描

updateNetwork(WifiConfiguration config) 更新一个网络连接的信息

该类里有两个重要的成员变量: IWifiManager mService;

private ServiceHandler mHandler;

这个类拥有了一个WifiService实例,就可以通过它进行一系列的调用;WifiManager中定义了的wifi和ap的状态,这些状态会在其他很多类中有使用;然后定义了大量的函数,这些函数几乎都是对WifiService接口函数的封装,直接调用WifiService的函数。

该类的构造函数很简单:

public WifiManager(IWifiManager service,Handler handler) { mService = service; mHandler = handler; }

该类中还定义了一个WifiLock类

ScanResult:通过wifi 硬件的扫描来获取一些周边的wifi 热点的信息(已经检测出的接入点的地址、名称、身份认证、频率、信号强度 )

BSSID:接入点的地址,这里主要是指小范围几个无线设备相连接所获取的地址,比如说两台笔记本通过无线网卡进行连接,双方的无线网卡分配的地址

SSID:网络的名字,当我们搜索一个网络时,就是靠这个来区分每个不同的网络接入点 Capabilities:网络接入的性能,这里主要是来判断网络的加密方式等(WPA、WPE) Frequency:频率,每一个频道交互的MHz 数 Level:等级,主要来判断网络连接的优先数。

WifiConfiguration:连通一个wifi 接入点的时候,需要获取到的一些信息 WifiConfiguration.AuthAlgorthm 用来判断加密方法

WifiConfiguration.GroupCipher 获取使用GroupCipher 的方法来进行加密 WifiConfiguration.KeyMgmt 获取使用KeyMgmt 进行加密 WifiConfiguration.PairwiseCipher 获取使用WPA 方式的加密 WifiConfiguration.Protocol 获取使用哪一种协议进行加密 wifiConfiguration.Status 获取当前网络的状态

WifiInfo:wifi 连通后,可以通过这个类获得一些已经连通的wifi 连接的信息(包括接入点、网络连接状态、隐藏的接入点、IP地址、连接速度、MAC地址、网络ID、信号强度等等) getBSSID() 获取BSSID

getDetailedStateOf() 获取客户端的连通性, getHiddenSSID() 获得SSID 是否被隐藏 getIpAddress() 获取IP 地址 getLinkSpeed() 获得连接的速度 getMacAddress() 获得Mac 地址

getRssi() 获得802.11n 网络的信号 getSSID() 获得SSID

getSupplicanState() 返回具体客户端状态的信息

WifiManager.WifiLock:

用于给wifi加锁,通常用于下载大体积文件的时候。

如果应用程序想在屏幕被关掉后继续使用WiFi则可以调用 acquire(), WifiLock来锁住WiFi,该操作会阻止WiFi进入睡眠状态。当应用程序不再使用WiFi时需要调用 release WifiLock来释放WiFi。之后WiFi可以进入睡眠状态以节省电源。

默认情况下当屏幕被关掉以后,如果没有应用程序在使用WiFi,WiFi会在2分钟后进入睡眠状态。这主要是为防止频繁地改变WiFi的电源模式。

wifiLock可通过setReferenceCounted(boolean refCounted)来设置加锁方式。一种是不计数锁,另一种是计数锁。

区别在于:前者无论 acquire() 了多少次,只要通过一次 release()即可解锁。后者正真解锁是在( --count == 0 )的时候。

wifisettings.java

packages/apps/Settings/src/com/android/settings/wifiwifisettings.java 该类数据部分主要定义了下面几个类的变量: {

private final IntentFilter mFilter;

privatefinal BroadcastReceiver mReceiver; //广播接收器,用来接收消息并做响应的处理工作 privatefinal Scanner mScanner; //这是一个扫描类,会在用户手动扫描 AP时被调用 private WifiInfo mLastInfo;

privateWifiManager mWifiManager; //服务代理端,作为WifiService对外的接口类呈现

//这个类主要实现Wifi的开闭工作 privateWifiEnabler mWifiEnabler; //AP

private AccessPoint mSelected; private WifiDialog mDialog; ?? }

WifiEnabler.java:

packages/apps/Settings/src/com/android/settings/wifi/WifiEnabler.java

private final Context mContext;

private Switch mSwitch;

private final WifiManager mWifiManager; private final IntentFilter mIntentFilter;

wifienabler类中定义了四个成员变量很重要,mContext,mSwitch,mWifiManager和mReceiver,其中mContext用于获取mwifiManager实例,mReceiver用来接收底层发来的消息,mSwitch用来改变UI的状态

该类中定义了几个重要的函数onCheckedChanged,handleWifiStateChanged和handleStateChanged,onCheckedChanged用来处理按下的Enbler键,它会调用mWifiManager.setWifiEnabled(enable),另外两个用来处理接受的消息事件

wpa_supplicant本是开源项目源码,被谷歌修改后加入android移动平台,它主要是用来支持WEP,WPA/WPA2和WAPI无线协议和加密认证的,而实际上的工作内容是通过socket(不管是wpa_supplicant与上层还是wpa_supplicant与驱动都采用socket通讯)与驱动交互上报数据给用户,而用户可以通过socket发送命令给wpa_supplicant调动驱动来对WiFi芯片操作。 简单的说,wpa_supplicant就是WiFi驱动和用户的中转站外加对协议和加密认证的支持。

一.Wifi启动流程

① 初始化

(frameworks/base/services/java/com/android/server/SystemServer.Java) 在 SystemServer 启动的时候,会生成一个ConnectivityService 的实例 try {

Slog.i(TAG, \ connectivity = new ConnectivityService(

context, networkManagement, networkStats, networkPolicy);


Android settings之Wifi学习 - 图文.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:Agilent1100高压液相色谱仪维护保养知识

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: