【Android】wifi开发

来源:互联网 发布:淘宝黑搜索技术出售 编辑:程序博客网 时间:2024/05/30 04:53

wifi的基本结构

在Android的官方文档中定义了如下五种状态:

WIFI_STATE_DISABLING  WIFI网卡正在关闭  0

WIFI_STATE_DISABLED   WIFI网卡不可用  1
WIFI_STATE_ENABLING    WIFI网卡正在打开  2
WIFI_STATE_ENABLED     WIFI网卡可用  3
WIFI_STATE_UNKNOWN    WIFI网卡状态不可知 4

要操作WIFI设备,就需要使用Context.getSystemService(Context.WIFI_SERVICE)来获取WifiManager对象,并通过这个对象来管理我们的WIFI设备。
如果要想得到周围的WIFI热点列表,可以使用WifiManager.getScanResults()返回一个ScanResult列表

这里列了很多,但是大致可以分为四个主要的类: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 连通将会保持在一定状态,当然接触锁定之后,就会恢复常态

【Android】wifi开发

WIFI就是一种无线联网技术,常见的是使用无线路由器。那么在这个无线路由器的信号覆盖的范围内都可以采用WIFI连接的方式进行联网。如果无线路由器连接了一个ADSL线路或其他的联网线路,则又被称为“热点”。

在Android中对Wifi操作,android本身提供了一些有用的包,在android.net.wifi包下面。主要包括以下几个类和接口:

1.ScanResult

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

2.WifiConfiguration

 Wifi网络的配置,包括安全设置等。

3.WifiInfo

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

       getBSSID() 获取BSSID

       getDetailedStateOf() 获取客户端的连通性

       getHiddenSSID() 获得SSID 是否被隐藏

       getIpAddress() 获取IP 地址

       getLinkSpeed() 获得连接的速度

       getMacAddress() 获得Mac 地址

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

       getSSID() 获得SSID

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

4.WifiManager

  这个不用说,就是用来管理我们的wifi 连接,这里已经定义好了一些类,可以供我们使用。

  获取WIFI网卡的状态
  WIFI网卡的状态是由一系列的整形常量来表示的。
  1.WIFI_STATE_DISABLED : WIFI网卡不可用(1)
  2.WIFI_STATE_DISABLING : WIFI网卡正在关闭(0)
  3.WIFI_STATE_ENABLED : WIFI网卡可用(3)
  4.WIFI_STATE_ENABLING : WIFI网正在打开(2) (WIFI启动需要一段时间)

  5.WIFI_STATE_UNKNOWN  : 未知网卡状态

   下面先写一个wifi的实例:

首先看以下main.xml:

 <?xml version="1.0" encoding="utf-8"?>  
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent"  
     >  
  
 <LinearLayout  
    android:orientation="vertical"    
    android:layout_width="fill_parent"    
    android:layout_height="fill_parent"    
    >    
<Button    
    android:id="@+id/scan"    
    android:layout_width="wrap_content"     
    android:layout_height="wrap_content"     
    android:text="扫描网络"    
    />    
<Button    
    android:id="@+id/start"    
    android:layout_width="wrap_content"     
    android:layout_height="wrap_content"     
    android:text="打开Wifi"    
    />    
<Button    
    android:id="@+id/stop"    
    android:layout_width="wrap_content"     
    android:layout_height="wrap_content"     
    android:text="关闭Wifi"    
    />    
<Button    
    android:id="@+id/check"    
    android:layout_width="wrap_content"     
    android:layout_height="wrap_content"     
    android:text="Wifi状态"    
    />    
  <TextView    
    android:id="@+id/allNetWork"    
    android:layout_width="fill_parent"    
    android:layout_height="wrap_content"     
    android:text="当前没有扫描到Wifi网络"    
    />    
    </LinearLayout>  
</ScrollView>  


接下来我们吧wifi的相关操作都封装在了一个WifiAdmin类中,以后开启或关闭等相关操作可以直接调用这个类的相关方法:

 

