2012-02-09 559 views
9

我一直试图在过去几天以编程方式将我的Android设备连接到企业网络,但没有取得任何成功,我一直在线以下多个示例,但大多数人找到EAP(TLS)网络和我工作的是EAP(PEAP),这里是网络的类型。连接Android到WiFi企业网络EAP(PEAP)

802.1X EAP

EAP方法:PEAP

阶段2认证:MSCHAPV2

认证总是失败,logcat的并不表示我是哪里的问题我只知道它时失败正在执行认证。

这里是我当前的代码副本,并从那里logcat中失败的日志:

/****************** CODE ***** ********/

public class WPAActivity extends LauncherActivity 
{ 

private static final String TAG = "WPAActivity"; 

/************* Definitions to find variables ***************************/ 
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"; 
final String INT_ENTERPRISEFIELD_NAME ="android.net.wifi.WifiConfiguration$EnterpriseField"; 
/************************************************************************/ 

/********************************Configuration Strings*********************/ 
final String ENTERPRISE_EAP = "PEAP"; 
final String ENTERPRISE_CLIENT_CERT = ""; 
final String ENTERPRISE_PRIV_KEY = ""; 
final String ENTERPRISE_PHASE2 = "\"MSCHAPV2\""; 
final String ENTERPRISE_ANON_IDENT = ""; 
final String ENTERPRISE_CA_CERT = ""; 
final String userName = "\"my Username"; 
final String passString = "\"my Password\""; 

/**************************************************************************/ 


/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) 
{ 


super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
    WifiConfiguration wc = new WifiConfiguration(); 
    wc.SSID = "\"mySSID\""; 
    wc.preSharedKey = "\"my Password\""; 
    wc.hiddenSSID = true; 
    wc.status = WifiConfiguration.Status.ENABLED;   

    wc.allowedKeyManagement.clear(); 
    wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.IEEE8021X); 
    wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP); 


    /*Group Ciphers*/ 
    wc.allowedGroupCiphers.clear(); 
    wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); 
    wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); 

    /*Protocols*/ 
    wc.allowedProtocols.clear(); 
    wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN); 
    wc.allowedProtocols.set(WifiConfiguration.Protocol.WPA); 

    Class[] enterpriseFieldArray = WifiConfiguration.class.getClasses(); 
    Class<?> enterpriseFieldClass = null; 


    for(Class<?> myClass : enterpriseFieldArray) 
    { 
     if(myClass.getName().equals(INT_ENTERPRISEFIELD_NAME)) 
     { 
     enterpriseFieldClass = myClass; 
     break; 
     } 
    } 
    Log.d(TAG, "class chosen " + enterpriseFieldClass.getName()); 


    Field anonymousId = null, caCert = null, clientCert = null, 
     eap = null, identity = null, password = null, 
     phase2 = null, privateKey = null; 

    Field[] fields = WifiConfiguration.class.getFields(); 


    for (Field tempField : fields) 
    { 
     if (tempField.getName().trim().equals(INT_ANONYMOUS_IDENTITY)) 
     { 
     anonymousId = tempField; 
     Log.d(TAG, "field " + anonymousId.getName()); 
     } 
     else if (tempField.getName().trim().equals(INT_CA_CERT)) 
     { 
     caCert = tempField; 
     } 
     else if (tempField.getName().trim().equals(INT_CA_CERT)) 
     { 
     } 
     else if (tempField.getName().trim().equals(INT_CLIENT_CERT)) 
     { 
     clientCert = tempField; 
     Log.d(TAG, "field " + clientCert.getName()); 
     }  
     else if (tempField.getName().trim().equals(INT_EAP)) 
     { 
     eap = tempField; 
     Log.d(TAG, "field " + eap.getName()); 
     } 
     else if (tempField.getName().trim().equals(INT_IDENTITY)) 
     { 
     identity = tempField; 
     Log.d(TAG, "field " + identity.getName()); 
     } 
     else if (tempField.getName().trim().equals(INT_PASSWORD)) 
     { 
     password = tempField; 
     Log.d(TAG, "field " + password.getName()); 
     } 
     else if (tempField.getName().trim().equals(INT_PHASE2)) 
     { 
     phase2 = tempField; 
     Log.d(TAG, "field " + phase2.getName()); 

     } 
     else if (tempField.getName().trim().equals(INT_PRIVATE_KEY)) 
     { 
     privateKey = tempField; 
     } 
    } 


    Method setValue = null; 


    for(Method m: enterpriseFieldClass.getMethods()) 
    { 
     if(m.getName().trim().equals("setValue")) 
     { 
     Log.d(TAG, "method " + m.getName()); 
     setValue = m; 
     break; 
     } 
    } 

    try 
    { 
     // EAP 
     setValue.invoke(eap.get(wc), ENTERPRISE_EAP); 

     // EAP Phase 2 
     setValue.invoke(phase2.get(wc), ENTERPRISE_PHASE2); 

     // EAP Anonymous Id 
     setValue.invoke(anonymousId.get(wc), ENTERPRISE_ANON_IDENT); 

     // EAP CA Certificate 
     setValue.invoke(caCert.get(wc), ENTERPRISE_CA_CERT); 

     // Private Key 
     setValue.invoke(privateKey.get(wc), ENTERPRISE_PRIV_KEY); 

     // EAP Identity 
     setValue.invoke(identity.get(wc), userName); 

     // EAP Password 
     setValue.invoke(password.get(wc), passString); 

     // EAP Client certificate 
     setValue.invoke(clientCert.get(wc), ENTERPRISE_CLIENT_CERT); 

    } 
    catch (Exception e) 
    { 

    } 

    Log.d("WifiPreference", "2"); 
    int res = wifi.addNetwork(wc); 
    Log.d("WifiPreference", "add Network returned " + res); 
    boolean b = wifi.enableNetwork(res, true);   
    Log.d("WifiPreference", "enableNetwork returned " + b); 
    } 
} 

