android Wifi简介

简介:

这里列了很多,但是大致可以分为四个主要的类ScanResult wifiConfiguration WifiInfo WifiManager
(1)ScanResult,主要是通过wifi 硬件的扫描来获取一些周边的wifi 热点的信息。
在我们进行wifi 搜索的时候,一般会搜到这些信息,首先是接入点名字、接入点信息的强弱、还有接入点使用的安全模式,是WPA、WPE。
打开这个类,我们可以看到以下几个信息
BSSID 接入点的地址,这里主要是指小范围几个无线设备相连接所获取的地址,比如说两台笔记本通过无线网卡进行连接,双方的无线网卡分配的地址。
SSID 网络的名字,当我们搜索一个网络时,就是靠这个来区分每个不同的网络接入点。
Capabilities 网络接入的性能,这里主要是来判断网络的加密方式等。
Frequency 频率,每一个频道交互的MHz 数。
Level 等级,主要来判断网络连接的优先数。
这里只提供了一个方法,就是将获得信息编程字符串toString()。
(2)wifiConfiguration 在我们连通一个wifi 接入点的时候,需要获取到的一些信息。大家可以跟我们有线的设备进行对比一下。
这里的数据相对来说比较复杂一下。
六个子类
WifiConfiguration.AuthAlgorthm 用来判断加密方法。
WifiConfiguration.GroupCipher 获取使用GroupCipher 的方法来进行加密。
WifiConfiguration.KeyMgmt 获取使用KeyMgmt 进行。
WifiConfiguration.PairwiseCipher 获取使用WPA 方式的加密。
WifiConfiguration.Protocol 获取使用哪一种协议进行加密。
wifiConfiguration.Status 获取当前网络的状态。
对于上述加密感兴趣的朋友,可以在网上搜索相关的内容。
设置WifiConfiguration的属性:
WifiConfiguration.AuthAlgorthm 设置加密方法。
可选参数:LEAP只用于leap,
OPEN 被wpa/wpa2需要,
SHARED需要一个静态的wep key
WifiConfiguration.GroupCipher 使用GroupCipher 的方法来进行加密。
可选参数:CCMP,TKIP,WEP104,WEP40
WifiConfiguration.KeyMgmt 键管理机制(keymanagerment),使用KeyMgmt 进行。
可选参数IEEE8021X,NONE,WPA_EAP,WPA_PSK
WifiConfiguration.PairwiseCipher 设置加密方式。
可选参数 CCMP,NONE,TKIP
WifiConfiguration.Protocol 设置一种协议进行加密。
可选参数 RSN,WPA,
wifiConfiguration.Status 设置当前网络的状态。
可选参数CURRENT,DISABLED,ENABLED,
(3)WifiInfo 在我们的wifi 已经连通了以后,可以通过这个类获得一些已经连通的wifi 连接的信息获取当前链接的信息,
这里信息就比较简单了,这里简单介绍一下这里的方法:
getBSSID() 获取BSSID
getDetailedStateOf() 获取客户端的连通性
getHiddenSSID() 获得SSID 是否被隐藏
getIpAddress() 获取IP 地址
getLinkSpeed() 获得连接的速度
getMacAddress() 获得Mac 地址
getRssi() 获得802.11n 网络的信号
getSSID() 获得SSID
getSupplicanState() 返回具体客户端状态的信息
(4)wifiManager 这个不用说,就是用来管理我们的wifi 连接,这里已经定义好了一些类,可以供我们使用。
这里来说相对复杂,里面的内容比较多,但是通过字面意思,我们还是可以获得很多相关的信息。这个类里面预先定义了许多常量,我们可以直接使用,不用再次创建。
这里还是简单介绍一下这里的方法:
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) 更新一个网络连接的信息
此外wifiManaer 还提供了一个内部的子类,也就是wifiManagerLock,WifiManagerLock 的作用是这样的,
在普通的状态下,如果我们的wifi 的状态处于闲置,那么网络的连通,将会暂时中断。
但是如果我们把当前的网络状态锁上,那么wifi 连通将会保持在一定状态,当然接触锁定之后,就会恢复常态

但是关于链接加密的wifi现在还没有成功……

附一个WifiAdmin 管理类:

package youcan.text;

import java.util.List;
import android.content.Context;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiManager.WifiLock;

