¿Cómo crear y leer mediante programación WEP/EAP WiFi configurations
en Android?
He visto a varias personas luchar con esta misma cuestión en varios foros y en toda la comunidad. Sé que esto no es tan sencillo (especialmente EAP) de averiguarlo porque cuando quería lograr lo mismo, también luché bastante. Bueno, todo el arduo trabajo del análisis de código y la búsqueda de varias implementaciones en Internet hecho con fue finalmente capaz de lograr la meta. Todo el mérito es para varios proyectos de código abierto y sus desarrolladores.
Me gustaría compartir este conocimiento con todos, ya que SO fomenta esto: "También está perfectamente bien hacer y responder tu propia pregunta, siempre y cuando finjas que estás en Jeopardy: exprésala en forma de pregunta".
Parte 1: Creación de una configuración WEP WiFi mediante programación.
Parte 2: leer una configuración de WEP WiFi mediante programación.
Parte 3: leer una configuración WiFi EAP mediante programación.
Parte 4: guarde una configuración de WiFi EAP mediante programación.
fuente
Respuestas:
Parte 1: Crear una configuración WEP WiFi mediante programación
Esto es bastante sencillo, WifiConfiguration expone la interfaz para crear lo mismo. Aquí está el código de ejemplo:
Siguiendo los permisos necesarios en AndroidManifest.xml
Parte 2: leer una configuración de WEP WiFi mediante programación
directamente de nuevo. Aquí está el código de ejemplo:
Parte 3: Leer una configuración WiFi EAP mediante programación
Ahora esto es complicado. Puede encontrar el código que guarda una configuración de WiFi EAP a través de la interfaz de usuario de Android vainilla en WifiDialog.java . Bueno, es bastante fácil. Podemos usar el mismo código en nuestra Aplicación, ¡Bueno, NO! Si le sucede a probar este obtendrá errores diciendo que no puede encontrar los símbolos
eap
,phase
,client_cert
y así sucesivamente. Una pequeña investigación detallada nos dice EnterpriseFieldis private
dentro de laWiFiConfiguration
clase y todos los símbolos que no podemos encontrar son del tipoEnterpriseField
. Bueno, nos encontramos con un obstáculo. Necesitamos estos campos para leer / guardar una configuración de EAP, ¡pero no tenemos acceso programático a ellos!Java Reflection API
al rescate Bueno, no soy un experto en Java, así que no entraré en detalles de la API de Reflection como tal y puedes buscar tutoriales en Google u obtener más información aquí . Para mantenerlo corto y atractivo, Reflection API le permite inspeccionar clases, interfaces, campos y métodos en tiempo de ejecución, sin conocer los nombres de las clases, métodos, etc. en tiempo de compilación. También es posible crear instancias de nuevos objetos, invocar métodos y obtener / establecer valores de campo usando la reflexión. Y, lo que es más importante, la reflexión puede ayudarlo a acceder a los miembros de datos privados dentro de una clase. Bueno, esto es lo que necesitamos, ¿no? :)Veamos ahora el ejemplo de código que muestra cómo leer una configuración WiFi EAP usando Reflection Api. Como beneficio adicional, el fragmento registrará la configuración en un archivo y la guardará en la tarjeta SD .... bastante hábil ... eh;) Un poco de descripción general de Reflection Api y estoy seguro de que comprender el código a continuación es fácil.
Este es el código para crear un archivo de registro en la tarjeta SD antes de llamar a la
readEapConfig()
función.Ahora la
readEapConfig()
función en sí:fuente
Ahh me quedé sin espacio de edición, agregando la parte restante aquí.
Parte 4: guardar una configuración de WiFi EAP mediante programación
Si ya leyó la parte 3, ya comprende la magia de Reflexión que funciona aquí. Si va directamente a esta sección, lea la introducción antes del fragmento de código en la parte 3 y estará al día para leer el código aquí. !
¡Bueno, eso es todo! Y espero que esto ayude a algún desarrollador perdido, en algún lugar, en algún momento :)
fuente
Field wcAdhoc = WifiConfiguration.class.getField("adhocSSID"); Field wcAdhocFreq = WifiConfiguration.class.getField("frequency");
. Estos miembros no están en WifiConfiguration.java. El código me está dando una excepciónjava.lang.NoSuchFieldException: adhocSSID
. Por favor ayuda.wcefPrivateKey.get(selectedConfig)
arroja unNullPointerException
. ¿Alguna suerte de alguien más?Android ha agregado una API a JellyBean 4.3. Debe utilizar esta opción si desea configurar WIFI en API 18:
http://developer.android.com/reference/android/net/wifi/WifiEnterpriseConfig.html
fuente
¡La parte 4 me inició en el camino correcto! Sin embargo, quería crear una configuración TTLS en lugar de TLS, ¡así es como lo hice!
Espero que esto ayude a alguien. @Android Learner Eliminé la parte sobre adHocFrequency y SSID ya que estaban causando fallas, pero mis resultados seguían siendo buenos sin ellos.
fuente
Las claves WEP están enmascaradas, por lo que no es posible leerlas con el código mencionado
¿Hay alguna forma de resolver esto de la misma manera que la solución EAP? ¿Con reflexión?
fuente