एंड्रॉइड में WEP / EAP वाईफाई कॉन्फ़िगरेशन को प्रोग्राम बनाने और पढ़ने के लिए कैसे?


111

WEP/EAP WiFi configurationsएंड्रॉइड में प्रोग्राम बनाने और पढ़ने के लिए कैसे ?

मैंने विभिन्न मंचों पर और पूरे समुदाय में इस सवाल पर कई लोगों को संघर्ष करते देखा है। मुझे पता है कि यह सीधे तौर पर (विशेष रूप से ईएपी) यह पता लगाने के लिए नहीं है क्योंकि जब मैं वही हासिल करना चाहता था तो मैंने भी काफी संघर्ष किया था। वास्तव में, कोड विश्लेषण की सारी मेहनत और मेरे साथ किए गए इंटरनेट पर विभिन्न कार्यान्वयन की खोज करना था। अंत में लक्ष्य हासिल करने में सक्षम। सारा श्रेय ओपन सोर्स प्रोजेक्ट्स और उनके डेवलपर्स की संख्या को जाता है।

मैं इस ज्ञान को सभी के साथ साझा करना चाहूंगा, क्योंकि एसओ इसे प्रोत्साहित करता है: "यह आपके स्वयं के प्रश्न पूछने और उत्तर देने के लिए पूरी तरह से ठीक है, जब तक आप खतरे में नहीं पड़ते हैं: इसे एक प्रश्न के रूप में वाक्यांश दें।"

भाग 1: प्रोग्राम को WEP WiFi कॉन्फ़िगरेशन बनाना।

भाग 2: एक WEP WiFi कॉन्फ़िगरेशन को प्रोग्रामेटिक रूप से पढ़ें।

भाग 3: EAP WiFi कॉन्फ़िगरेशन को प्रोग्रामेटिक रूप से पढ़ें।

भाग 4: ईएपी वाईफाई कॉन्फ़िगरेशन को प्रोग्रामेटिक रूप से सेव करें।


मेरा सुझाव है कि आप इसे एक प्रश्न के रूप में प्रारूपित करें और फिर स्वयं इसका उत्तर दें। इसे अच्छी तरह से प्रारूपित करें और हमारे पास एक गुणवत्ता प्रश्न और उत्तर होगा।
ऑक्टेवियन ए। डामियन

@ ओक्टेवियन डैमियन: हेड्स अप के लिए धन्यवाद। मैंने अच्छी फॉर्मेटिंग सुनिश्चित करने की कोशिश की। किसी भी टिप्पणी का स्वागत है!
आलोक सेव

अच्छा लग रहा है! साझा करने के लिए धन्यवाद! हमें SO Android चैट रूम में जाएँ
ऑक्टेवियन ए। डामियन

एंड्रॉइड WifiEnterpriseConfig को एपीआई 18 में ईएपी वाईफाई का समर्थन करने के लिए जोड़ता है
ओस्पाइडर

यह बहुत उपयोगी है। वास्तव में जानना चाहते हैं कि इस विषय के बारे में दस्तावेज़ कहाँ है? एंड्रॉइड के डॉक्स मुझे कुछ नहीं बताते :(
चार्ल्सजेन

जवाबों:


107

भाग 1: प्रोग्राम को WEP WiFi कॉन्फ़िगरेशन बनाना

यह बहुत सीधा है, 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>

भाग 2: एक WEP WiFi कॉन्फ़िगरेशन को प्रोग्रामली
स्ट्रेन्फोवर्डवर्ड फिर से पढ़ें । यहाँ नमूना कोड है:

    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]);
    }

भाग 3: EAP WiFi कॉन्फ़िगरेशन को प्रोग्रामेटिक रूप से पढ़ें
अब यह मुश्किल है। आप WifiDialog.java में वेनिला एंड्रॉइड यूआई के माध्यम से ईएपी वाईफाई कॉन्फ़िगरेशन को सहेजने वाला कोड पा सकते हैं। अच्छी तरह से पर्याप्त आसान हम अपने आवेदन में एक ही कोड का उपयोग कर सकते हैं, खैर नहीं! आप इस कोशिश के लिए हो, तो आप कह प्रतीकों नहीं मिल सकता है त्रुटियां मिलेंगीeap,phase,client_certऔर इतने पर। एक छोटी सी विस्तृत जाँच हमें एंटरफ़िल्डis private कोWiFiConfigurationकक्षा केअंदरबताती है और हमारे द्वारा खोजे जा सकने वाले सभी प्रतीक प्रकार के नहीं होते हैंEnterpriseField। खैर, हमने एक सड़क को मारा है, हमें ईएपी कॉन्फ़िगरेशन को पढ़ने / सहेजने के लिए इन क्षेत्रों की आवश्यकता है, लेकिन हमारे पास उनके लिए प्रोग्रामेटिक एक्सेस नहीं है!