复制代码
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> mWifiConfigurations;      WifiLock mWifiLock;      public WifiAdmin(Context context){          //取得WifiManager对象          mWifiManager=(WifiManager) context.getSystemService(Context.WIFI_SERVICE);          //取得WifiInfo对象          mWifiInfo=mWifiManager.getConnectionInfo();      }      //打开wifi      public void openWifi(){          if(!mWifiManager.isWifiEnabled()){              mWifiManager.setWifiEnabled(true);          }      }      //关闭wifi      public void closeWifi(){          if(!mWifiManager.isWifiEnabled()){              mWifiManager.setWifiEnabled(false);          }      }       // 检查当前wifi状态        public int checkState() {            return mWifiManager.getWifiState();        }        //锁定wifiLock      public void acquireWifiLock(){          mWifiLock.acquire();      }      //解锁wifiLock      public void releaseWifiLock(){          //判断是否锁定          if(mWifiLock.isHeld()){              mWifiLock.acquire();          }      }      //创建一个wifiLock      public void createWifiLock(){          mWifiLock=mWifiManager.createWifiLock("test");      }      //得到配置好的网络      public List<WifiConfiguration> getConfiguration(){          return mWifiConfigurations;      }      //指定配置好的网络进行连接      public void connetionConfiguration(int index){          if(index>mWifiConfigurations.size()){              return ;          }          //连接配置好指定ID的网络          mWifiManager.enableNetwork(mWifiConfigurations.get(index).networkId, true);      }      public void startScan(){          mWifiManager.startScan();          //得到扫描结果          mWifiList=mWifiManager.getScanResults();          //得到配置好的网络连接          mWifiConfigurations=mWifiManager.getConfiguredNetworks();      }      //得到网络列表      public List<ScanResult> getWifiList(){          return mWifiList;      }      //查看扫描结果      public StringBuffer lookUpScan(){          StringBuffer sb=new StringBuffer();          for(int i=0;i<mWifiList.size();i++){              sb.append("Index_" + new Integer(i + 1).toString() + ":");               // 将ScanResult信息转换成一个字符串包                // 其中把包括:BSSID、SSID、capabilities、frequency、level                sb.append((mWifiList.get(i)).toString()).append("\n");          }          return sb;        }      public String getMacAddress(){          return (mWifiInfo==null)?"NULL":mWifiInfo.getMacAddress();      }      public String getBSSID(){          return (mWifiInfo==null)?"NULL":mWifiInfo.getBSSID();      }      public int getIpAddress(){          return (mWifiInfo==null)?0:mWifiInfo.getIpAddress();      }      //得到连接的ID      public int getNetWordId(){          return (mWifiInfo==null)?0:mWifiInfo.getNetworkId();      }      //得到wifiInfo的所有信息      public String getWifiInfo(){          return (mWifiInfo==null)?"NULL":mWifiInfo.toString();      }      //添加一个网络并连接      public void addNetWork(WifiConfiguration configuration){          int wcgId=mWifiManager.addNetwork(configuration);          mWifiManager.enableNetwork(wcgId, true);      }      //断开指定ID的网络      public void disConnectionWifi(int netId){          mWifiManager.disableNetwork(netId);          mWifiManager.disconnect();      }  }  
复制代码

 

 

最后看以下WifiActivity类:

 

 

复制代码
import java.util.List;    import android.app.Activity;  import android.net.wifi.ScanResult;  import android.os.Bundle;  import android.view.View;  import android.view.View.OnClickListener;  import android.widget.Button;  import android.widget.TextView;  import android.widget.Toast;    public class WifiActivity extends Activity {      /** Called when the activity is first created. */        private TextView allNetWork;            private Button scan;            private Button start;            private Button stop;            private Button check;            private WifiAdmin mWifiAdmin;            // 扫描结果列表            private List<ScanResult> list;            private ScanResult mScanResult;            private StringBuffer sb=new StringBuffer();        @Override      public void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.main);          mWifiAdmin = new WifiAdmin(WifiActivity.this);            init();        }      public void init(){          allNetWork = (TextView) findViewById(R.id.allNetWork);            scan = (Button) findViewById(R.id.scan);            start = (Button) findViewById(R.id.start);            stop = (Button) findViewById(R.id.stop);            check = (Button) findViewById(R.id.check);           scan.setOnClickListener(new MyListener());            start.setOnClickListener(new MyListener());            stop.setOnClickListener(new MyListener());            check.setOnClickListener(new MyListener());        }      private class MyListener implements OnClickListener{            @Override          public void onClick(View v) {              // TODO Auto-generated method stub              switch (v.getId()) {              case R.id.scan://扫描网络                    getAllNetWorkList();                    break;             case R.id.start://打开Wifi                  mWifiAdmin.openWifi();                  Toast.makeText(WifiActivity.this, "当前wifi状态为:"+mWifiAdmin.checkState(), 1).show();                  break;             case R.id.stop://关闭Wifi                  mWifiAdmin.closeWifi();                  Toast.makeText(WifiActivity.this, "当前wifi状态为:"+mWifiAdmin.checkState(), 1).show();                  break;             case R.id.check://Wifi状态                 Toast.makeText(WifiActivity.this, "当前wifi状态为:"+mWifiAdmin.checkState(), 1).show();                  break;              default:                  break;              }          }                }      public void getAllNetWorkList(){            // 每次点击扫描之前清空上一次的扫描结果            if(sb!=null){              sb=new StringBuffer();          }          //开始扫描网络          mWifiAdmin.startScan();          list=mWifiAdmin.getWifiList();          if(list!=null){              for(int i=0;i<list.size();i++){                  //得到扫描结果                  mScanResult=list.get(i);                  sb=sb.append(mScanResult.BSSID+"  ").append(mScanResult.SSID+"   ")                  .append(mScanResult.capabilities+"   ").append(mScanResult.frequency+"   ")                  .append(mScanResult.level+"\n\n");              }              allNetWork.setText("扫描到的wifi网络:\n"+sb.toString());          }      }  }  
复制代码

 


不要忘了加入权限:

 

<!-- 以下是使用wifi访问网络所需的权限 -->     <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"></uses-permission>     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>    

最后看以下演示效果:

 

点击打开wifi:

状态为3说明WIFI网卡可用(3)。点击扫描网络:

这些就是扫描到的wifi,具体参数参见上面介绍。.


0 0
原创粉丝点击