android WIFI开发
android wifi开发:
wifi技术是一种无线联网技术,通常使用无线路由器制造一个wifi热点,我们的终端设备就可以打开wifi进行互联,那么在android手机上是如何实现与无线路由器的热点互联的呢?
android wifi开发的api都在android.net.wifi包下面,它下面主要包括以下几个类:
1. ScanResult 打开wifi扫描到的无线网络接入点,包括接入点名称、身份验证、频率、信号强度
2. WifiConfiguration wifi网络的配置参数,主要包括ssid networkid presharedkey等信息
3. WifiInfo 这个代表无线连接描述,一般用于我们已经连好的wifi,通过它可以获取接入点名称、IP地址、mac地址、网络id等
4. 重要的是这个类 WifiManager管理wifi的类,在他里面有一些重要的方法
打开网卡:
先判断isWifiEnabled() 在打开setWifiEnabled(boolean enabled)
连接wifi:
(如果没有保存,就先addNetwork(WifiConfiguration config) )
再enableNetwork(int netId, boolean disableOthers) 第二个参数看名字就知道了
关闭wifi:
disableNetwork(int netId)
disconnect()
获取wifi状态:
getWifiState()
返回值 One of WIFI_STATE_DISABLED,
WIFI_STATE_DISABLING, WIFI_STATE_ENABLED,
WIFI_STATE_ENABLING, WIFI_STATE_UNKNOWN
下面以一个用手机创建wifi热点和连接wifi热点为例:
创建wifi热点:
利用java反射机制,获取WifiManager掩藏的setWifiApEnabled进行创建热点
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
wConfiguration = new WifiConfiguration();
wManager = (WifiManager)getSystemService(Context.WIFI_SERVICE);
wConfiguration.SSID = "my_wifi_1";
wConfiguration.preSharedKey = "123456789";
btn = (Button)this.findViewById(R.id.wifi);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
flag = !flag;
//热点不能和wifi同时开启 如果wifi开启就关闭掉
if(wManager.isWifiEnabled()){
wManager.setWifiEnabled(false);
}
try {
Method method = wManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, Boolean.TYPE);
method.invoke(wManager, wConfiguration, flag);
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
连接wifi热点:
连接wifi也很简单,只需要设置WifiConfiguration的参数,在把它加入到network里面去,enablewifi功能即可
//连接wifi 参数比较多 麻烦
public WifiConfiguration setWifiParams(){
WifiConfiguration mWifiConfiguration = new WifiConfiguration();
mWifiConfiguration.SSID = "\"" + ssid + "\"";
mWifiConfiguration.preSharedKey = "\"" + password + "\"";
mWifiConfiguration.hiddenSSID = true; //不再广播此ssid
mWifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
mWifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
mWifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
mWifiConfiguration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
mWifiConfiguration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
mWifiConfiguration.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
return mWifiConfiguration;
}
返回的wificonfiguration使用addnetwork,enableNetwork(int netId, boolean disableOthers)即可打开
还有一种比较省力的方法,直接跳跳转到用户设置wifi界面,用户手动设置:
startActivity(new Intent(android.provider.Settings.ACTION_WIFI_SETTINGS));
名词解释:
SSID:无线网络的名称,入常见的TP-link后面一串数字等,不同的无线网络接入点可以名字相同
BSSID:无线接入点的名称,通常默认为路由器的mac地址,当有时出现虚拟接入点是则时在该mac地址上添加而成
ESSID:是所有SSID的集合
举个栗子:
一个大型公司的wifi接入点一般不只有一个,会有多个wifi接入点,但是又不可能取不同的名字,通常将他们接入点取相同的SSID名称,使用不同的信道(1~13传送wifi数据的通道,相同信道会出现干扰,导致信号不稳定,信道根据wifi的频段绝点2.4MHz附件),这就可以在移动的过程中去自动连接