受保护的可扩展的身份验证协议 (PEAP) 是可扩展的身份验证协议 (EAP) 家族的一个新成员。PEAP 使用传输级别安全性

(TLS) 在正在验证的 PEAP 客户端(例如无线计算机)和 PEAP 身份验证器(例如 Internet 验证服务 (IAS)

或远程验证拨号用户服务 (RADIUS) 服务器)之间创建加密通道。PEAP 不指定验证方法,但是会为其他 EAP

验证协议提供额外的安全性,例如 EAP-MSCHAPv2 协议,该协议可以通过 PEAP 提供的 TLS

加密通道得以实现。

PEAP和其他普通WiFi最大的显著区别就是他需要账号和密码来连接WiFi,普通WiFi仅仅需要知道WiFi密码即可。无感知主要区别于WEB认证方式的WiFi,WEB认证的WiFi需要脸上WiFi后,打开浏览器输入账号密码进行登录。PEAP可以直接在系统中配置账号密码直接连接登录,更加方便快捷。

目前CMCC-AUTO在使用PEAP

WiFi。最近在做如何用代码连接CMCC-AUTO这样的WiFi。普通WiFi连接配置WifiConfiguration即可链接使用,但是这样并无法配置连接PEAP。不过手机是支持这样的连接呢。谷歌在Android4.3之后也开放了链接此类型WiFi的方法。使用WifiEnterpriseConfig来进行配置。

下面是在Android4.3之后连接PEAP WiFi的方法。

WifiConfiguration config = new

WifiConfiguration();config.allowedAuthAlgorithms.clear();config.allowedGroupCiphers.clear();config.allowedKeyManagement.clear();config.allowedPairwiseCiphers.clear();config.allowedProtocols.clear();config.SSID

= "\"" SSID

"\"";config.allowedKeyManagement.set(KeyMgmt.WPA_EAP);config.allowedKeyManagement.set(KeyMgmt.IEEE8021X);WifiEnterpriseConfig

enterpriseConfig = new

WifiEnterpriseConfig();enterpriseConfig.setIdentity(username);enterpriseConfig.setPassword(password);enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.PEAP);config.enterpriseConfig

= enterpriseConfig;

既然低版本的Android手机已经支持连接PEAP

WiFi,想必这样的方法在系统中本身已经存在了。只是谷歌在Android4.3以后才开放给开发者。那我们就可以利用反射的方法去调用WifiEnterpriseConfig。这样可以更好的支持低版本手机的使用。

下面是在低版本Android中使用反射的方法去生成连接PEAP WiFi所用的WiFiConfiguration。

package com.example.eap_wifi;import java.lang.reflect.Field;import

java.lang.reflect.Method;import

android.net.wifi.WifiConfiguration;import android.util.Log;public

class WPAConfiguration { private static final String

INT_PRIVATE_KEY = "private_key"; private static final String

INT_PHASE2 = "phase2"; private static final String INT_PASSWORD =

"password"; private static final String INT_IDENTITY = "identity";

private static final String INT_EAP = "eap"; private static final

String INT_CLIENT_CERT = "client_cert"; private static final String

INT_CA_CERT = "ca_cert"; private static final String

INT_ANONYMOUS_IDENTITY = "anonymous_identity"; private static final

String INT_ENTERPRISEFIELD_NAME =

"android.net.wifi.WifiConfiguration$EnterpriseField"; private

static final String INT_IPASSIGNMENT_NAME =

"android.net.wifi.WifiConfiguration$IpAssignment"; private static

final String INT_PROXYSETTINGS_NAME =

"android.net.wifi.WifiConfiguration$ProxySettings"; //change this

to TLS,PEAP, or other options that are listed when you connect via

a device private static final String ENTERPRISE_EAP = "PEAP";

private static final String INT_IP_ASSIGNMENT = "ipAssignment";

private static final String INT_PROXY_SETTINGS = "proxySettings";

public static WifiConfiguration setWifiConfigurations(String SSID,

String userName, String userPass) { WifiConfiguration wifiConfig

=new WifiConfiguration(); wifiConfig.SSID = "\"" SSID "\""; //

wifiConfig.SSID = SSID; wifiConfig.networkId = 0;

wifiConfig.priority = 0; wifiConfig.hiddenSSID = false;

wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.IEEE8021X);

wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);

wifiConfig.allowedGroupCiphers.clear();

wifiConfig.allowedGroupCiphers.clear();

wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);

wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);

wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);

wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);

wifiConfig.allowedPairwiseCiphers.clear();

wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);

wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);

wifiConfig.allowedProtocols.clear();

wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN);

wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA);