和这些是指示日志其中连接尝试失败

/* ***********************这里是日志********************/

02-09 09:23:30.514: I/ActivityManager(2084): Displayed activity com.test.wpa/.WPAActivity: 445 ms (total 445 ms) 

02-09 09:23:31.514: I/wpa_supplicant(27633): CTRL-EVENT-SCAN-RESULTS Ready 

02-09 09:23:31.514: I/wpa_supplicant(27633): Trying to associate with 00:1c:0f:82:04:e0 (SSID='*****' freq=2437 MHz) 

02-09 09:23:31.514: I/wpa_supplicant(27633): CTRL-EVENT-STATE-CHANGE id=-1 state=3 

02-09 09:23:31.649: V/WifiMonitor(2084): Event [Trying to associate with 00:1c:0f:82:04:e0 (SSID='*****' freq=2437 MHz)] 

02-09 09:23:31.649: V/WifiMonitor(2084): Event [CTRL-EVENT-STATE-CHANGE id=-1 state=3] 

02-09 09:23:31.654: V/WifiStateTracker(2084): Changing supplicant state: SCANNING ==> ASSOCIATING 

02-09 09:23:31.654: D/NetworkStateTracker(2084): setDetailed state, old =SCANNING and new state=CONNECTING 

02-09 09:23:31.659: D/ConnectivityService(2084): ConnectivityChange for WIFI: CONNECTING/CONNECTING 

02-09 09:23:32.621: I/wpa_supplicant(27633): CTRL-EVENT-STATE-CHANGE id=0 state=4 

02-09 09:23:32.621: V/WifiMonitor(2084): Event [CTRL-EVENT-STATE-CHANGE id=0 state=4] 

02-09 09:23:32.624: I/wpa_supplicant(27633): Associated with 00:1c:0f:82:04:e0 

02-09 09:23:32.624: I/wpa_supplicant(27633): CTRL-EVENT-EAP-STARTED EAP authentication started 

02-09 09:23:32.629: V/WifiMonitor(2084): Event [Associated with 00:1c:0f:82:04:e0] 

**02-09 09:23:32.629: V/WifiMonitor(2084): Event [CTRL-EVENT-EAP-STARTED EAP authentication started]** 

02-09 09:23:32.629: V/WifiStateTracker(2084): Changing supplicant state: ASSOCIATING ==> ASSOCIATED 

**02-09 09:23:32.629: D/NetworkStateTracker(2084): setDetailed state, old =CONNECTING and new state=CONNECTING** 

**02-09 09:23:32.634: I/wpa_supplicant(27633): CTRL-EVENT-DISCONNECTED - Disconnect event - remove keys** 

02-09 09:23:32.644: I/wpa_supplicant(27633): CTRL-EVENT-STATE-CHANGE id=0 state=0 

**02-09 09:23:32.644: V/WifiMonitor(2084): Event [CTRL-EVENT-DISCONNECTED - Disconnect event - remove keys]** 

02-09 09:23:32.644: V/WifiMonitor(2084): Event [CTRL-EVENT-STATE-CHANGE id=0 state=0] 

我找不到有关EAP(PEAP)身份验证的示例,我尝试更改WiFi配置但没有成功。任何有关如何连接企业网络EAP(PEAP)的想法或有用的网站/示例,还是有人能指引我朝着正确的方向发展?

+1

我不知道这一点,所以我决定只是告诉用户手动连接,如果找不到连接时,或者抛出一个异常,它似乎更好地工作。 – 2012-05-29 17:39:13

回答

3

最后,我击败了我的CiSCO EAP-FAST企业WiFi网络,我们所有的Android设备现在都可以连接到它。

为了从Android设备访问这种网络而进行的漫游操作比您想象的要容易得多。

在您设置EAP wifi连接时,您可以使用Google Play商店中的“Wifi配置编辑器”来激活辅助CISCO协议。

它的名字是Wifi Config高级编辑器。

  • 首先,你必须设置你的无线网络手动接近你可以到你的“官方”的企业无线网络的参数。

  • 保存。

  • 转到WCE并编辑您在上一步中创建的网络参数。

  • 为了强制Android设备使用它们作为连接方式,您应该激活3或4系列设置(我认为您希望访问的主站点是企业配置,但请不要忘记检查所有的参数来改变他们,如果必要的。
    作为一个建议,即使你有一个WPA2 EAP-FAST密码,尝试LEAP在您的设置。它为我的魅力。

  • 当你完成编辑配置,转到主要的Android wifi控制器,并强制连接到这个网络。

  • 请勿使用Android wifi接口再次编辑网络。

我已经在Samsung Galaxy 1和2,Note移动设备以及Lenovo Thinkpad Tablet上测试过它。

+1

所以解决方案是使用LEAP? – 2013-12-04 16:45:45