public class WifiAdmin {
// 定义WifiManager对象
private WifiManager mWifiManager;
// 定义WifiInfo对象
private WifiInfo mWifiInfo;
// 扫描出的网络连接列表
private List<ScanResult> mWifiList;
// 网络连接列表
private List<WifiConfiguration> mWifiConfiguration;
// 定义一个WifiLock
WifiLock mWifiLock;

// 构造器
public WifiAdmin(Context context) {
   // 取得WifiManager对象
   mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
   // 取得WifiInfo对象
   mWifiInfo = mWifiManager.getConnectionInfo();
}

// 得到WifiManager对象
public WifiManager GetWifiManager() {
   return mWifiManager;
}

// 打开WIFI
public void OpenWifi() {
   if (!mWifiManager.isWifiEnabled()) {
  mWifiManager.setWifiEnabled(true);
   }
 }
// 关闭WIFI
public void CloseWifi() {
   if (!mWifiManager.isWifiEnabled()) {
    mWifiManager.setWifiEnabled(false);
   }
}

// 锁定WifiLock
public void AcquireWifiLock() {
   mWifiLock.acquire();
}
// 解锁WifiLock
public void ReleaseWifiLock() {
   // 判断时候锁定
   if (mWifiLock.isHeld()) {
    mWifiLock.acquire();
   }
}

// 创建一个WifiLock
public void CreatWifiLock() {
   mWifiLock = mWifiManager.createWifiLock("Test");
}

// 得到配置好的网络
public List<WifiConfiguration> GetConfiguration() {
   return mWifiConfiguration;
}

// 指定配置好的网络进行连接
public void ConnectConfiguration(int index) {
   // 索引大于配置好的网络索引返回
   if (index > mWifiConfiguration.size()) {
    return;
   }
   // 连接配置好的指定ID的网络
   mWifiManager.enableNetwork(mWifiConfiguration.get(index).networkId,
     true);
}

public void StartScan() {
   mWifiManager.startScan();
   // 得到扫描结果
   mWifiList = mWifiManager.getScanResults();
   // 得到配置好的网络连接
   mWifiConfiguration = mWifiManager.getConfiguredNetworks();
}

// 得到网络列表
public List<ScanResult> GetWifiList() {
   return mWifiList;
}

// 查看扫描结果
public StringBuilder LookUpScan() {
   StringBuilder stringBuilder = new StringBuilder();
   for (int i = 0; i < mWifiList.size(); i++) {
    stringBuilder
      .append("Index_" + new Integer(i + 1).toString() + ":");
    // 将ScanResult信息转换成一个字符串包
    // 其中把包括:BSSID、SSID、capabilities、frequency、level
    stringBuilder.append((mWifiList.get(i)).toString());
    stringBuilder.append("n");
   }
   return stringBuilder;
}

// 得到MAC地址
public String GetMacAddress() {
   return (mWifiInfo == null) ? "NULL" : mWifiInfo.getMacAddress();
}
// 得到接入点的BSSID
public String GetBSSID() {
   return (mWifiInfo == null) ? "NULL" : mWifiInfo.getBSSID();
}

// 得到IP地址
public int GetIPAddress() {
   return (mWifiInfo == null) ? 0 : mWifiInfo.getIpAddress();
}

// 得到连接的ID
public int GetNetworkId() {
   return (mWifiInfo == null) ? 0 : mWifiInfo.getNetworkId();
}

// 得到WifiInfo的所有信息包
public String GetWifiInfo() {
   return (mWifiInfo == null) ? "NULL" : mWifiInfo.toString();
}

// 添加一个网络并连接
public void AddNetwork(WifiConfiguration wcg) {
   int wcgID = mWifiManager.addNetwork(wcg);
   mWifiManager.enableNetwork(wcgID, true);
}

// 断开指定ID的网络
public void DisconnectWifi(int netId) {
   mWifiManager.disableNetwork(netId);
   mWifiManager.disconnect();
}
}


Wifi的补充

1.wifi的五种状态:
WIFI_STATE_DISABLED   WIFI网卡不可用 
WIFI_STATE_DISABLING  WIFI网卡正在关闭 
WIFI_STATE_ENABLED     WIFI网卡可用 
WIFI_STATE_ENABLING    WIFI网卡正在打开 
WIFI_STATE_UNKNOWN    WIFI网卡状态不可知
2.要操作WiFi设备,就要使用Context.getSystemService(Context.WIFI_SERVICE)来获取WifiManager对象,并通过这个对象来管理WiFi设备。
addNetwork(WifiConfiguration config)

 添加一个config描述的WIFI网络,默认情况下,这个WIFI网络是DISABLE状态的。
calculateSignalLevel(int rssi , int numLevels)

 计算信号的等级
compareSignalLevel(int rssiA, int rssiB)

 对比网络A和网络B的信号强度
createWifiLock(int lockType, String tag)

 创建一个WIFI 锁,锁定当前的WIFI连接
disableNetwork(int netId)

 让一个网络连接失效
disconnect()

 断开当前的WIFI连接
enableNetwork(int netId, Boolean disableOthers)

 连接netId所指的WIFI网络,并是其他的网络都被禁用
getConfiguredNetworks()

 获取网络连接的状态
getConnectionInfo()

 获取当前连接的信息
getDhcpInfo()

 获取DHCP 的信息
getScanResulats()

 获取扫描测试的结果
getWifiState()

 获取当前WIFI设备的状态
isWifiEnabled()

 判断WIFI设备是否打开
pingSupplicant()

 ping操作,和PC的ping操作相同作用
ressociate()

 重新连接WIFI网络,即使该网络是已经被连接上的
reconnect()

 重新连接一个未连接上的WIFI网络
removeNetwork()

 移除某一个网络
saveConfiguration()

 保留一个配置信息
