Как программно создавать и читать WEP/EAP WiFi configurations
в Android?
Я видел, как многие люди борются с этим вопросом на различных форумах и по всему сообществу. Я знаю, что это не так просто (особенно EAP), чтобы понять, потому что, когда я хотел добиться того же, я тоже много боролся. Что ж, вся тяжелая работа по анализу кода и поиску различных реализаций в Интернете, проделанная с мной, была наконец-то удалось достичь цели. Вся заслуга принадлежит ряду проектов с открытым исходным кодом и их разработчикам.
Я хотел бы поделиться этими знаниями со всеми, поскольку SO поощряет это: «Также совершенно нормально задать свой вопрос и ответить на него, если вы притворяетесь, что находитесь в режиме Jeopardy: сформулируйте его в форме вопроса».
Часть 1: Программное создание конфигурации WEP WiFi.
Часть 2. Считайте конфигурацию WEP WiFi программно.
источник
Ответы:
Часть 1: Программное создание конфигурации WEP WiFi
Это довольно просто, WifiConfiguration предоставляет интерфейс для создания того же самого. Вот пример кода:
Следуя разрешениям, необходимым в AndroidManifest.xml
Часть 2: Прочитайте конфигурацию WEP WiFi программно
снова. Вот пример кода:
Часть 3: Считайте конфигурацию EAP WiFi программным
способом. Теперь это сложно. Вы можете найти код, который сохраняет конфигурацию EAP WiFi через стандартный интерфейс Android в WifiDialog.java . Что ж, достаточно просто Мы можем использовать тот же код в нашем приложении, ну НЕТ! Если вам случитсячтобы попробовать этовы получите ошибки говоряне может найти символы
eap
,phase
,client_cert
и так далее. Небольшое подробное исследование говорит нам, что EnterpriseFieldis private
внутриWiFiConfiguration
класса, и все символы, которые мы не можем найти, относятся к этому типуEnterpriseField
. Что ж, мы столкнулись с препятствием. Нам нужны эти поля для чтения / сохранения конфигурации EAP, но у нас нет программного доступа к ним!Java Reflection API
на помощь Ну, я не эксперт по Java, поэтому я не буду вдаваться в подробности Reflection API как такового, и вы можете найти в Google учебные пособия или получить дополнительную информацию здесь . Чтобы быть кратким и понятным, Reflection API позволяет вам проверять классы, интерфейсы, поля и методы во время выполнения, не зная имен классов, методов и т. Д. Во время компиляции. Также можно создавать экземпляры новых объектов, вызывать методы и получать / устанавливать значения полей с помощью отражения. И, что важно, отражение может помочь вам получить доступ к закрытым элементам данных внутри класса. Ну, это то, что нам нужно, не так ли? :)Давайте теперь проверим пример кода, который показывает, как читать конфигурацию EAP WiFi с помощью Reflection Api. В качестве бонуса сниппет запишет конфигурацию в файл и сохранит ее на SD-карте .... довольно гладко .. эх;) Небольшой обзор Reflection Api, и я уверен, что разобраться в приведенном ниже коде легко.
Это код для создания файла журнала на SD-карте перед вызовом
readEapConfig()
функции.Теперь сама
readEapConfig()
функция:источник
Ах, у меня закончилось место для редактирования, добавляю оставшуюся часть здесь.
Часть 4. Программное сохранение конфигурации EAP WiFi.
Если вы уже читали часть 3, вы уже понимаете магию отражения, которая работает здесь. Если вы сразу переходите к этому разделу, пожалуйста, прочтите введение перед фрагментом кода в части 3, и вы сможете быстро пройти через код здесь !
Ну вот и все! И я надеюсь, что это поможет какому-то заблудшему разработчику, где-нибудь, когда-нибудь :)
источник
Field wcAdhoc = WifiConfiguration.class.getField("adhocSSID"); Field wcAdhocFreq = WifiConfiguration.class.getField("frequency");
. Этих участников нет в WifiConfiguration.java. Код дает мне исключениеjava.lang.NoSuchFieldException: adhocSSID
. Пожалуйста помоги.wcefPrivateKey.get(selectedConfig)
бросаетNullPointerException
. Удачи от кого-нибудь еще?Android добавил API в JellyBean 4.3. Вы должны использовать эту опцию, если хотите настроить WIFI на API 18:
http://developer.android.com/reference/android/net/wifi/WifiEnterpriseConfig.html
источник
Часть 4 подтолкнула меня к правильному пути! Однако я хотел создать конфигурацию TTLS, а не TLS, вот как я это сделал!
Надеюсь, это кому-то поможет. @Android Learner Я удалил бит о adHocFrequency и SSID, поскольку они вызывали сбои, но мои результаты все равно были хорошими без них.
источник
Ключи WEP замаскированы, поэтому их невозможно прочитать с помощью указанного кода.
Есть ли способ решить эту проблему так же, как решение EAP? С отражением?
источник