Jak programowo tworzyć i czytać WEP/EAP WiFi configurations
w systemie Android?
Widziałem wiele osób zmagających się z tym pytaniem na różnych forach i w całej społeczności. Wiem, że nie jest to takie proste (zwłaszcza EAP), aby się zorientować, ponieważ kiedy chciałem osiągnąć to samo, też miałem sporo problemów. Cóż, cała ciężka praca analizy kodu i wyszukiwania różnych implementacji w internecie wreszcie w stanie osiągnąć cel. Wszystko to zasługa wielu projektów open source i ich twórców.
Chciałbym podzielić się tą wiedzą ze wszystkimi, ponieważ SO zachęca do tego: „Dobrze jest też zadawać własne pytanie i odpowiadać na nie, o ile udajesz, że jesteś na Jeopardy: sformułuj je w formie pytania”.
Część 1: Programowe tworzenie konfiguracji WEP WiFi.
Część 2: Odczytaj programowo konfigurację WEP WiFi.
źródło
Odpowiedzi:
Część 1: Programowe tworzenie konfiguracji WEP WiFi
Jest to dość proste, WifiConfiguration ujawnia interfejs, aby stworzyć to samo. Oto przykładowy kod:
Zgodnie z uprawnieniami wymaganymi w AndroidManifest.xml
Część 2:
Ponownie przeczytaj programowo konfigurację WEP WiFi Straighforward. Oto przykładowy kod:
Część 3: Odczytaj programowo konfigurację EAP WiFi
Teraz jest to trudne. Kod, który zapisuje konfigurację EAP WiFi, można znaleźć za pośrednictwem podstawowego interfejsu użytkownika systemu Android w WifiDialog.java . Dość łatwo Możemy użyć tego samego kodu w naszej aplikacji, no cóż, NIE! Jeśli zdarzy się, spróbuj to dostaniesz błędy mówiąc nie można znaleźć symbole
eap
,phase
,client_cert
i tak dalej. Trochę szczegółowych badań mówi nam, że EnterpriseField jestis private
wewnątrzWiFiConfiguration
klasy i że wszystkie symbole, których nie możemy znaleźć, są tego typuEnterpriseField
. Cóż, natrafiliśmy na przeszkodę. Potrzebujemy tych pól do odczytu / zapisania konfiguracji EAP, ale nie mamy do nich programistycznego dostępu!Java Reflection API
na ratunek Cóż, nie jestem ekspertem od Javy, więc nie będę zagłębiać się w szczegóły dotyczące Reflection API jako takiego. Możesz znaleźć w Google samouczki lub uzyskać więcej informacji tutaj . Aby było krótkie i przyjemne, interfejs API Reflection pozwala na inspekcję klas, interfejsów, pól i metod w czasie wykonywania, bez znajomości nazw klas, metod itp. W czasie kompilacji. Możliwe jest również tworzenie instancji nowych obiektów, wywoływanie metod i pobieranie / ustawianie wartości pól za pomocą refleksji. Co ważniejsze, refleksja może pomóc w uzyskaniu dostępu do prywatnych elementów danych wewnątrz klasy. Cóż, tego potrzebujemy, prawda? :)Sprawdźmy teraz przykładowy kod, który pokazuje, jak odczytać konfigurację EAP WiFi za pomocą Reflection Api. Jako bonus, snippet zarejestruje konfigurację do pliku i zapisze go na karcie SD .... całkiem sprytnie .. eh;) Trochę przeglądu Reflection Api i jestem pewien, że zrozumienie poniższego kodu jest łatwe.
To jest kod do utworzenia pliku logowania na karcie SD przed wywołaniem
readEapConfig()
funkcji.Teraz
readEapConfig()
sama funkcja:źródło
Ahh Skończyło mi się miejsce na edycję, dodając pozostałą część tutaj.
Część 4: programowe zapisywanie konfiguracji EAP WiFi
Jeśli przeczytałeś już część 3, rozumiesz już magię Refleksji, która działa tutaj.Jeśli przechodzisz bezpośrednio do tej sekcji, przeczytaj wprowadzenie przed fragmentem kodu w części 3, a będziesz mógł szybko przejrzeć kod tutaj !
Cóż, to wszystko! I mam nadzieję, że to kiedyś pomoże zagubionemu programiście :)
źródło
Field wcAdhoc = WifiConfiguration.class.getField("adhocSSID"); Field wcAdhocFreq = WifiConfiguration.class.getField("frequency");
. Tych członków nie ma w WifiConfiguration.java. Kod daje mi wyjątekjava.lang.NoSuchFieldException: adhocSSID
. Proszę pomóż.wcefPrivateKey.get(selectedConfig)
rzucaNullPointerException
. Jakieś szczęście od kogoś innego?Android dodał API do JellyBean 4.3. Musisz użyć tej opcji, jeśli chcesz skonfigurować WIFI na API 18:
http://developer.android.com/reference/android/net/wifi/WifiEnterpriseConfig.html
źródło
Część 4 wprowadziła mnie na właściwą ścieżkę! Jednak chciałem utworzyć konfigurację TTLS zamiast TLS, oto jak to zrobiłem!
Mam nadzieję, że to komuś pomoże. @Android uczący się Usunąłem trochę o adHocFrequency i SSID, ponieważ powodowały awarie, ale moje wyniki były nadal dobre bez nich.
źródło
Klucze WEP są maskowane, więc nie ma możliwości ich odczytania za pomocą wspomnianego kodu
Czy istnieje sposób rozwiązania tego problemu w taki sam sposób, jak rozwiązanie EAP? Z refleksją?
źródło