Android之连接指定SSID的无线网络
SSID指的是无线网络的名称全程为Service Set Identifier
通过查阅网上资料找到了连接指定SSID的方法,无线网络可以是三种简单的方式
1. 无加密
2. wep加密
3. wpa加密
以下即为三种方式的介绍
一、Open System
完全不认证也不加密,任何人都可以连到无线基地台使用网络。
二、WEP (Wired EquivalentPrivacy) 有线等效加密
最基本的加密技术,手机用户、笔记型计算机与无线网络的Access Point(网络金钥AP)拥有相同的网络金钥,才能解读互相传递的数据。这金钥分为64bits及128bits两种,最多可设定四组不同的金钥。当用户端进入WLAN前必须输入正确的金钥才能进行连接。
WEP加密方法很脆弱。网络上每个客户或者计算机都使用了相同的保密字,这种方法使网络偷听者能刺探你的密钥,偷走数据并且在网络上造成混乱。
三、WPA (Wi-Fi Protected Access) 商务宝采用的加密方式
由Wi-FiAlliance (http://www.wi-fi.com/)所提出的无线安全标准,有分成家用的WPA-PSK (Pre-Shared Key)与企业用的WPA-Enterprise版本。
1、WPA-PSK
为了堵塞WEP的漏洞而发展的加密技术,使用方法与WEP相似。无线基地台与笔记型计算机必须设定相同的Key,计算机才可以连入基地台。但其进入WLAN时以更长词组或字串作为网络金钥。并且WPA-PSK运用了TKIP (Temporal Key IntegrityProtocol)技术,因此比WEP难被破解而更加安全。
WPA-PSK通过为每个客户分配唯一的密钥而工作,但需要给雇员密码以便登陆系统。这样,外部的人可通过他们享用网络资源。如果你希望修改密码(建议每隔一段时间修改密码以防止偷听者解码),你可能得跑到每台电脑前去输入新的密码。
2、WPA-Enterprise
采用IEEE 802.1x则需要有另一台储存无线使用者账户数据的RADIUS (RemoteAuthentication Dial-In User Service)服务器,当笔记型计算机连入无线基地台时,无线基地台会要求使用者输入账号密码、或是自动向笔记型计算机索取储存在计算机硬盘的使用者数字凭证,然后向RADIUS服务器确认使用者的身分。而用来加密无线封包的加密金钥(Key),也是在认证的过程中自动产生,并且每一次联机所产生的金钥都不同(专业术语称为SessionKey),因此非常难被破解。
用用户名和密码安全登陆网络后,每个客户会自动得到一个唯一的密钥,密钥很长并且每隔一段时间就会被更新。这样wi-Fi监听者就不能获取足够的数据包来解码密钥。即使一个密钥因为某种原因被解码了,富于经验的黑客有可能发现新的密钥,但是加密锁已经变了。
一但应用了WPA-Enterprise,不像WPA-PSK那样,雇员将不会知道密码。这样,外部的人
就不能通过他们享用网络资源。WPA-Enterprise还可以节约你大量的时间;你无需花费大量的时间去人工更换客户的密码。
四、WPA2
WPA2顾名思义就是WPA的加强版,也就是IEEE802.11i无线网络标准。同样有家用的PSK版本与企业的IEEE 802.1x版本。WPA2与WPA的差别在于,它使用更安全的加密技术AES (Advanced Encryption Standard),因此比WPA更难被破解、更安全。
五、MAC ACL (Access Control List)
MAC ACL只能用于认证而不能用于加密。在无线基地台输入允许被连入的无线网卡MAC地址,不在此清单的无线网卡无法连入无线基地台。
六、Web Redirection
这种方式是WISP(Wireless Internet Service Provider,例如统一安源WiFly)最常用的方式。无线基地台设定成Open System,但是另外在后台利用存取控制网关器(Access Control Gateway, ACG),拦截笔记型计算机发出的Web封包(开启浏览器尝试上网),并强制重导到认证网页要求输入账号密码,然后ACG向RADIUS认证服务器来确认使用者的身分,认证通过才可以自由到其它的网站。
七、各种加密方式对比
WEP安全加密方式
WEP特性里使用了rsa数据安全性公司开发的rc4 prng算法。全称为有线对等保密(Wired EquivalentPrivacy,WEP)是一种数据加密算法,用于提供等同于有线局域网的保护能力。使用了该技术的无线局域网,所有客户端与无线接入点的数据都会以一个共享的密钥进行加密,密钥的长度有40位至256位两种,密钥越长,黑客就需要更多的时间去进行破解,因此能够提供更好的安全保护。
WPA安全加密方式
WPA加密即Wi-Fi Protected Access,其加密特性决定了它比WEP更难以入侵,所以如果对数据安全性有很高要求,那就必须选用WPA加密方式了(Windows XP SP2已经支持WPA加密方式)。
WPA作为IEEE 802.11通用的加密机制WEP的升级版,在安全的防护上比WEP更为周密,主要体现在身份认证、加密机制和数据包检查等方面,而且它还提升了无线网络的管理能力。
WPA、WEP对比
WPA与WEP不同,WEP使用一个静态的密钥来加密所有的通信。WPA不断的转换密钥。WPA采用有效的密钥分发机制,可以跨越不同厂商的无线网卡实现应用。另外WPA的另一个优势是,它使公共场所和学术环境安全地部署无线网络成为可能。而在此之前,这些场所一直不能使用WEP。WEP的缺陷在于其加密密钥为静态密钥而非动态密钥。这意味着,为了更新密钥,IT人员必须亲自访问每台机器,而这在学术环境和公共场所是不可能的。另一种办法是让密钥保持不变,而这会使用户容易受到攻击。由于互操作问题,学术环境和公共场所一直不能使用专有的安全机制。
WPA2:目前最强的无线加密技术
WPA2是WiFi联盟验证过的IEEE 802.11i标准的认证形式,WPA2实现了802.11i的强制性元素,特别是Michael算法被公认彻底安全的CCMP(计数器模式密码块链消息完整码协议)讯息认证码所取代、而RC4加密算法也被AES所取代。
在WPA/WPA2中,PTK的生成是依赖于PMK的,而PMK的方式有两种,一种是PSK方式,也就是预共享密钥模式(pre-shared key,PSK,又称为个人模式),在这种方式中PMK=PSK;而另一种方式则需要认证服务器和站点进行协商来产生PMK。下面我们通过公式来看看WPA和WPA2的区别:
WPA = IEEE 802.11idraft 3 = IEEE 802.1X/EAP + WEP(选择性项目)/TKIP
WPA2 = IEEE 802.11i =IEEE 802.1X/EAP + WEP(选择性项目)/TKIP/CCMP
目前WPA2加密方式的安全防护能力非常出色,只要你的无线设备均支持WPA2加密,那你将体验到最安全的无线网络生活。即使是目前最热的“蹭网卡”也难以蹭入你的无线网络,用户大可放心使用。
连接指定的无线的代码如下所示:(引用自这里写链接内容)
public class WifiAdmin { // 定义WifiManager对象 private WifiManager mWifiManager; // 定义WifiInfo对象 private WifiInfo mWifiInfo; // 扫描出的网络连接列表 private List<ScanResult> mWifiList; // 网络连接列表 private List<WifiConfiguration> mWifiConfiguration; // 定义一个WifiLock 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 creatWifiLock() { mWifiLock = mWifiManager.createWifiLock("Test"); } // 得到配置好的网络 public List<WifiConfiguration> getConfiguration() { return mWifiConfiguration; } // 指定配置好的网络进行连接 public void connectConfiguration(int index) { // 索引大于配置好的网络索引返回 if (index > mWifiConfiguration.size()) { return; } // 连接配置好的指定ID的网络 mWifiManager.enableNetwork(mWifiConfiguration.get(index).networkId, true); } public void startScan() { mWifiManager.startScan(); // 得到扫描结果 mWifiList = mWifiManager.getScanResults(); // 得到配置好的网络连接 mWifiConfiguration = mWifiManager.getConfiguredNetworks(); } // 得到网络列表 public List<ScanResult> getWifiList() { return mWifiList; } // 查看扫描结果 public StringBuilder lookUpScan() { StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < mWifiList.size(); i++) { stringBuilder .append("Index_" + new Integer(i + 1).toString() + ":"); // 将ScanResult信息转换成一个字符串包 // 其中把包括:BSSID、SSID、capabilities、frequency、level stringBuilder.append((mWifiList.get(i)).toString()); stringBuilder.append("/n"); } return stringBuilder; } // 得到MAC地址 public String getMacAddress() { return (mWifiInfo == null) ? "NULL" : mWifiInfo.getMacAddress(); } // 得到接入点的BSSID public String getBSSID() { return (mWifiInfo == null) ? "NULL" : mWifiInfo.getBSSID(); } // 得到IP地址 public int getIPAddress() { return (mWifiInfo == null) ? 0 : mWifiInfo.getIpAddress(); } // 得到连接的ID public int getNetworkId() { return (mWifiInfo == null) ? 0 : mWifiInfo.getNetworkId(); } // 得到WifiInfo的所有信息包 public String getWifiInfo() { return (mWifiInfo == null) ? "NULL" : mWifiInfo.toString(); } // 添加一个网络并连接 public void addNetwork(WifiConfiguration wcg) { int wcgID = mWifiManager.addNetwork(wcg); boolean b = mWifiManager.enableNetwork(wcgID, true); System.out.println("a--" + wcgID); System.out.println("b--" + b); } // 断开指定ID的网络 public void disconnectWifi(int netId) { mWifiManager.disableNetwork(netId); mWifiManager.disconnect(); } //然后是一个实际应用方法,只验证过没有密码的情况: public WifiConfiguration CreateWifiInfo(String SSID, String Password, int Type) { WifiConfiguration config = new WifiConfiguration(); config.allowedAuthAlgorithms.clear(); config.allowedGroupCiphers.clear(); config.allowedKeyManagement.clear(); config.allowedPairwiseCiphers.clear(); config.allowedProtocols.clear(); config.SSID = "\"" + SSID + "\""; WifiConfiguration tempConfig = this.IsExsits(SSID); if(tempConfig != null) { mWifiManager.removeNetwork(tempConfig.networkId); } if(Type == 1) //WIFICIPHER_NOPASS { config.wepKeys[0] = ""; config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); config.wepTxKeyIndex = 0; } if(Type == 2) //WIFICIPHER_WEP { config.hiddenSSID = true; config.wepKeys[0]= "\""+Password+"\""; config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED); config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104); config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); config.wepTxKeyIndex = 0; } if(Type == 3) //WIFICIPHER_WPA { config.preSharedKey = "\""+Password+"\""; config.hiddenSSID = true; config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN); config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); //config.allowedProtocols.set(WifiConfiguration.Protocol.WPA); config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); config.status = WifiConfiguration.Status.ENABLED; } return config; } private WifiConfiguration IsExsits(String SSID) { List<WifiConfiguration> existingConfigs = mWifiManager.getConfiguredNetworks(); for (WifiConfiguration existingConfig : existingConfigs) { if (existingConfig.SSID.equals("\""+SSID+"\"")) { return existingConfig; } } return null; } }
//分为三种情况:1没有密码2用wep加密3用wpa加密
改动主要集中在CreateWifiInfo这个方法中,并且添加了一个私有方法:
(1)将与方法的第三个参数有关的变量都改成int型,或者使用原作者的枚举型(存在bug需要改正),但枚举会在后续的开发中遇到些困难;
(2)在if(type == 3)中注释掉“config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);”,并添加“
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);“这两句,否则当wifi热点需要输入密码时,无法加入网络。
(3)在代码末尾添加了方法IsExsits,原因在于如果按照网上介绍的方法成功加入指定的wifi后,都会在终端的wifi列表中新添加一个以该指定ssid的网络,所以每运行一次程序,列表中就会多一个相同名字的ssid。而该方法就是检查wifi列表中是否有以输入参数为名的wifi热点,如果存在,则在CreateWifiInfo方法开始配置wifi网络之前将其移除,以避免ssid的重复:
WifiConfiguration tempConfig = this.IsExsits(SSID);
if(tempConfig != null) {
mWifiManager.removeNetwork(tempConfig.networkId);
}
以上便是wifi工具类的建立,之后就可以在其他部分实例化这个类,调用其中的方法完成加入指定ssid的wifi热点,还是先上代码吧,建立一个名为Test_wifiActivity.java的文件(同上,没有包含包声明和impo
public class Test_wifiActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
WifiAdmin wifiAdmin = new WifiAdmin(this);
wifiAdmin.openWifi();
wifiAdmin.addNetwork(wifiAdmin.CreateWifiInfo(“XXX”, “XXX”, 3));
}
}
大体上只涉及到openWifi(打开wifi)、CreateWifiInfo(配置wifi网络信息)和addNetwork(添加配置好的网络并连接),对CreateWifiInfo进行简单的说明:第一参数是SSID的名称;第二个参数是指定SSID网络的密码,当不需要密码是置空(”“);第三个参数是热点类型:1-无密码 / 2-WEP密码验证(未测试)/ 3-WAP或WAP2 PSK密码验证。
最后就是在Manifest中添加相应的权限了:
<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>
Android之连接指定SSID的无线网络相关推荐
- Android Wifi --自动连接指定SSID(各种加密方式均可)
Android Wifi API参考网站这里写链接内容 1.开始先加入wifi权限 <uses-permission android:name="android.permission. ...
- android 开发 自动生成wifi,Android编程开发:自动连接指定SSID的wifi热点
在Android编程开发中,最近在做一个项目,其中涉及到一块"自动连接已存在的wifi热点"的功能,在网上查阅了大量资料,五花八门,但其中一些说的很简单,即不能实现傻瓜式的拿来就用 ...
- Android开发——自动连接指定SSID的wifi热点(不加密/加密)
最近在做一个项目,其中涉及到一块"自动连接已存在的wifi热点"的功能,在网上查阅了大量资料,五花八门,但其中一些说的很简单,即不能实现傻瓜式的拿来就用,有些说的很详细,但其中不乏 ...
- Android自动连接指定的WiFi热点
Android自动连接指定的WiFi热点 "Android自动连接指定的WiFi热点",看上去这是个再基础不过的功能了.很多人都觉得很简单,网上也有大量的资料.但在以Android ...
- WeFi – 自动搜索并连接未加密的无线网络
蹭网,相信很多拥有笔记本电脑的朋友,有意或无意中都做过,但是大部分却是手动搜索未加密的无线网络,然后连接上去,那么是否有这么一款工具,可以自动搜索没有密码的无线网络并自动连接呢?答案是肯定的.今天就给 ...
- w ndows10专业版连接不上网,windows10无线网络连不上的原因与应对方法
最近有用户反馈,遇到了windows10无线网络连不上的问题,不知如何解决?其实导致windows10无线网络连不上的原因有很多种,下面小编介绍windows10无线网络连不上的原因与应对方法. 一. ...
- 如何启用计算机上的无线网络连接,告诉大家win10无线网络连接如何打开
有不少的网友想知道win10无线网络连接如何打开呢?其实win10无线网络连接如何打开的方法是很简单的,下面就让我给大家介绍一下关于win10无线网络连接如何打开的解决方法吧. win10无线网络连接 ...
- 小米机顶盒显示网络无法连接服务器,小米盒子无线网络连接不上怎么回事 - 卡饭网...
无线网络连接不上怎么回事,如何解决 无线网络连接不上怎么回事,如何解决 无线网络连接不上怎么回事,如何解决,很多电脑用户可能会遇到这个问题. 一:先检查下你的无线网络开关是否打开,没打开请打开 二:检 ...
- 如何上手机上不了无线网络连接服务器,手机连接不上路由器无线网络怎么处理...
家里的无线路由器网络,跟电脑连接正常,但与手机连接却经常会出现这3种情况:手机搜索不到无线信号;手机连接上了无线网络但却无法上网;手机突然上不了网.下面是学习啦小编给大家整理的一些有关手机连接不上路由 ...
最新文章
- java条码大小_java – 如何设置iText条码宽度?
- HCNA(012-211) 试题解析
- 单点登录框架 OpenSSO
- Maven基础知识--Maven资源库详述
- 不装oracle进行远程连接解决办法 .
- 外部函数获取内部函数变量_一维随机变量的分布函数
- python如何安装wordcloud_基于python的wordcloud库的安装方法
- CentOS操作系统keepalived安装步骤
- SCDM(3)建立几何
- 传奇手游漏洞获取gm权限_传奇私服漏洞获取gm权限
- 中国晒2018经济成绩单 GDP、收入、就业等指标亮眼
- 1931CIE基础知识
- Github+Facebook=?这家公司有望让程序猿的头秃得慢一点
- docx4j操作word文档之生成页码、合并多个文档
- NameNode故障处理方法
- xss获取键盘记录实验演示
- 【C深入】程序中的三国天下,栈,堆,静态内存
- Spirng中Mongodb中write-concern的解释
- 推荐给你的一个读书清单
- 菜鸟的病毒分析5 pe感染文件感染病毒