try { Class> wifiEnterpriseField =

null; Class> wifiIpAssignmentField

= null; Class>

wifiProxySettingsField = null; boolean enterpriseFieldType = true;

boolean ipAssignmentFieldType = true; boolean

proxySettingsFieldType = true; Field anonymousId = null, caCert =

null, clientCert = null, eap = null, identity = null, password =

null, phase2 = null, privateKey = null, ipAssignment = null, proxy

= null; Method setValue = null;

Class>[] wifiClasses =

WifiConfiguration.class.getClasses();

for(Class> wifiClass : wifiClasses)

{ if(wifiClass.getName().equals(INT_ENTERPRISEFIELD_NAME)) {

wifiEnterpriseField = wifiClass; } else

if(wifiClass.getName().equals(INT_IPASSIGNMENT_NAME)) {

wifiIpAssignmentField = wifiClass; } else

if(wifiClass.getName().equals(INT_PROXYSETTINGS_NAME)) {

wifiProxySettingsField = wifiClass; } } if(wifiEnterpriseField ==

null) { enterpriseFieldType = false; } if(wifiIpAssignmentField ==

null) { ipAssignmentFieldType = false; } if(wifiProxySettingsField

== null) { proxySettingsFieldType = false; } Log.d("Enterprise

Setting", "Getting Fields "); Field[] wifiFields =

WifiConfiguration.class.getFields(); for(Field wifiField :

wifiFields) {

if(wifiField.getName().equals(INT_ANONYMOUS_IDENTITY)) {

anonymousId = wifiField; Log.d("Enterprise Setting", "Getting

Field: " wifiField); } else

if(wifiField.getName().equals(INT_CA_CERT)) { caCert = wifiField;

Log.d("Enterprise Setting", "Getting Field: " wifiField); } else

if(wifiField.getName().equals(INT_CLIENT_CERT)) { clientCert =

wifiField; Log.d("Enterprise Setting", "Getting Field: "

wifiField); } else if(wifiField.getName().equals(INT_EAP)) { eap =

wifiField; Log.d("Enterprise Setting", "Getting Field: "

wifiField); } else if(wifiField.getName().equals(INT_IDENTITY)) {

identity = wifiField; Log.d("Enterprise Setting", "Getting Field: "

wifiField); } else if(wifiField.getName().equals(INT_PASSWORD)) {

password = wifiField; Log.d("Enterprise Setting", "Getting Field: "

wifiField); } else if(wifiField.getName().equals(INT_PHASE2)) {

phase2 = wifiField; Log.d("Enterprise Setting", "Getting Field: "

wifiField); } else if(wifiField.getName().equals(INT_PRIVATE_KEY))

{ privateKey = wifiField; Log.d("Enterprise Setting", "Getting

Field: " wifiField); } else

if(wifiField.getName().equals(INT_IP_ASSIGNMENT)) { ipAssignment =

wifiField; Log.d("Enterprise Setting", "Getting Field: "

wifiField); } else

if(wifiField.getName().equals(INT_PROXY_SETTINGS)) { proxy =

wifiField; Log.d("Enterprise Setting", "Getting Field: "

wifiField); } } if(enterpriseFieldType) { for(Method method :

wifiEnterpriseField.getMethods()) { Log.d("Get Methods",

"Enterprise Method: " method);

if(method.getName().trim().equals("setValue")) { setValue = method;

break; } } } if(enterpriseFieldType) {

setValue.invoke(eap.get(wifiConfig), ENTERPRISE_EAP);

Log.d("Enterprise Setting", "Setting " ENTERPRISE_EAP); } else {

eap.set(wifiConfig, ENTERPRISE_EAP); } if(enterpriseFieldType) {

setValue.invoke(identity.get(wifiConfig), userName);

Log.d("Enterprise Setting", "Setting " userName); } else {

identity.set(wifiConfig, userName); } if(enterpriseFieldType) {

setValue.invoke(password.get(wifiConfig), userPass);

Log.d("Enterprise Setting", "Setting " userPass); } else {

password.set(wifiConfig, userPass); } if(ipAssignmentFieldType) {

ipAssignment.set(wifiConfig,

Enum.valueOf((Class)

ipAssignment.getType().asSubclass(Enum.class), "DHCP"));

Log.d("Enterprise Setting", "Setting " ipAssignment); } else {

ipAssignment.set(wifiConfig, "DHCP"); } if(proxySettingsFieldType)

{ proxy.set(wifiConfig,

Enum.valueOf((Class)

proxy.getType().asSubclass(Enum.class), "NONE")); Log.d("Enterprise

Setting", "Setting " proxy); } else { proxy.set(wifiConfig,

"NONE"); } } catch(Exception e) { Log.e("ERROR!!!", "Error: " e); }

Log.d("WIFI", "Configuration Settings " wifiConfig.toString());

return wifiConfig; }}

在www.stackoverflow.com查看了很多大牛的回答后,经过实验找到了这个方法。

得到WifiConfiguration后,只需要添加到网络中即可连接该WiFi

WifiManager mWifiManager = (WifiManager)

context.getSystemService(Context.WIFI_SERVICE);int wcgId =

mWifiManager.addNetwork(configuration);mWifiManager.enableNetwork(wcgId,

true);

android peap,Android连接IEEE8021X PEAP  无感知WiFi相关推荐

  1. 转-Android中自动连接到指定SSID的Wi-Fi

    最近在做一个项目,其中涉及到一块"自动连接已存在的wifi热点"的功能,在网上查阅了大量资料,五花八门,但其中一些说的很简单,即不能实现傻瓜式的拿来就用,有些说的很详细,但其中不乏 ...

  2. android无感知拍照github,装X指南之通过 VirtualApp 实现免 Root 权限 Hook

    装X指南之通过 VirtualApp 实现免 Root 权限 Hook 一.前言 之前写的 「装X指南之Xposed安装与配置」,有人反馈手机 root 风险较大,而且操作成本高,有没有什么方法是不需 ...

  3. Android静默拍照(无感知拍照)

    在安卓系统下,实现拍照主要有两种方式:第一种就是直接调用系统的相机实现拍照,简单快捷.但是弊端就是不能自定义拍照界面.第二种就是根据Android系统提供的相关API进行自定义拍照,这样就是可以根据具 ...

  4. android 检查网络连接状态实现步骤

     android 如何检查网络连接状态,是android开发中一个常见的问题,本文将介绍如何实现,需要的朋友可以参考下 获取网络信息需要在AndroidManifest.xml文件中加入相应的权限 ...

  5. Android连接多个usb,Android实现USB连接

    前言 在Android开发过程中,我们有时会涉及到USB连接的问题,这里为了方便USB连接的使用,我将相关知识封装成了一个工具类-USBHelper,下面就来介绍下它的使用吧. 今天涉及的内容有: U ...

  6. Android手机无法连接HC-05蓝牙模块

    目录 前言 问题描述 尝试方法 问题原因 解决方法 总结 前言 这学期选的毕业设计中需要用到蓝牙模块与Android手机通信,于是我就在淘宝购买了一款HC-05的蓝牙模块,到货之后首先使用蓝牙模块连接 ...

  7. Android新技术学习——阿里巴巴免Root无侵入AOP框架Dexposed

    阿里巴巴无线事业部近期开源的Android平台下的无侵入运行期AOP框架Dexposed,该框架基于AOP思想,支持经典的AOP使用场景.可应用于日志记录,性能统计,安全控制.事务处理.异常处理等方面 ...

  8. android获取连接wifi名称,android 获取当前连接WIFI名称的有关问题

    android 获取当前连接WIFI名称的问题 我在程序内通过以下方法获取当前连接的WIFI名称(SSID),这个也是网上找别人的,但在我程序内就获取不到呢? 1.在AndroidManifest.x ...

  9. android 蓝牙耳机 判断,Android实现蓝牙耳机连接

    前言 最近看了下蓝牙耳机连接的问题,查阅了相关资料,再此做一个总结. 本文参考以下链接: Android实现主动连接蓝牙耳机 再次对作者表示感谢. 今天涉及的内容有: 流程讲解 新建广播Bluetoo ...

最新文章

  1. C# GDI+ 简单绘图 (三)
  2. 项目ITP(五) spring4.0 整合 Quartz 实现任务调度
  3. opencv鼠标画路径点
  4. 不止视觉,CMU研究员让机器人学会了听音辨物
  5. 集群调度框架的架构演进之路
  6. PHP不能连接MS SQL Server的解决方法
  7. TCP/IP的四层负载均衡
  8. 再见了微服务!全面拥抱 DDD 真正的价值
  9. rust大油田分解机_低渗油田油井反向调驱(堵水)技术:单井平均含水率从95.6%降至53.65%,单井平均日产油从0.115t上升至1.32t...
  10. 不同vlan同段IP通信
  11. ubuntu13.04中把ibus中的中文拼音输入设为默认
  12. String,StringBuffer,StringBulilder之间的区别
  13. 戴尔t40服务器接显示器,Dell PowerEdge T40 机架式服务器
  14. modbus 调试工具之modbus slave与modbus poll
  15. 3.样条曲线之B样条曲线
  16. 使用mmdetection测试图片
  17. HEVC的WPP(Wavefront Parallel Processing)并行处理方式
  18. Docker容器详细操作
  19. 亚马逊云科技:云厂商做自研芯片的两个「选择」
  20. 联发科有没有高端处理器_联发科处理器哪些好 2019联发科处理器排名

热门文章

  1. 深信服2019秋招技服岗面试总结
  2. 思必驰宣布完成5亿元D轮融资 继续深化AI生态布局
  3. 最新DOS启动盘制作全攻略
  4. Windows电脑使用心得
  5. magento 赠品_免费赠品:10个高质量的夏季刻字
  6. 计算机考研854题型,2017年中央民族大学854计算机基础综合考研大纲
  7. Java借助ffmpeg进行音视频的格式转换(如m4a转mp3)
  8. 3D建模软件大总结,你都知道哪些?
  9. 怎样根据电阻上的色环,判断电阻的大小
  10. 联想数字化转型之路:从传统IT到“新IT”