首页 文章

如何以编程方式在Android中创建和读取WEP / EAP WiFi配置?

提问于
浏览
104

How to programmatically create and read WEP/EAP WiFi configurations in Android?

我看到很多人在各种论坛和整个社区的这个问题上苦苦挣扎 . 我知道这不是那么直截了当(特别是EAP)弄清楚因为当我想要实现同样的目标时我也非常挣扎 . 好吧,代码分析和搜索互联网上的各种实现的所有艰苦工作都是我做的终于能够实现目标了 . 所有的功劳归功于开源项目及其开发人员的数量 .

我想与所有人分享这些知识,因为SO encourages这个:"It's also perfectly fine to ask and answer your own question, as long as you pretend you're on Jeopardy: phrase it in the form of a question."

Part 1: Creating a WEP WiFi configuration programmatically.

Part 2: Read a WEP WiFi configuration programmatically.

Part 3: Read a EAP WiFi Configuration programmatically.

Part 4: Save a EAP WiFi configuration programmatically.

5 回答

  • 103

    Part 1: Creating a WEP WiFi configuration programmatically

    这非常简单,WifiConfiguration暴露了创建相同的界面 . 以下是示例代码:

    void saveWepConfig()
    {
        WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        WifiConfiguration wc = new WifiConfiguration(); 
        wc.SSID = "\"SSID_NAME\""; //IMP! This should be in Quotes!!
        wc.hiddenSSID = true;
        wc.status = WifiConfiguration.Status.DISABLED;     
        wc.priority = 40;
        wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
        wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN); 
        wc.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
        wc.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
        wc.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);
        wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
        wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
        wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
        wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
    
        wc.wepKeys[0] = "\"aaabbb1234\""; //This is the WEP Password
        wc.wepTxKeyIndex = 0;
    
        WifiManager  wifiManag = (WifiManager) this.getSystemService(WIFI_SERVICE);
        boolean res1 = wifiManag.setWifiEnabled(true);
        int res = wifi.addNetwork(wc);
        Log.d("WifiPreference", "add Network returned " + res );
        boolean es = wifi.saveConfiguration();
        Log.d("WifiPreference", "saveConfiguration returned " + es );
        boolean b = wifi.enableNetwork(res, true);   
        Log.d("WifiPreference", "enableNetwork returned " + b );  
    
    }
    

    遵循AndroidManifest.xml中所需的权限

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE">
        </uses-permission>
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE">
        </uses-permission>
        <uses-permission android:name="android.permission.CHANGE_WIFI_STATE">
        </uses-permission>
    

    Part 2: Read a WEP WiFi configuration programmatically
    再次直截了当 . 以下是示例代码:

    void readWepConfig()
        { 
            WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
            List<WifiConfiguration> item = wifi.getConfiguredNetworks();
            int i = item.size();
            Log.d("WifiPreference", "NO OF CONFIG " + i );
            Iterator<WifiConfiguration> iter =  item.iterator();
            WifiConfiguration config = item.get(0);
            Log.d("WifiPreference", "SSID" + config.SSID);
            Log.d("WifiPreference", "PASSWORD" + config.preSharedKey);
            Log.d("WifiPreference", "ALLOWED ALGORITHMS");
            Log.d("WifiPreference", "LEAP" + config.allowedAuthAlgorithms.get(AuthAlgorithm.LEAP));
            Log.d("WifiPreference", "OPEN" + config.allowedAuthAlgorithms.get(AuthAlgorithm.OPEN));
            Log.d("WifiPreference", "SHARED" + config.allowedAuthAlgorithms.get(AuthAlgorithm.SHARED));
            Log.d("WifiPreference", "GROUP CIPHERS");
            Log.d("WifiPreference", "CCMP" + config.allowedGroupCiphers.get(GroupCipher.CCMP));
            Log.d("WifiPreference", "TKIP" + config.allowedGroupCiphers.get(GroupCipher.TKIP));
            Log.d("WifiPreference", "WEP104" + config.allowedGroupCiphers.get(GroupCipher.WEP104));
            Log.d("WifiPreference", "WEP40" + config.allowedGroupCiphers.get(GroupCipher.WEP40));
            Log.d("WifiPreference", "KEYMGMT");
            Log.d("WifiPreference", "IEEE8021X" + config.allowedKeyManagement.get(KeyMgmt.IEEE8021X));
            Log.d("WifiPreference", "NONE" + config.allowedKeyManagement.get(KeyMgmt.NONE));
            Log.d("WifiPreference", "WPA_EAP" + config.allowedKeyManagement.get(KeyMgmt.WPA_EAP));
            Log.d("WifiPreference", "WPA_PSK" + config.allowedKeyManagement.get(KeyMgmt.WPA_PSK));
            Log.d("WifiPreference", "PairWiseCipher");
            Log.d("WifiPreference", "CCMP" + config.allowedPairwiseCiphers.get(PairwiseCipher.CCMP));
            Log.d("WifiPreference", "NONE" + config.allowedPairwiseCiphers.get(PairwiseCipher.NONE));
            Log.d("WifiPreference", "TKIP" + config.allowedPairwiseCiphers.get(PairwiseCipher.TKIP));
            Log.d("WifiPreference", "Protocols");
            Log.d("WifiPreference", "RSN" + config.allowedProtocols.get(Protocol.RSN));
            Log.d("WifiPreference", "WPA" + config.allowedProtocols.get(Protocol.WPA));
            Log.d("WifiPreference", "WEP Key Strings");
            String[] wepKeys = config.wepKeys;
            Log.d("WifiPreference", "WEP KEY 0" + wepKeys[0]);
            Log.d("WifiPreference", "WEP KEY 1" + wepKeys[1]);
            Log.d("WifiPreference", "WEP KEY 2" + wepKeys[2]);
            Log.d("WifiPreference", "WEP KEY 3" + wepKeys[3]);
        }
    

    Part 3: Read a EAP WiFi Configuration programmatically
    现在这很棘手 . 您可以在WifiDialog.java中找到通过vanilla Android UI保存EAP WiFi配置的代码 . 很容易我们可以在我们的应用程序中使用相同的代码,不!如果你碰巧尝试这个,你会收到错误,说找不到符号 eapphaseclient_cert 等等 . 一个小小的详细调查告诉我们EnterpriseField_________ WiFiConfiguration 类,我们找不到的所有符号都是 EnterpriseField 类型 . 好吧,我们've hit a roadblock, We need these fields for reading/saving a EAP config but we don' t可以通过编程方式访问它们!

    Java Reflection API to the rescue 嗯,我不是Java专家,因此我不会深入了解Reflection API的详细信息,您可以谷歌获取教程或获取更多信息here . 为了保持Short和Sweet,Reflection API允许您在运行时检查类,接口,字段和方法,而无需在编译时知道类,方法等的名称 . 也可以使用反射来实例化新对象,调用方法和获取/设置字段值 . 重要的是 Reflection can help you access private data members inside a class 这就是我们需要的不是吗? :)

    我们现在查看代码示例,其中显示了如何使用Reflection Api读取EAP WiFi配置 . 作为奖励,该片段会将配置记录到一个文件并将其保存在SD卡上....非常光滑..eh;)一点点反射Api的概述,我确信 grab 下面的代码很容易 .

    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";
    

    这是在调用 readEapConfig() 函数之前在SD卡上创建日志文件的代码 .

    BufferedWriter out = null;
            try 
            {
                File root = Environment.getExternalStorageDirectory();
                Toast toast = Toast.makeText(this, "SD CARD mounted and writable? " + root.canWrite(), 5000);
                toast.show();
                if (root.canWrite())
                {
                    File gpxfile = new File(root, "ReadConfigLog.txt");
                    FileWriter gpxwriter = new FileWriter(gpxfile);
                    out = new BufferedWriter(gpxwriter);
                    out.write("Hello world");
                    //out.close();
                }
            } catch (IOException e) 
            {
                Toast toast = Toast.makeText(this, "Problem reading SD CARD", 3000);
                Toast toast2 = Toast.makeText(this, "Please take logs using Logcat", 5000);
                Log.e("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "Could not write file " + e.getMessage());
            }
    

    现在 readEapConfig() 函数本身:

    void readEapConfig(BufferedWriter out)
        {
            /*Get the WifiService */        
            WifiManager wifi = (WifiManager)getSystemService(WIFI_SERVICE);
            /*Get All WIfi configurations*/
            List<WifiConfiguration> configList = wifi.getConfiguredNetworks();
            /*Now we need to search appropriate configuration i.e. with name SSID_Name*/
            for(int i = 0;i<configList.size();i++)
            {
                if(configList.get(i).SSID.contentEquals("\"SSID_NAME\""))
                {
                    /*We found the appropriate config now read all config details*/
                    Iterator<WifiConfiguration> iter =  configList.iterator();
                    WifiConfiguration config = configList.get(i);
    
                    /*I dont think these fields have anything to do with EAP config but still will
                     * print these to be on safe side*/
                    try {
                    Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[SSID]" + config.SSID);
                    out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[SSID]" + config.SSID);
                    Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[BSSID]" + config.BSSID);
                    out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" +"[BSSID]" + config.BSSID);
                    Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[HIDDEN SSID]" + config.hiddenSSID);
                    out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[HIDDEN SSID]" + config.hiddenSSID);
                    Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[PASSWORD]" + config.preSharedKey);
                    out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>"+ "[PASSWORD]" + config.preSharedKey);
                    Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[ALLOWED ALGORITHMS]");
                    out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>"+ "[ALLOWED ALGORITHMS]");
                    Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[LEAP]" + config.allowedAuthAlgorithms.get(AuthAlgorithm.LEAP));
                    out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[LEAP]" + config.allowedAuthAlgorithms.get(AuthAlgorithm.LEAP));
                    Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[OPEN]" + config.allowedAuthAlgorithms.get(AuthAlgorithm.OPEN));
                    out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[OPEN]" + config.allowedAuthAlgorithms.get(AuthAlgorithm.OPEN));
                    Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[SHARED]" + config.allowedAuthAlgorithms.get(AuthAlgorithm.SHARED));
                    out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[SHARED]" + config.allowedAuthAlgorithms.get(AuthAlgorithm.SHARED));
                    Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[GROUP CIPHERS]");
                    out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[GROUP CIPHERS]");
                    Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[CCMP]" + config.allowedGroupCiphers.get(GroupCipher.CCMP));
                    out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[CCMP]" + config.allowedGroupCiphers.get(GroupCipher.CCMP));
                    Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" , "[TKIP]" + config.allowedGroupCiphers.get(GroupCipher.TKIP));
                    out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>"+ "[TKIP]" + config.allowedGroupCiphers.get(GroupCipher.TKIP));
                    Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[WEP104]" + config.allowedGroupCiphers.get(GroupCipher.WEP104));
                    out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[WEP104]" + config.allowedGroupCiphers.get(GroupCipher.WEP104));
                    Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[WEP40]" + config.allowedGroupCiphers.get(GroupCipher.WEP40));
                    out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[WEP40]" + config.allowedGroupCiphers.get(GroupCipher.WEP40));
                    Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[KEYMGMT]");
                    out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[KEYMGMT]");
                    Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[IEEE8021X]" + config.allowedKeyManagement.get(KeyMgmt.IEEE8021X));
                    out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>"+ "[IEEE8021X]" + config.allowedKeyManagement.get(KeyMgmt.IEEE8021X));
                    Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[NONE]" + config.allowedKeyManagement.get(KeyMgmt.NONE));
                    out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[NONE]" + config.allowedKeyManagement.get(KeyMgmt.NONE));
                    Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[WPA_EAP]" + config.allowedKeyManagement.get(KeyMgmt.WPA_EAP));
                    out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[WPA_EAP]" + config.allowedKeyManagement.get(KeyMgmt.WPA_EAP));
                    Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[WPA_PSK]" + config.allowedKeyManagement.get(KeyMgmt.WPA_PSK));
                    out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[WPA_PSK]" + config.allowedKeyManagement.get(KeyMgmt.WPA_PSK));
                    Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[PairWiseCipher]");
                    out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[PairWiseCipher]");
                    Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[CCMP]" + config.allowedPairwiseCiphers.get(PairwiseCipher.CCMP));
                    out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[CCMP]" + config.allowedPairwiseCiphers.get(PairwiseCipher.CCMP));
                    Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[NONE]" + config.allowedPairwiseCiphers.get(PairwiseCipher.NONE));
                    out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[NONE]" + config.allowedPairwiseCiphers.get(PairwiseCipher.NONE));
                    Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[TKIP]" + config.allowedPairwiseCiphers.get(PairwiseCipher.TKIP));
                    out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[TKIP]" + config.allowedPairwiseCiphers.get(PairwiseCipher.TKIP));
                    Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[Protocols]");
                    out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[Protocols]");
                    Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[RSN]" + config.allowedProtocols.get(Protocol.RSN));
                    out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[RSN]" + config.allowedProtocols.get(Protocol.RSN));
                    Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[WPA]" + config.allowedProtocols.get(Protocol.WPA));
                    out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[WPA]" + config.allowedProtocols.get(Protocol.WPA));
                    Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[PRE_SHARED_KEY]" + config.preSharedKey);
                    out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[PRE_SHARED_KEY]" + config.preSharedKey);
                    Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[WEP Key Strings]");
                    out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[WEP Key Strings]");
                    String[] wepKeys = config.wepKeys;
                    Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[WEP KEY 0]" + wepKeys[0]);
                    out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[WEP KEY 0]" + wepKeys[0]);
                    Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[WEP KEY 1]" + wepKeys[1]);
                    out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[WEP KEY 1]" + wepKeys[1]);
                    Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[WEP KEY 2]" + wepKeys[2]);
                    out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[WEP KEY 2]" + wepKeys[2]);
                    Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[WEP KEY 3]" + wepKeys[3]);
                    out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[WEP KEY 3]" + wepKeys[3]);
    
                    }
                    catch(IOException e) 
                    {
                        Toast toast1 = Toast.makeText(this, "Failed to write Logs to ReadConfigLog.txt", 3000);
                        Toast toast2 = Toast.makeText(this, "Please take logs using Logcat", 5000);
                        Log.e("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "Could not write to ReadConfigLog.txt" + e.getMessage());
                    }
                    /*reflection magic*/
                    /*These are the fields we are really interested in*/
                    try 
                    {
                        // Let the magic start
                        Class[] wcClasses = WifiConfiguration.class.getClasses();
                        // null for overzealous java compiler
                        Class wcEnterpriseField = null;
    
                        for (Class wcClass : wcClasses)
                            if (wcClass.getName().equals(INT_ENTERPRISEFIELD_NAME)) 
                            {
                                wcEnterpriseField = wcClass;
                                break;
                            }
                        boolean noEnterpriseFieldType = false; 
                        if(wcEnterpriseField == null)
                            noEnterpriseFieldType = true; // Cupcake/Donut access enterprise settings directly
    
                        Field wcefAnonymousId = null, wcefCaCert = null, wcefClientCert = null, wcefEap = null, wcefIdentity = null, wcefPassword = null, wcefPhase2 = null, wcefPrivateKey = null;
                        Field[] wcefFields = WifiConfiguration.class.getFields();
                        // Dispatching Field vars
                        for (Field wcefField : wcefFields) 
                        {
                            if (wcefField.getName().trim().equals(INT_ANONYMOUS_IDENTITY))
                                wcefAnonymousId = wcefField;
                            else if (wcefField.getName().trim().equals(INT_CA_CERT))
                                wcefCaCert = wcefField;
                            else if (wcefField.getName().trim().equals(INT_CLIENT_CERT))
                                wcefClientCert = wcefField;
                            else if (wcefField.getName().trim().equals(INT_EAP))
                                wcefEap = wcefField;
                            else if (wcefField.getName().trim().equals(INT_IDENTITY))
                                wcefIdentity = wcefField;
                            else if (wcefField.getName().trim().equals(INT_PASSWORD))
                                wcefPassword = wcefField;
                            else if (wcefField.getName().trim().equals(INT_PHASE2))
                                wcefPhase2 = wcefField;
                            else if (wcefField.getName().trim().equals(INT_PRIVATE_KEY))
                                wcefPrivateKey = wcefField;
                        }
                    Method wcefValue = null;
                    if(!noEnterpriseFieldType)
                    {
                    for(Method m: wcEnterpriseField.getMethods())
                    //System.out.println(m.getName());
                    if(m.getName().trim().equals("value")){
                        wcefValue = m;
                        break;
                    }
                    }
    
                    /*EAP Method*/
                    String result = null;
                    Object obj = null;
                    if(!noEnterpriseFieldType)
                    {
                        obj = wcefValue.invoke(wcefEap.get(config), null);
                        String retval = (String)obj;
                        Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[EAP METHOD]" + retval);
                        out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[EAP METHOD]" + retval);
                    }
                    else
                    {
                        obj = wcefEap.get(config);
                        String retval = (String)obj;                        
                    }
    
                    /*phase 2*/
                    if(!noEnterpriseFieldType)
                    {
                        result = (String) wcefValue.invoke(wcefPhase2.get(config), null);
                        Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[EAP PHASE 2 AUTHENTICATION]" + result);
                        out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[EAP PHASE 2 AUTHENTICATION]" + result);
                    }
                    else
                    {
                        result = (String) wcefPhase2.get(config);
                    }
    
                    /*Anonymous Identity*/
                    if(!noEnterpriseFieldType)
                    {
                        result = (String) wcefValue.invoke(wcefAnonymousId.get(config),null);
                        Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[EAP ANONYMOUS IDENTITY]" + result);
                        out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[EAP ANONYMOUS IDENTITY]" + result);
                    }
                    else
                    {
                        result = (String) wcefAnonymousId.get(config);
                    }
    
                    /*CA certificate*/
                    if(!noEnterpriseFieldType)
                    {
                        result = (String) wcefValue.invoke(wcefCaCert.get(config), null);
                        Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[EAP CA CERTIFICATE]" + result);
                        out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[EAP CA CERTIFICATE]" + result);
                    }
                    else
                    {
                        result = (String)wcefCaCert.get(config);
    
                    }
    
                    /*private key*/
                    if(!noEnterpriseFieldType)
                    {
                        result = (String) wcefValue.invoke(wcefPrivateKey.get(config),null);
                        Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[EAP PRIVATE KEY]" + result);
                        out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[EAP PRIVATE KEY]" + result);
                    }
                    else
                    {
                        result = (String)wcefPrivateKey.get(config);
                    }
    
                    /*Identity*/
                    if(!noEnterpriseFieldType)
                    {
                        result = (String) wcefValue.invoke(wcefIdentity.get(config), null);
                        Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[EAP IDENTITY]" + result);
                        out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[EAP IDENTITY]" + result);
                    }
                    else
                    {
                        result = (String)wcefIdentity.get(config);
                    }
    
                    /*Password*/
                    if(!noEnterpriseFieldType)
                    {
                        result = (String) wcefValue.invoke(wcefPassword.get(config), null);
                        Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[EAP PASSWORD]" + result);
                        out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[EAP PASSWORD]" + result);
                    }
                    else
                    {
                        result = (String)wcefPassword.get(config);
                    }
    
                    /*client certificate*/
                    if(!noEnterpriseFieldType)
                    {
                        result = (String) wcefValue.invoke(wcefClientCert.get(config), null);
                        Log.d("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "[EAP CLIENT CERT]" + result);
                        out.write("<<<<<<<<<<WifiPreference>>>>>>>>>>>>" + "[EAP CLIENT CERT]" + result);
                        Toast toast1 = Toast.makeText(this, "All config data logged to ReadConfigLog.txt", 3000);
                        Toast toast2 = Toast.makeText(this, "Extract ReadConfigLog.txt from SD CARD", 5000);
                    }
                    else
                    {
                        result = (String)wcefClientCert.get(config);
                    }
    
                    out.close();
    
                    }
                    catch(IOException e) 
                    {
                        Toast toast1 = Toast.makeText(this, "Failed to write Logs to ReadConfigLog.txt", 3000);
                        Toast toast2 = Toast.makeText(this, "Please take logs using Logcat", 5000);
                        Log.e("<<<<<<<<<<WifiPreference>>>>>>>>>>>>", "Could not write to ReadConfigLog.txt" + e.getMessage());
                    }
                    catch(Exception e)
                    {
                        e.printStackTrace();
                    }
    
                }
            }
        }
    
  • 34

    啊,我没有编辑空间,在这里添加剩下的部分 .

    Part 4: Save a EAP WiFi configuration programmatically

    如果您已经阅读了第3部分,那么您已经理解了在这里工作的Reflection魔法,如果您直接跳到本节,请阅读第3部分中的代码片段之前的介绍,您将可以快速完成这里的代码 . !

    void saveEapConfig(String passString, String userName)
        {
        /********************************Configuration Strings****************************************************/
        final String ENTERPRISE_EAP = "TLS";
        final String ENTERPRISE_CLIENT_CERT = "keystore://USRCERT_CertificateName";
        final String ENTERPRISE_PRIV_KEY = "USRPKEY_CertificateName";
        //CertificateName = Name given to the certificate while installing it
    
        /*Optional Params- My wireless Doesn't use these*/
        final String ENTERPRISE_PHASE2 = "";
        final String ENTERPRISE_ANON_IDENT = "ABC";
        final String ENTERPRISE_CA_CERT = ""; // If required: "keystore://CACERT_CaCertificateName"
        /********************************Configuration Strings****************************************************/
    
        /*Create a WifiConfig*/
        WifiConfiguration selectedConfig = new WifiConfiguration();
    
        /*AP Name*/
        selectedConfig.SSID = "\"SSID_Name\"";
    
        /*Priority*/
        selectedConfig.priority = 40;
    
        /*Enable Hidden SSID*/
        selectedConfig.hiddenSSID = true;
    
        /*Key Mgmnt*/
        selectedConfig.allowedKeyManagement.clear();
        selectedConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.IEEE8021X);
        selectedConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);
    
        /*Group Ciphers*/
        selectedConfig.allowedGroupCiphers.clear();
        selectedConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
        selectedConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
        selectedConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
        selectedConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
    
        /*Pairwise ciphers*/
        selectedConfig.allowedPairwiseCiphers.clear();
        selectedConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
        selectedConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
    
        /*Protocols*/
        selectedConfig.allowedProtocols.clear();
        selectedConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
        selectedConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
    
        // Enterprise Settings
        // Reflection magic here too, need access to non-public APIs
        try {
            // Let the magic start
            Class[] wcClasses = WifiConfiguration.class.getClasses();
            // null for overzealous java compiler
            Class wcEnterpriseField = null;
    
            for (Class wcClass : wcClasses)
                if (wcClass.getName().equals(INT_ENTERPRISEFIELD_NAME)) 
                {
                    wcEnterpriseField = wcClass;
                    break;
                }
            boolean noEnterpriseFieldType = false; 
            if(wcEnterpriseField == null)
                noEnterpriseFieldType = true; // Cupcake/Donut access enterprise settings directly
    
            Field wcefAnonymousId = null, wcefCaCert = null, wcefClientCert = null, wcefEap = null, wcefIdentity = null, wcefPassword = null, wcefPhase2 = null, wcefPrivateKey = null, wcefEngine = null, wcefEngineId = null;
            Field[] wcefFields = WifiConfiguration.class.getFields();
            // Dispatching Field vars
            for (Field wcefField : wcefFields) 
            {
                if (wcefField.getName().equals(INT_ANONYMOUS_IDENTITY))
                    wcefAnonymousId = wcefField;
                else if (wcefField.getName().equals(INT_CA_CERT))
                    wcefCaCert = wcefField;
                else if (wcefField.getName().equals(INT_CLIENT_CERT))
                    wcefClientCert = wcefField;
                else if (wcefField.getName().equals(INT_EAP))
                    wcefEap = wcefField;
                else if (wcefField.getName().equals(INT_IDENTITY))
                    wcefIdentity = wcefField;
                else if (wcefField.getName().equals(INT_PASSWORD))
                    wcefPassword = wcefField;
                else if (wcefField.getName().equals(INT_PHASE2))
                    wcefPhase2 = wcefField;
                else if (wcefField.getName().equals(INT_PRIVATE_KEY))
                    wcefPrivateKey = wcefField;
                else if (wcefField.getName().equals("engine"))
                    wcefEngine = wcefField;
                else if (wcefField.getName().equals("engine_id"))
                    wcefEngineId = wcefField;
            }
    
    
            Method wcefSetValue = null;
            if(!noEnterpriseFieldType){
            for(Method m: wcEnterpriseField.getMethods())
                //System.out.println(m.getName());
                if(m.getName().trim().equals("setValue"))
                    wcefSetValue = m;
            }
    
    
            /*EAP Method*/
            if(!noEnterpriseFieldType)
            {
                    wcefSetValue.invoke(wcefEap.get(selectedConfig), ENTERPRISE_EAP);
            }
            else
            {
                    wcefEap.set(selectedConfig, ENTERPRISE_EAP);
            }
            /*EAP Phase 2 Authentication*/
            if(!noEnterpriseFieldType)
            {
                    wcefSetValue.invoke(wcefPhase2.get(selectedConfig), ENTERPRISE_PHASE2);
            }
            else
            {
                  wcefPhase2.set(selectedConfig, ENTERPRISE_PHASE2);
            }
            /*EAP Anonymous Identity*/
            if(!noEnterpriseFieldType)
            {
                    wcefSetValue.invoke(wcefAnonymousId.get(selectedConfig), ENTERPRISE_ANON_IDENT);
            }
            else
            {
                  wcefAnonymousId.set(selectedConfig, ENTERPRISE_ANON_IDENT);
            }
            /*EAP CA Certificate*/
            if(!noEnterpriseFieldType)
            {
                    wcefSetValue.invoke(wcefCaCert.get(selectedConfig), ENTERPRISE_CA_CERT);
            }
            else
            {
                  wcefCaCert.set(selectedConfig, ENTERPRISE_CA_CERT);
            }               
            /*EAP Private key*/
            if(!noEnterpriseFieldType)
            {
                    wcefSetValue.invoke(wcefPrivateKey.get(selectedConfig), ENTERPRISE_PRIV_KEY);
            }
            else
            {
                  wcefPrivateKey.set(selectedConfig, ENTERPRISE_PRIV_KEY);
            }               
            /*EAP Identity*/
            if(!noEnterpriseFieldType)
            {
                    wcefSetValue.invoke(wcefIdentity.get(selectedConfig), userName);
            }
            else
            {
                  wcefIdentity.set(selectedConfig, userName);
            }               
            /*EAP Password*/
            if(!noEnterpriseFieldType)
            {
                    wcefSetValue.invoke(wcefPassword.get(selectedConfig), passString);
            }
            else
            {
                  wcefPassword.set(selectedConfig, passString);
            }               
            /*EAp Client certificate*/
            if(!noEnterpriseFieldType)
            {
                wcefSetValue.invoke(wcefClientCert.get(selectedConfig), ENTERPRISE_CLIENT_CERT);
            }
            else
            {
                  wcefClientCert.set(selectedConfig, ENTERPRISE_CLIENT_CERT);
            }
            /*Engine fields*/
            if(!noEnterpriseFieldType)
            {
               wcefSetValue.invoke(wcefEngine.get(wifiConf), "1");
               wcefSetValue.invoke(wcefEngineId.get(wifiConf), "keystore");
            }
    
            // Adhoc for CM6
            // if non-CM6 fails gracefully thanks to nested try-catch
    
            try{
            Field wcAdhoc = WifiConfiguration.class.getField("adhocSSID");
            Field wcAdhocFreq = WifiConfiguration.class.getField("frequency");
            //wcAdhoc.setBoolean(selectedConfig, prefs.getBoolean(PREF_ADHOC,
            //      false));
            wcAdhoc.setBoolean(selectedConfig, false);
            int freq = 2462;    // default to channel 11
            //int freq = Integer.parseInt(prefs.getString(PREF_ADHOC_FREQUENCY,
            //"2462"));     // default to channel 11
            //System.err.println(freq);
            wcAdhocFreq.setInt(selectedConfig, freq); 
            } catch (Exception e)
            {
                e.printStackTrace();
            }
    
        } catch (Exception e)
        {
            // TODO Auto-generated catch block
            // FIXME As above, what should I do here?
            e.printStackTrace();
        }
    
        WifiManager wifiManag = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        boolean res1 = wifiManag.setWifiEnabled(true);
        int res = wifiManag.addNetwork(selectedConfig);
        Log.d("WifiPreference", "add Network returned " + res );
        boolean b = wifiManag.enableNetwork(selectedConfig.networkId, false);
        Log.d("WifiPreference", "enableNetwork returned " + b );
        boolean c = wifiManag.saveConfiguration();
        Log.d("WifiPreference", "Save configuration returned " + c );
        boolean d = wifiManag.enableNetwork(res, true);   
        Log.d("WifiPreference", "enableNetwork returned " + d );  
    }
    

    好吧,就是这样!我希望这可以帮助一些失去的开发人员,某个地方,某个时候:)

  • 5

    Android已经为JellyBean 4.3添加了一个API . 如果要在API 18上配置WIFI,则必须使用此选项:

    http://developer.android.com/reference/android/net/wifi/WifiEnterpriseConfig.html

  • 1

    第4部分让我走上了正确的道路!但是我想创建一个TTLS而不是TLS配置,这就是我做到的!

    /********************************Configuration Strings****************************************************/
        final String ENTERPRISE_EAP = "TTLS";
    
        /*Optional Params- My wireless Doesn't use these*/
        final String ENTERPRISE_PHASE2 = "PAP";
        final String ENTERPRISE_ANON_IDENT = "ABC";
        final String ENTERPRISE_CA_CERT = "";
        /********************************Configuration Strings****************************************************/
    
        /*Create a WifiConfig*/
        WifiConfiguration selectedConfig = new WifiConfiguration();
    
        /*AP Name*/
        selectedConfig.SSID = "\"EAP_SSID_TEST_CONFIG\"";
    
        /*Priority*/
        selectedConfig.priority = 40;
    
        /*Enable Hidden SSID*/
        selectedConfig.hiddenSSID = false;
    
        /*Key Mgmnt*/
        selectedConfig.allowedKeyManagement.clear();
        selectedConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.IEEE8021X);
        selectedConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);
    
        /*Group Ciphers*/
        selectedConfig.allowedGroupCiphers.clear();
        selectedConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
        selectedConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
        selectedConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
        selectedConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
    
        /*Pairwise ciphers*/
        selectedConfig.allowedPairwiseCiphers.clear();
        selectedConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
        selectedConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
    
        /*Protocols*/
        selectedConfig.allowedProtocols.clear();
        selectedConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
        selectedConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
    
        // Enterprise Settings
        // Reflection magic here too, need access to non-public APIs
        try {
            // Let the magic start
            Class[] wcClasses = WifiConfiguration.class.getClasses();
            // null for overzealous java compiler
            Class wcEnterpriseField = null;
    
            for (Class wcClass : wcClasses)
                if (wcClass.getName().equals(INT_ENTERPRISEFIELD_NAME)) 
                {
                    wcEnterpriseField = wcClass;
                    break;
                }
            boolean noEnterpriseFieldType = false; 
            if(wcEnterpriseField == null)
                noEnterpriseFieldType = true; // Cupcake/Donut access enterprise settings directly
    
            Field wcefAnonymousId = null, wcefCaCert = null, wcefClientCert = null, wcefEap = null, wcefIdentity = null, wcefPassword = null, wcefPhase2 = null, wcefPrivateKey = null;
            Field[] wcefFields = WifiConfiguration.class.getFields();
            // Dispatching Field vars
            for (Field wcefField : wcefFields) 
            {
                if (wcefField.getName().equals(INT_ANONYMOUS_IDENTITY))
                    wcefAnonymousId = wcefField;
                else if (wcefField.getName().equals(INT_CA_CERT))
                    wcefCaCert = wcefField;
                else if (wcefField.getName().equals(INT_CLIENT_CERT))
                    wcefClientCert = wcefField;
                else if (wcefField.getName().equals(INT_EAP))
                    wcefEap = wcefField;
                else if (wcefField.getName().equals(INT_IDENTITY))
                    wcefIdentity = wcefField;
                else if (wcefField.getName().equals(INT_PASSWORD))
                    wcefPassword = wcefField;
                else if (wcefField.getName().equals(INT_PHASE2))
                    wcefPhase2 = wcefField;
                else if (wcefField.getName().equals(INT_PRIVATE_KEY))
                    wcefPrivateKey = wcefField;
            }
    
    
            Method wcefSetValue = null;
            if(!noEnterpriseFieldType){
            for(Method m: wcEnterpriseField.getMethods())
                //System.out.println(m.getName());
                if(m.getName().trim().equals("setValue"))
                    wcefSetValue = m;
            }
    
    
            /*EAP Method*/
            if(!noEnterpriseFieldType){
                wcefSetValue.invoke(wcefEap.get(selectedConfig), ENTERPRISE_EAP);
            }
            /*EAP Phase 2 Authentication*/
            if(!noEnterpriseFieldType){
                wcefSetValue.invoke(wcefPhase2.get(selectedConfig), ENTERPRISE_PHASE2);
            }
            /*EAP Anonymous Identity*/
            if(!noEnterpriseFieldType){
                wcefSetValue.invoke(wcefAnonymousId.get(selectedConfig), ENTERPRISE_ANON_IDENT);
            }
            /*EAP CA Certificate*/
            if(!noEnterpriseFieldType){
                wcefSetValue.invoke(wcefCaCert.get(selectedConfig), ENTERPRISE_CA_CERT);
            }
    
    
            /*EAP Identity*/
            if(!noEnterpriseFieldType){
                wcefSetValue.invoke(wcefIdentity.get(selectedConfig), "test user name");
            }
            /*EAP Password*/
            if(!noEnterpriseFieldType){
                wcefSetValue.invoke(wcefPassword.get(selectedConfig), "test password");
            }
    
    
            try{
    
            } catch (Exception e)
            {
                e.printStackTrace();
            }
    
        } catch (Exception e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    
        WifiManager wifiManag = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        boolean res1 = wifiManag.setWifiEnabled(true);
        int res = wifiManag.addNetwork(selectedConfig);
        Log.d("WifiPreference", "add Network returned " + res );
    //        boolean b = wifiManag.enableNetwork(selectedConfig.networkId, false);
    //        Log.d("WifiPreference", "enableNetwork returned " + b );
    //        boolean c = wifiManag.saveConfiguration();
    //        Log.d("WifiPreference", "Save configuration returned " + c );
    //        boolean d = wifiManag.enableNetwork(res, true);   
    //        Log.d("WifiPreference", "enableNetwork returned " + d ); 
    
    
    }
    

    希望这对某人有所帮助 . @Android学习者我删除了关于adHocFrequency和SSID的内容,因为它们导致了崩溃,但没有它们我的结果仍然很好 .

  • 0

    WEP密钥被屏蔽,因此无法使用上述代码读取它们

    Log.d("WifiPreference", "WEP KEY 0" + wepKeys[0]);
        Log.d("WifiPreference", "WEP KEY 1" + wepKeys[1]);
        Log.d("WifiPreference", "WEP KEY 2" + wepKeys[2]);
        Log.d("WifiPreference", "WEP KEY 3" + wepKeys[3]);
    

    有没有办法像EAP解决方案一样解决这个问题?用反射?

相关问题