Android学习笔记24——WiFi

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);
    }
}

2.扫描WiFi信号

//扫描wifi
public void WifiStartScan(){
    localWifiManager.startScan();
}

3.得到扫描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));
    }
}

4.根据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;
}

5.如果需要连接的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;
}

6.根据步骤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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
随着人们对基于位置的服务(Location Based Service,LBS)需求日益增大,以及无线通信技术的快速发展,无线定位技术成为了一个研究热点。人们在室外广泛使用目前较成熟的GPS,A-GPS等定位系统进行定位,但是在复杂的室内环境中,这些技术的定位精度不高,不能满足室内定位的需求。WIFI网络具有通信快速、部署方便的特点,它在室内场所广受欢迎.Android系统从几年前发布以来在智能手机操作系统市场占有率不断升高,成为目前使用最为广泛的智能手机操作系统,同时Android移动终端自身具备WIFI无线连接功能。指纹定位算法以其独特的优势减小了对室内难以精确定义的信号传播模型的依赖性,成为定位技术中的一个研究热点。基于此,本课题重点研究并改进指纹定位算法,设计实现基于AndroidWIFI室内定位系统。 首先,通过阅读大量相关的文献资料,对比分析了当前国内外WIFI室内指纹定位技术的研究现状对其中涉及到的相关技术的原理和特点进行介绍分析,包括WIF1无线通信技术,室内无线定位技术以及位置指纹定位技术,并根据室内WIFI指纹定位技术的特征对定位过程中的影响因素进行分析。 其次,根据前面提到的定位过程中的关键影响因素,介绍了对应的解决方案。分析与研究了几种典型的指纹定位算法,包括最近邻法(NN).K近邻法(KNN)、K加权近邻法(WKNN),并提出算法的改进方案,使用MATLAB软件进行算法的仿真分析,寻求其中的最佳参数值以及定位性能差异。通过分析几种算法的性能仿真结果,拟定了基于最强AP法的改进算法作为定位系统采纳的算法。 然后,通过对基于AndroidWIFI室内定位系统的需求分析,提出了一种基于Android 的WIF1室内定位系统设计方案。接着介绍了定位系统软件开发环境,并设计了定位系统总体架构,以及定位系统的各个功能模块。在各项设计确定以后,采用JAVA语言编程实现定位系统的各项功能。 最后,搭建了WIFI室内定位实验环境,使用完成的室内定位系统结合硬件资源,在实验环境下,进行离线阶段创建数据库以及在线阶段的定位测试,并记录呈现在定位客户端上定位结果,分析对应的定位性能.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值