Java Reflection APIबचाव के लिए मैं एक जावा विशेषज्ञ नहीं हूं, इसलिए मैं रिफ्लेक्शन एपीआई के विवरण में नहीं आऊंगा और आप ट्यूटोरियल के लिए गूगल कर सकते हैं या यहां अधिक जानकारी प्राप्त कर सकते हैं । इसे छोटा और मीठा रखने के लिए, परावर्तन एपीआई आपको संकलित समय पर कक्षाओं, विधियों आदि के नामों को जाने बिना, रनटाइम के दौरान कक्षाओं, इंटरफेस, फ़ील्ड और विधियों का निरीक्षण करने की अनुमति देता है। यह भी संभव है कि नई वस्तुओं को त्वरित किया जाए, तरीकों का आह्वान किया जाए और प्रतिबिंब का उपयोग करके फ़ील्ड मान प्राप्त / सेट किया जाए। और, महत्वपूर्ण रूप से प्रतिबिंब आपको एक वर्ग के अंदर निजी डेटा सदस्यों तक पहुंचने में मदद कर सकता है खैर यह वही है जो हमें नहीं चाहिए? :)

आइए अब कोड उदाहरण देखें जो दर्शाता है कि रिफ्लेक्शन आपी का उपयोग करके ईएपी वाईफाई कॉन्फ़िगरेशन कैसे पढ़ें। एक बोनस के रूप में स्निपेट एक फ़ाइल में कॉन्फिग लॉग करेगा और इसे एसडी कार्ड पर सेव करेगा .... सुंदर स्लीक .. एह;) प्रतिबिंब अपी का थोड़ा सा अवलोकन और मुझे यकीन है कि नीचे दिए गए कोड को आसानी से प्राप्त करना आसान है।

    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()फ़ंक्शन को कॉल करने से पहले एसडी कार्ड पर लॉगफ़ाइल बनाने के लिए कोड है ।

        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();
                }

            }
        }
    }

मैंने ऐसा करने की कोशिश की, लेकिन किसी कारण से, यह वायरलेस नेटवर्क में एक नया इंटरफ़ेस बनाता है (एक टिप्पणी कहे जाने योग्य नहीं है) के साथ, लेकिन एसएसआईडी मूल नेटवर्क के समान ही है। इस संबंध में कोई मदद?
नितिनरेड्डी

@nithinreddy: मुझे डर है कि मैं अब एंड्रॉइड में डब नहीं करता (काफी लंबे समय से नहीं है) इसलिए संदेह है कि क्या मैं कोई मदद प्रदान कर सकता हूं। फ़िर, आपके पास एक ही SSID नाम के साथ दो कॉन्फिगर नहीं होने चाहिए, जैसे कि नहीं पहुंच समस्या, अपने कॉन्फ़िगरेशन मापदंडों की जाँच करें। मेरा अनुमान है कि वहाँ कहीं एक मिसमैच हो सकता है। एक मैन्युअल रूप से कॉन्फ़िगर करें। इसे मैन्युअल रूप से जांचें, फिर कनेक्ट करता है। प्रोग्राम को पैरामीटर्स को प्रोग्रामेटिक रूप से पढ़ें (ऊपर दिए गए उत्तरों में विवरण देखें) और फिर प्रोग्राम को एक कॉन्फ़िगरेशन बनाने के लिए उन मापदंडों का उपयोग करें। कनेक्ट वह नहीं है जिसे आपने प्रोग्रामिक रूप से जोड़ा है
आलोक सेव

1
@AlokSave यह बहुत अच्छा होगा, जब आप प्रमाणपत्रों के बारे में कदम देंगे। (ईएपी वाईफ़ाई के लिए)। मेरे पास कुछ प्रश्न हैं कि मैं उन प्रमाणपत्रों को कैसे बना सकता हूं और मैं उन्हें कैसे प्रोग्राम स्थापित कर सकता हूं। वास्तव में मैं पिछले दो दिनों से गुगली कर रहा हूं, लेकिन प्रोग्रामेटिक रूप से प्रमाणपत्र स्थापित करने का तरीका नहीं मिला। तो कृपया अपने ज्ञान को साझा करें।
एंड्रॉइड लर्नर

1
मैं पुष्टि करना चाहता हूं कि एंड्रॉइड पर WEP के साथ कुछ गलत है (4.1 यहां) जब यह प्रोग्रामिक रूप से कर रहा है। यदि मैं सिस्टम की सेटिंग में मैन्युअल रूप से ऐसा करता हूं, तो यह काम करता है। मैंने दिनों तक सब कुछ करने की कोशिश की, फिर WPA में बदल गया, और यह दोनों मामलों में काम किया (मैन्युअल और प्रोग्रामिक रूप से)। WEP के लिए: मैंने WEP संरचना को तब पढ़ा था जब इसे मैन्युअल रूप से बनाया गया था (जो काम करता है) इसे बिल्कुल प्रोग्राम के रूप में पुन: पेश करने के लिए, लेकिन कोई रास्ता नहीं, यह सिर्फ "OBTAINING_IPADDR" स्थिति में हमेशा के लिए रहता है। मुझे उसी मुद्दे के साथ एक और व्यक्ति मिला, इसलिए चेतावनी दी जाए। यहां इन्फोस महान हैं, लेकिन कुछ चीज गायब है (कम से कम कुछ मामलों में)।
एलेक्स

