Wie programmiere und lese ich programmgesteuert WEP/EAP WiFi configurations
in Android?
Ich habe in verschiedenen Foren und in der ganzen Community eine Reihe von Menschen gesehen, die sich mit dieser Frage befasst haben. Ich weiß, dass dies nicht so einfach ist (insbesondere EAP), um es herauszufinden, denn als ich das Gleiche erreichen wollte, hatte auch ich große Probleme. Nun, all die harte Arbeit der Codeanalyse und der Suche nach verschiedenen Implementierungen im Internet war mit mir erledigt endlich in der Lage, das Ziel zu erreichen. Der gesamte Kredit geht an die Anzahl der Open Source-Projekte und deren Entwickler.
Ich möchte dieses Wissen mit allen teilen, da SO dies fördert : "Es ist auch vollkommen in Ordnung, Ihre eigene Frage zu stellen und zu beantworten, solange Sie so tun, als wären Sie in Gefahr: Formulieren Sie es in Form einer Frage."
Teil 1: Programmgesteuertes Erstellen einer WEP-WLAN-Konfiguration.
Teil 2: Lesen Sie programmgesteuert eine WEP-WLAN-Konfiguration.
Teil 3: Lesen Sie programmgesteuert eine EAP-WLAN-Konfiguration.
Teil 4: Speichern Sie eine EAP WiFi-Konfiguration programmgesteuert.
quelle
Antworten:
Teil 1: Programmgesteuertes Erstellen einer WEP-WLAN-Konfiguration
Dies ist ziemlich einfach. WifiConfiguration macht die Schnittstelle verfügbar , um dasselbe zu erstellen. Hier ist der Beispielcode:
Befolgen Sie die in AndroidManifest.xml erforderlichen Berechtigungen
Teil 2: Lesen Sie eine WEP WiFi-Konfiguration programmgesteuert
erneut. Hier ist der Beispielcode:
Teil 3: Programmgesteuertes Lesen einer EAP-WLAN-Konfiguration
Nun ist dies schwierig. Den Code zum Speichern einer EAP-WLAN-Konfiguration finden Sie über die Vanilla-Android-Benutzeroberfläche in WifiDialog.java . Gut einfach genug Wir können den gleichen Code in unserer Anwendung verwenden. Nun, NEIN! Wenn Sie dies versuchen, werden Fehler angezeigt, die besagen
eap
,dass die Symbole nicht gefunden werdenkönnenphase
,client_cert
und so weiter. Eine kleine detaillierte Untersuchung zeigt uns, dass EnterpriseFieldis private
innerhalb derWiFiConfiguration
Klasse und alle Symbole, die wir nicht finden können, vom Typ sindEnterpriseField
. Nun, wir haben eine Straßensperre erreicht. Wir benötigen diese Felder zum Lesen / Speichern einer EAP-Konfiguration, haben aber keinen programmgesteuerten Zugriff darauf!Java Reflection API
zur Rettung bin Nunich kein JavaExpertedamit ich in als solche Einzelheiten der ReflectionAPI werden wont bekommen und Sie können für Tutorials Google oder weitere Informationen erhalten Sie hier . Um es kurz und bündig zu halten, können Sie mit der Reflection-API zur Laufzeit Klassen, Schnittstellen, Felder und Methoden überprüfen, ohne die Namen der Klassen, Methoden usw. zur Kompilierungszeit zu kennen. Es ist auch möglich, neue Objekte zu instanziieren, Methoden aufzurufen und Feldwerte mithilfe von Reflection abzurufen / festzulegen. Und vor allem Reflection kann Ihnen helfen, auf private Datenelemente innerhalb einer Klasse zuzugreifen. Nun, das ist es, was wir brauchen, nicht wahr? :) :)Schauen wir uns jetzt das Codebeispiel an, das zeigt, wie eine EAP-WLAN-Konfiguration mit Reflection Api gelesen wird. Als Bonus protokolliert das Snippet die Konfiguration in einer Datei und speichert sie auf der SD-Karte. Ziemlich schick.
Dies ist der Code zum Erstellen einer Protokolldatei auf der SD-Karte, bevor die
readEapConfig()
Funktion aufgerufen wird .Nun die
readEapConfig()
Funktion selbst:quelle
Ahh, mir ist der Bearbeitungsraum ausgegangen, und der verbleibende Teil wurde hier hinzugefügt.
Teil 4: Speichern Sie eine EAP WiFi-Konfiguration programmgesteuert
Wenn Sie Teil 3 bereits gelesen haben, verstehen Sie bereits die Reflexionsmagie, die hier funktioniert. Wenn Sie direkt zu diesem Abschnitt springen, lesen Sie bitte die Einführung vor dem Code-Snippet in Teil 3, und Sie können den Code hier schnell durchblättern !
Das war's! Und ich hoffe, das hilft einem verlorenen Entwickler, irgendwo, irgendwann :)
quelle
Field wcAdhoc = WifiConfiguration.class.getField("adhocSSID"); Field wcAdhocFreq = WifiConfiguration.class.getField("frequency");
. Diese Mitglieder befinden sich nicht in WifiConfiguration.java. Der Code gibt mir eine Ausnahmejava.lang.NoSuchFieldException: adhocSSID
. Bitte helfen Sie.wcefPrivateKey.get(selectedConfig)
wirft aNullPointerException
. Hast du Glück von jemand anderem?Android hat JellyBean 4.3 um eine API erweitert. Sie müssen diese Option verwenden, wenn Sie WIFI auf API 18 konfigurieren möchten:
http://developer.android.com/reference/android/net/wifi/WifiEnterpriseConfig.html
quelle
Teil 4 hat mich auf den richtigen Weg gebracht! Allerdings wollte ich eine TTLS anstatt TLS-Konfiguration erstellen. Hier ist, wie ich es gemacht habe!
Hoffe das hilft jemandem. @ Android-Lernender Ich habe das bisschen über adHocFrequency und SSID entfernt, da sie Abstürze verursachten, aber meine Ergebnisse waren ohne sie immer noch gut.
quelle
Die WEP-Schlüssel sind maskiert, sodass sie mit dem genannten Code nicht gelesen werden können
Gibt es eine Möglichkeit, dies auf die gleiche Weise wie die EAP-Lösung zu lösen? Mit Reflexion?
quelle