• Android Wi-Fi基本操作


    从用户角度看,Android Wi-Fi模块自下向上可以看为5层:硬件驱动程序,wpa_suppplicant,JNI,WiFi API,WifiSettings应用程序。

    1.wpa_supplicant是一个开源库,是android实现Wi-Fi功能的基础,它从上层接到命令后,通过Socket与硬件驱动进行通讯,操作硬件完成需要的操作。

    2.JNI(Java Native Interface)实现了java代码与其他代码的交互,使得在java虚拟机中运行的java代码能够与其他语言编写的应用程序和库进行交互,在android中,JNI可以让java程序调用C程序。

    3.Wi-Fi API使应用程序可以使用Wi-Fi的功能。

    4.Wi-FI Settings应用程序是android中自带的一个应用程序,选择手机的Settings->WireLess & netWorks->Wi-Fi,可以让用户手动打开或关闭Wi-Fi功能。当用户打开Wi-Fi功能后,它会自动搜索周围的无线网络,并以列表的形式显示,供用户选择。默认会连接用户上一次成功连接的无线网络。

    在android.net.wifi包中提供了一些类管理设备的Wi-Fi功能。主要包括ScanResult,wifiConfiguration,WifiInfo,WifiManager.

    1.ScanResult

    ScanResult主要是通过Wi-Fi硬件的扫描来获取一些周边的Wi-Fi热点的信息。该类包括以下五个域:

    返回类型     域名       解释          
    public String    BSSID   接入点地址
    public String  SSID 网络的名称
    public String capabilities 网络性能,包括介入点支持的认证,密钥管理,加密机制等
    public int  frequency 以MHz为单位的接入频率
    public int level 以dBm为单位的信号强度

    该类还提供了一个方法toString(),可将结果转换为简洁,易读的字符串形式。

    2.wifiConfiguration类

    通过该类可获取一个Wi-Fi网络的网络配置,包括安全配置等。该类包括六个子类,如下:

    子类     解释
    WifiConfiguration.AuthAlgorthm 获取IEEE802.11的加密方法
    WifiConfiguration.GroupCipher 获取组密钥
    WifiConfiguration.KeyMgmt 获取密码管理机制
    WifiConfiguration.PairwiseCipher 获取WPA方式的成对密钥
    WifiConfiguration.Protocol 获取机密协议
    WifiConfiguration.Status 获取当前网络状态

    每个子类都以常量形式给出相关的配置信息,有些还包括含域和方法。

    3.WifiInfo类

    通过该类可以获取已经建立或处于活动状态的Wi-Fi网络的状态信息。该类提供的方法较多,部分常用的如下:

    方法     解释
    getBSSIS() 获取当前接入点的BSSID
    getIpAddress() 获取IP地址
    getLinkSpeed() 获取当前连接的速度
    getMacAddress() 获取MAC地址
    getRssi() 获得802.11n网络的信号强度指示
    getSSID() 获得网络SSID
    getSupplicanState() 返回客户端状态的信息

    4.wifiManager类

    该类用于管理Wi-Fi连接,其定义了26个常量和23个方法。下面列出常用方法:

    方法       解释      
    addNetwork(WifiConfiguration  config)   向设置好的网络里添加新网络
    calculateSignalLevel(int rssi,int numLevels)   计算信号的等级
    compareSignalLevel(int rssiA,int rssiB) 对比两个信号的强度
    createWifiLock(int lockType,String tag) 创建一个Wi-Fi锁,锁定当前的Wi-Fi连接 
    disableNetWork(int netId) 让一个网络连接失败
    disconnect()   与当前接入点断连接
    enableNetwork(int netId,Boolean disableOthers) 与之前设置好的网络建立连接
    getConfiguredNetworks() 客户端获取网络连接状态
    getConnectionInfo() 获取当前连接信息
    getDhcpInfo() 获取DHCP信息
    getScanResult() 获取扫描测试结果
    getWifiState()   获取一个Wi-Fi接入点是否有效
    isWifiEnabled()   判断一个Wi-Fi连接是否有效
    pingSupplicant()   看看客户后台程序是否响应请求
    ressociate() 重连到接入点,即使已经连接上了
    reconnect() 如果现在没有连接的话,则重连接
    removeNetwork(int netId) 移出某一个特定网络
    saveConfiguration() 保留一个配置信息
    setWifiEnabled(boolean enabled) 让一个连接有效或失效
    startScan()   开始扫描
    updateNetwork(WifiConfiguration config) 更新一个网络连接信息

    需要指出的是,Wi-Fi网卡状态是由一系列的整型常量来表示的。

    WIFI_STATE_DISABLED:Wi-Fi网卡不可用,用整型常量1表示。

    WIFI_STATE_DISABLING:Wi-Fi网卡正在关闭,用整型常量0表示。

    WIFI_STATE_ENABLED:Wi-Fi网卡可用,用整型常量3表示。

    WIFI_STATE_ENABLING:Wi-Fi网卡正在打开,启动需要一段时间,用整型常量2表示。

    WIFI_STATE_UNKNOWN:未知网卡状态,用整型常量4表示。

    此外wifiManager还提供了一个子类wifiManagerLock.wifiManagerLock的作用是这样的:在普通的状态下,如果Wi-Fi的状态处于闲置,那么网络将会暂时中断;但是如果把当前的网络状态锁上,那么Wi-Fi连通将会保持在一定的状态,在结束锁定之后,才会恢复常态。

    下面简单介绍一些方法的调用方式

    private WifiInfo mWifiInfo;

    private WifiManager mWifiManager;

    1.获取WifiManager系统服务

    mWifiManager=(WifiManager)context.getSystemService(Context.WIFI_SERVICE);

    2.重新获取当前Wi-Fi的连接信息

    public void againGetWifiInfo(){

      mWifiInfo=mWifiManager.getConnectionInfo();

    }

    3.判断用户是否开启wi-fi网卡

    public boolean isNetCardFriendly(){

      return mWifiManager.isWifiEnabled();

    }

    4.判断当前是否连接Wi-Fi

    private State state;

    //创建连接管理器

    private ConnectivityManager connManager;

    public boolean isConnectioning(){

      state=connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();

      if(State.CONNECTING==state){

        return true;

      }else{

        return false;

      }

    }

    5.得到当前网络的连接状态

    public State getCurrentState(){

      state=connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();

      return state;

    }

    6.设置配置好的网络(有密码的网络并配置好密码),指定的

    //网络连接列表

    private List<WifiConfiguration> wifiConfigList=new ArrayList<WifiConfiguration>();

    //Wi-Fi配置列表

    private List<WifiConfiguration> wifiConfigedSpecifiedList=new ArrayList<WifiConfiguration>();

    public void setWifiConfigedSpecifiedList(String ssid){

      wifiConfigedSpecifiedList.clear();

      if(wifiConfigList!=null){

        for(WifiConfiguration item : wifiConfigList){

          //如果是指定的网络,就加入列表

          if(item.SSID.equalsIgnoreCase("""+ssid+""")&& item.preSharedKey!=null){

            //添加到列表中

            wifiConfigedSpecifiedList.add(item);

          }

        }

      }

    }

    7.返回Wi-Fi设置列表

    public List<WifiConfiguration> getWifiConfigedSpecifiedList(){

      return wifiConfigedSpecifiedList;

    }

    8.打开Wi-Fi网卡

    public void openNetCard(){

      if(!mWifiManager.isWifiEnabled()){

        mWifiManager.setWifiEnabled(true);

      }

    }

    9.关闭Wi-Fi网卡

    public void closeNetCard(){

      if(mWifiManager.isWifiEnabled()){

        mWifiManager.setWifiEnabled(false);

      }

    }

    10.检查当前Wi-Fi网卡状态

    public void checkNetCardState(){

      if(mWifiManager.getWifiState()==0){

        Log.i("","网卡正在关闭");

      }else if(mWifiManager.getWifiState()==1){

        Log.i("","网卡已经关闭");

      }else if(mWifiManager.getWifiState()==2){

        Log.i("","网卡正在打开");

      }else if(mWifiManager.getWifiState()==3){

        Log.i("","网卡已经打开");  

      }else{

        Log.i("","没有获取到状态");

      }

    }

    11.扫描周边网络

    //保存扫描结果列表

    public List<ScanResult> listResult=new ArrayList<ScanResult>();

    public void scan(){

      //开始扫描

      mWifiManager.startScan();

      //获取扫描结果

      listResult=mWifiManager.getScanResults();

      //扫描配置列表

      wifiConfigList=mWifiManager.getConfiguredNetworks();

      if(listResult!=null){

        //当前存在无线网络

      }else{

        //当前区域没有无线网络  

      }

    }

    12.返回扫描结果

    public List<ScanResult> getListResult(){

      return listResult;

    }

    13.得到扫描结果

    //存储扫描结果

    private StringBuffer mStringBuffer=new StringBuffer();

    private ScanResult mScanResult;

    public String getScanResult(){

      //每次点击扫描之前清空上一次扫描结果

      if(mStringBuffer!=null){

        mStringBuffer=new StringBuffer();  

      }

      //开始扫描调用11的方法

      scan();

      listResult=mWifiManager.getScanResults();

      if(listResult!=null){

        for(int i=0;i<listResult.size();i++){

          mScanResult=listResult.get(i);

          //将需要的属性连接到字符串里面 

         mStringBuffer.append("NO.").append(i+1).append(" :").append(mScanResult.SSID).append("->").append(mScanResult.BSSID).append("->").append(mScanResult.capabilities).append("->").append(mScanResult.frequency).append("->").append(mScanResult.level).append("->").append(mScanResult.describeContents()).append(" ");

        }

      }

      return mStringBuffer.toString();

    }

    14.断开当前连接的网络

    public void disconnectWifi(){

      //获取网络ID

      int newId=getNetworkId();

      //设置网络不可用

      mWifiManager.disableNetWork(netId);

      //断开网络

      mWifiManager.disconnect();

      //设置Wi-Fi信息为NULL

      mWifiInfo=null;

    }

    15.检查当前网络状态

    public Boolean checkNetWorkState(){

      if(mWifiInfo!=null){

        return true;

      }else{

        return false;

      }

    }

    16.得到连接的ID

    public int getNetworkId(){

      return (mWifiInfo==null)?0:mWifiInfo.getNetworkId();

    }

    17.得到IP地址

    public void getIPAddress(){

       return (mWifiInfo==null)?0:mWifiInfo.getIpAddress();

    }

    18.锁定WifiLock

    WinfiLock mWifiLock;

    public void acquireWifilock(){

      mWifiLock.acquire();

    }

    19.解锁WifiLock

    public void releaseWifiLock(){

      if(mWifiLock.isHeld()){

        mWifiLock.acquire();

      }

    }

    20.创建一个WifiLock

    public void creatWifiLock(){

      mWifiLock=mWifiManager.createWifiLock("test");

    }

    21.得到配置好的网络wpa_supplicant.conf中的内容,不管有没有配置密码

    public List<WifiConfiguration> getConfiguration(){

      return wifiConfigList;

    }

    22.指定配置好的网络连接

    public Boolean connectConfiguration(int index)(){

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

      if(index>=wifiConfigList.size()){

        return false;

      }

      return mWifiManager.enableNetwork(wifiConfigedSpecifiedList.get(index).networkId,true);

    }

    23.得到MAX地址

    public String getMacAddress(){

      return (mWifiInfo=null)?"":mWifiInfo.getMacAddress(); 

    }

    24.得到接入点BSSID

    public String getBSSID(){

      return (mWifiInfo=null)?"NULL":mWifiInfo.getBSSID();

    }

    25.得到WifiInfo的所有信息包

    public String getWifiInfo(){

      return (mWifiInfo=null)?"NULL":mWifiInfo.toString();

    }

    26.添加一个网络并连接

    public int addNetwork(WifiConfiguration g){

      //添加网络

      int wcgID=mWifiManager.addNetwork(g);

      //设置添加的网络可用

      mWifiManager.enableNetwork(wcgID,true);

      return wcgID;

    }

  • 相关阅读:
    力扣----4. 有效的括号(JavaScript, Java实现)
    力扣----3. 无重复字符的最长子串(JavaScript, Java实现)
    力扣----2. 两数相加(JavaScript, Java实现)
    力扣----1. 两数之和(JavaScript, Java实现)
    sql server实现copy data功能的存储过程(公共代码)
    inner join 与 left join 与 right join之间的区别
    redux
    Spring Boot-3 (@PathVariable和@RequestParam)
    小程序 wx.request
    小程序 -- ui布局
  • 原文地址:https://www.cnblogs.com/liyuanjinglyj/p/4409537.html
Copyright © 2020-2023  润新知