setWifiEnabled()

 让一个连接有效
startScan()

 开始扫描
updateNetwork(WifiConfiguration config)

 更新一个网络连接
3.如果要想得到周围的WIFI热点列表,可以使用WifiManager.getScanResults()返回一个ScanResult列表,ScanResult对象中,包含了以下几个属性:

BSSID 接入点的地址
SSID 网络的名字,唯一区别WIFI网络的名字
Capabilities 网络接入的性能
Frequency 当前WIFI设备附近热点的频率(MHz)
Level 所发现的WIFI网络信号强度
4.连接上自定义的WIFI?
//根据ID值来自动连接WIFI网络

//@param index ID值

public void ConnectWifiBySSID(int index) {

    // 索引大于配置好的网络索引返回

    if (index > mWifiConfiguration.size()) {

     return;

    }

    // 连接配置好的指定ID的网络

    mWifiManager.enableNetwork(mWifiConfiguration.get(index).networkId,true);

 }

// 根据WifiConfiguration对象来自动连接WIFI网络

// @param wcg WifiConfiguration对象

 public void ConnectWifiByConfig(WifiConfiguration wifiConfiguration) {

    int wcgID = mWifiManager.addNetwork(wifiConfiguration);

    mWifiManager.enableNetwork(wcgID, true);

}

5.查看已经连接上的WIFI信息,在Android的SDK中为我们提供了一个叫做WifiInfo的对象,这个对象可以通过WifiManager.getConnectionInfo()来获取。WifiInfo中包含了当前连接中的相关信息。


getBSSID()  获取BSSID属性
getDetailedStateOf()  获取客户端的连通性
getHiddenSSID()  获取SSID 是否被隐藏
getIpAddress()  获取IP 地址
getLinkSpeed()  获取连接的速度
getMacAddress()  获取Mac 地址
getRssi()  获取802.11n 网络的信号
getSSID()  获取SSID
getSupplicanState()  获取具体客户端状态的信息


相关文章
|
3月前
|
Android开发 Python
Python封装ADB获取Android设备wifi地址的方法
Python封装ADB获取Android设备wifi地址的方法
61 0
|
4月前
|
XML API Android开发
Android WIFI使用简述(上)
Android WIFI使用简述(上)
|
4月前
|
缓存 算法 Java
Linux内核新特性年终大盘点-安卓杀后台现象减少的背后功臣MGLRU算法简介
MGLRU是一种新型内存管理算法,它的出现是为了弥补传统LRU(Least Recently Used)和LFU(Least Frequently Used)算法在缓存替换选择上的不足,LRU和LFU的共同缺点就是在做内存页面替换时,只考虑内存页面在最近一段时间内被访问的次数和最后一次的访问时间,但是一个页面的最近访问次数少或者最近一次的访问时间较早,可能仅仅是因为这个内存页面新近才被创建,属于刚刚完成初始化的年代代页面,它的频繁访问往往会出现在初始化之后的一段时间里,那么这时候就把这种年轻代的页面迁移出去
|
6月前
|
SQL 人工智能 Java
Android 命令行工具简介
Android SDK 中包含了开发应用所需的多个软件包。本页列出了可供使用的最重要的命令行工具(按提供这些工具的软件包整理)。
|
6月前
|
SQL 人工智能 移动开发
Android etc1tool之png图片转换pkm 和 zipalign简介
etc1tool 是一种命令行实用程序,可用于将 PNG 图片编码为 ETC1 压缩标准格式(PKM),并将 ETC1 压缩图片解码回 PNG。
|
8月前
|
Java Linux API
#1,Android 体系结构 2000字简介 入门Android(Studio)开发
#1,Android 体系结构 2000字简介 入门Android(Studio)开发
|
4月前
|
API 数据安全/隐私保护 Android开发
Android WIFI使用简述(下)
Android WIFI使用简述(下)
|
4月前
|
Android开发 网络架构
【Android App】检查手机连接WiFi信息以及扫描周围WiFi的讲解及实战(附源码和演示 超详细必看)
【Android App】检查手机连接WiFi信息以及扫描周围WiFi的讲解及实战(附源码和演示 超详细必看)
181 1
|
4月前
|
Linux 网络安全 开发工具
Android APP入门之Android的简介以及Android Studio开发环境的搭建和测试(2022最新 图文解释 简单易懂)
Android APP入门之Android的简介以及Android Studio开发环境的搭建和测试(2022最新 图文解释 简单易懂)
63 0
|
4月前
|
Java 测试技术 持续交付
百度搜索:蓝易云【NetMock简介:简化 Java,Android和Kotlin多平台中的HTTP请求测试?】
使用NetMock,您可以在单元测试、集成测试和端到端测试中轻松地模拟和验证HTTP请求和响应,而无需实际发送请求到外部服务。这样可以提高测试的可靠性和可控性,并加快测试执行的速度。无论是在开发过程中还是在持续集成环境中,NetMock都可以帮助您更轻松地进行HTTP请求测试,提高代码质量和稳定性。
41 1