侧边栏壁纸
博主头像
极客日记 博主等级

行动起来,活在当下

  • 累计撰写 93 篇文章
  • 累计创建 17 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

Android WiFi类

Jack.Jia
2022-10-06 / 0 评论 / 0 点赞 / 8 阅读 / 0 字

WiFi 类

WiFi 是一种无线联网技术,常见的是使用无线路由器。那么在这个信号覆盖的范围内都可以采用 WiFi 连接的方式进行联网。如果无线路由器连接了一个 ADSL 线路或者其他的联网线路,则又被称为“热点”。
在 Android 中对 WiFi 操作,Android 本身提供一些有用的包,在 anroid.net.wifi 包下面。

WiFi 常用的类

ScanResult

主要用来描述已经检测出的接入点,包括接入点地址,接入点名称,身份认证,频率,信号强度等信息。

WifiConfiguration

Wifi 网络的配置,包括安全设置等,在我们连通一个 wifi 接入点的时候,需要获取到的一些信息。主要包含四个属性:

BSSID

是一种特殊的 Ad-hoc LAN(一种支持点对点访问的无线网络应用模式) 的应用,一个无线网络至少由一个连接到有线网络的 AP 和若干无线工作站组成,这种配置称为一个基本服务装置。一群计算机设定相同的
BSS 名称,即可自成一个 group,而此 BSS 名称,即所谓 BSSID。通常,手机 WLAN 中,bssid 其实就是无线路由的 MAC 地址。

networkid

网络 ID。

PreSharedKey

无线网络的安全认证模式。

SSID

SSID(Service Set Identif) 用于标识无线局域网,SSID 不同的无线网络是无法进行互访的。

WifiInfo

wifi 无线连接的描述,包括接入点,网络连接状态,隐藏的接入点,IP 地址,连接速度,MAC 地址,网络 ID,信号强度等信息。这里简单介绍一下这里的方法:

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

WiFiManager

用来管理我们的 wifi 连接,这里已经定义好了一些类,可以供我们使用,获取 WiFi 网卡状态。

WiFi 常量

WIFI 网卡的状态是由一系列的整形常量来表示的。

WIFI_STATE_DISABLING = 0   WIFI网卡正在关闭
WIFI_STATE_DISABLED = 1    WIFI网卡不可用
WIFI_STATE_ENABLING = 2    WIFI网正在打开 (WIFI启动需要一段时间)
WIFI_STATE_ENABLED = 3     WIFI网卡可用
WIFI_STATE_UNKNOWN = 4     未知网卡状态
WIFI_AP_STATE_DISABLING = 10   WIFI热点正在关闭
WIFI_AP_STATE_DISABLED = 11    WIFI热点不可用
WIFI_AP_STATE_ENABLING = 12    WIFI热点正在打开
WIFI_AP_STATE_ENABLED = 13     WIFI热点可用

WiFi 权限

WiFi 需求申请权限,在 AndroidManifest.xml 文件中填写。

1.<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>//改变WiFi状态。

2.  <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>//改变WiFi多播状态

3.  <uses-permission
android:name="android.permission.ACCESS_NETWORK_STATE"/>//获取WiFi状态。

4.  <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

常用的方法

  1. 打开 WiFi
//开启WiFi
public void WiFiOpen(){
    if(!localWifiManager.isWifiEnabled()){
      localWifiManager.setWifiEnabled(true);
    }
}
  1. 扫描 WiFi 信号
//扫描wifi
public void WifiStartScan(){
    localWifiManager.startScan();
}
  1. 得到扫描 WIFI 结果
//得到Wifi配置好的信息
public void getConfiguration(){
    wifiConfigList =localWifiManager.getConfiguredNetworks()//得到配置好的网络信息
    for(int i =0;i<wifiConfigList.size();i++){
        Log.i("getConfiguration",wifiConfigList.get(i).SSID);             
        Log.i("getConfiguration",String.valueOf(wifiConfigList.get(i).networkId));
    }
}
  1. 根据 WIFI 的名称 SSID 判定指定 WIFI 是否已经配置好,配置好则返回其 networkId,用于连接。之前尝试了 BSSID 地址没成功,所以只能使用 SSID

    //判定指定WIFI是否已经配置好,依据WIFI的地址BSSID,返回NetId
    public int IsConfiguration(String SSID){
    Log.i("IsConfiguration",String.valueOf(wifiConfigList.size()));
    for(int i = 0; i < wifiConfigList.size(); i++){
    Log.i(wifiConfigList.get(i).SSID,String.valueOf(wifiConfigList.get(i).networkId));
    if(wifiConfigList.get(i).SSID.equals(SSID)){//地址相同
        return wifiConfigList.get(i).networkId;
      }
    }
        return -1;
    }
    
  2. 如果需要连接的 WIFI 没有配置好,即没有保存密码。则为指定名称 ssid 的 WIFI 添加密码信息 psw,添加成功后返回给其分配的 networId,同于连接

//添加指定WIFI的配置信息,原列表不存在此SSID
public int AddWifiConfig(List<ScanResult> wifiList,String ssid,String pwd){
    int wifiId = -1;
    for(int i = 0;i < wifiList.size(); i++){
        ScanResult wifi = wifiList.get(i);
        if(wifi.SSID.equals(ssid)){
            Log.e("AddWifiConfig","equals");
            WifiConfiguration wifiCong = new WifiConfiguration();
            wifiCong.SSID = "\""+wifi.SSID+"\"";//\"转义字符,代表"
            wifiCong.preSharedKey = "\""+pwd+"\"";//WPA-PSK密码
            wifiCong.hiddenSSID = false;
            wifiCong.status = WifiConfiguration.Status.ENABLED;
            wifiId = localWifiManager.addNetwork(wifiCong);//将配置好的特
定WIFI密码信息添加,添加完成后默认是不激活状态,成功返回ID,否则为-1
            if(wifiId != -1){
                return wifiId;
            }
        }
    }
    return wifiId;
}
  1. 根据步骤 6 配置好需要连接的 WIFI 密码信息后,下面通过 networkId 连接指定 WIFI。在连接经过步骤 6 刚添加配置信息的 WIFI 信号之前需要重新执行下步骤 4,得到新的配置好信息的列表。
//连接指定Id的WIFI
public boolean ConnectWifi(int wifiId){
    for(int i = 0; i < wifiConfigList.size(); i++){
        WifiConfiguration wifi = wifiConfigList.get(i);
        if(wifi.networkId == wifiId){
            while(!(localWifiManager.enableNetwork(wifiId, true))){//激活该Id,建立连接
            //status:0--已经连接,1--不可连接,2--可以连接
            Log.i("ConnectWifi",String.valueOf(wifiConfigList.get(w
ifiId).status));
            }
            return true;
        }
    }
    return false;
}
0

评论区