1
WEP के लिए आप AuthAlgorithm.OPEN का उपयोग क्यों करते हैं ?, Android प्रलेखन कहता है कि "ओपन सिस्टम प्रमाणीकरण (WPA / WPA2 के लिए आवश्यक)"
David

36

आह मैं संपादित स्थान से बाहर भाग गया, शेष भाग यहां जोड़ रहा हूं।

भाग 4: ईएपी वाईफाई कॉन्फ़िगरेशन को प्रोग्रामेटिक रूप से सेव करें

यदि आप पहले से ही भाग 3 को पढ़ते हैं, तो आप पहले से ही यहाँ काम करने वाले प्रतिबिंब जादू को समझते हैं, यदि आप सीधे इस खंड पर जा रहे हैं, तो कृपया भाग 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 );  
}

हां इसी तरह! और मुझे आशा है कि यह कुछ खोए हुए डेवलपर, कहीं न कहीं, कुछ समय में मदद करता है :)


7
@ लेबेस: जैसा कि मैंने उत्तर में उल्लेख किया है, इस स्रोत को मेरे द्वारा इंटरनेट और लॉन्ग बैक के विभिन्न स्रोतों से जानकारी प्राप्त करने के लिए विकसित किया गया था, उस समय एक नया एसडीके जारी किया गया था और इनके बारे में अधिक जानकारी उपलब्ध नहीं थी। मुझे नहीं पता वर्तमान एंड्रॉइड स्थिति जैसा कि मैं वर्तमान में एंड्रॉइड के साथ काम नहीं करता हूं। इसके अलावा, मैं इस कोड पर कोई कॉपीराइट नहीं रखता हूं और मुझे इसका उपयोग करने वाले किसी भी व्यक्ति में कोई समस्या नहीं है, यह पहली जगह में यहां पोस्ट करने का कारण है, लेकिन मुझे नहीं पता सूत्रों के विचारों / दृष्टिकोण के बारे में जिसने मुझे इस स्रोत को लिखने में मदद की।
आलोक सेव

1
Field wcAdhoc = WifiConfiguration.class.getField("adhocSSID"); Field wcAdhocFreq = WifiConfiguration.class.getField("frequency");। ये सदस्य WifiConfiguration.java में नहीं हैं। कोड मुझे एक अपवाद दे रहा है java.lang.NoSuchFieldException: adhocSSID । कृपया मदद कीजिए।
एंड्रॉइड लर्नर

1
मैं एंड्रॉइड 4.1.2 का उपयोग कर रहा हूं, इसलिए शायद यह कोड अब हाल के संस्करणों के साथ काम नहीं करता है।
टिआगो बाबो

1
मैंने देखा है कि यह 4.1 या 4.2 के लिए काम नहीं कर रहा है। लाइन wcefPrivateKey.get(selectedConfig)एक फेंकता है NullPointerException। किसी और से कोई भाग्य?
दुलक्स

1
आप सही हैं @PrashanthDebbadwar, यह एपीआई 18+ के लिए अब काम नहीं करता है। यह कोड केवल पहले के संस्करणों के लिए काम करता है।
बर्निनेटरडोर

5

Android ने JellyBean 4.3 में एक एपीआई जोड़ा है। यदि आप API 18 पर वाईफ़ाई को कॉन्फ़िगर करना चाहते हैं तो आपको इस विकल्प का उपयोग करना होगा:

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


2
यह सिर्फ "एक अन्य विकल्प" से अधिक है। android.net.wifi.WifiConfiguration $ EnterpriseField अब मौजूद नहीं है (संभवतः एपीआई 18 के रूप में जहां उन्होंने WifiEnterpriseConfig को जोड़ा है) तो आलोक का समाधान टूट जाता है। दोनों समाधान अब उन ऐप्स के लिए आवश्यक हैं जो API 18+ और API 17- पर चलाना चाहते हैं।
15

1

भाग ४ ने मुझे सही रास्ते पर ले जाने लगा! हालाँकि मैं टीएलएस कॉन्फिग के बजाय टीटीएलएस बनाना चाहता था यहाँ मैंने यह कैसे किया!

    /********************************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 के लिए भी प्रतिबिंब उन विशेष क्षेत्रों के लिए काम नहीं कर रहा है जिनकी हमें आवश्यकता है। क्या आपने अपनी समस्या का समाधान किया?
प्रशांत देवबदवार
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.