2012-03-05 11 views
16

Como dice el título ... Estoy tratando de obtener la IP del wifi iface cuando está configurado como punto de acceso. Idealmente, me gustaría encontrar algo que funcione para todos los teléfonos.cómo obtener la IP del punto de acceso wifi en Android?

Por supuesto, WifiManager es inútil a la hora de obtener información del AP.

Por suerte, he sido capaz de obtener las direcciones IP de todas las interfaces al hacer esto:

public String getLocalIpAddress() { 
    try { 
     for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { 
      NetworkInterface intf = en.nextElement(); 
      for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) { 
       InetAddress inetAddress = enumIpAddr.nextElement(); 
       if (!inetAddress.isLoopbackAddress()) { 
        Log.d("IPs", inetAddress.getHostAddress()); 
       } 
      } 
     } 
    } catch (SocketException ex) { 
     Log.e(LOG_TAG, ex.toString()); 
    } 
    return null; 
} 

Este trozo de código imprimirá toda la IP de todas las interfaces (punto de acceso WiFi incluido). El principal problema es que no encuentro una forma de identificar la interfaz WiFi. Este es un problema ya que algunos teléfonos tienen múltiples interfaces (WiMax, etc.). Esto es lo que he probado hasta ahora:

  • Filtrado por el nombre de visualización del iface wifi: no es un buen enfoque porque el nombre de visualización cambia de un dispositivo a otro (wlan0, eth0, wl0.1, etc) .
  • Filtrado por su dirección MAC: casi funciona, pero en algunos dispositivos el punto de acceso iface no tiene una dirección MAC (iface.getHardwareAddress() devuelve nulo) ... por lo que no es una solución válida.

¿Alguna sugerencia?

Respuesta

0

Aquí hay una posible solution que utiliza WiFiManagerConnectionInfo para encontrar la correspondiente NetworkInterface.

Si sólo necesita la dirección IP, puede utilizar:

WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE); 
WifiInfo wifiInfo = wifiManager.getConnectionInfo(); 
int ipAddress = wifiInfo.getIpAddress(); 
+3

Lo siento, pero esa no es la solución. Como dije antes, WifiManager es inútil cuando el iface está en modo AP. Android "piensa" que Wifi está deshabilitado. Por otro lado, probé algo similar a la solución que proporciona, pero usando la dirección MAC en lugar de la dirección IP. Pero como ya señalé, no funciona. Por algún motivo, la dirección MAC del wifi iface es nula (en algunos dispositivos). – sirlion

+0

@sirlion, ¿está ACCESS_WIFI_STATE en su manifiesto? – tenorsax

+2

Sí, lo es. Confía en mí, ese enfoque no funciona. Puedes intentarlo si quieres ..:/ – sirlion

0

Cuando el Wi-Fi no se configura como un punto de acceso, que tiene un nombre android-xx7632x324x32423 casa al punto de acceso está encendido, ese nombre se ha ido. También la dirección IP cambia.

Así que si puede obtener la configuración de WiFi antes de habilitar el punto de acceso, antes que nada puede usar intf.getName() para obtener una referencia.

En segundo lugar, el ip cambió, así que si sabes qué interfaz el wifi está en el modo CONNECTED, puedes usar esa información para identificarlo más adelante después de habilitar el punto de acceso.

A continuación se muestra un código que utilicé para la depuración. Escupí todo lo que pude encontrar, hice un gran desastre y luego lo limpié cuando calculé mi problema. GL

import java.net.InetAddress; 
import java.net.NetworkInterface; 
import java.util.Collections; 
import android.net.ConnectivityManager; 

textStatus = (TextView) findViewById(R.id.textStatus); 

try { 
    for (NetworkInterface intf : Collections.list(NetworkInterface.getNetworkInterfaces())) { 
    for (InetAddress addr : Collections.list(intf.getInetAddresses())) { 
     if (!addr.isLoopbackAddress()){ 
     textStatus.append("\n\n IP Address: " + addr.getHostAddress()); 
     textStatus.append("\n" + addr.getHostName()); 
     textStatus.append("\n" + addr.getCanonicalHostName()); 
     textStatus.append("\n\n" + intf.toString()); 
     textStatus.append("\n\n" + intf.getName()); 
     textStatus.append("\n\n" + intf.isUp()); 
     } 
    } 
    } 
} catch (Exception ex) { 
    textStatus.append("\n\n Error getting IP address: " + ex.getLocalizedMessage()); 
} 


connectivity = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
allInfo = connectivity.getAllNetworkInfo(); 
mobileInfo = connectivity.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 

textStatus.append("\n\n TypeName: " + mobileInfo.getTypeName()); 
textStatus.append("\n State: " + mobileInfo.getState()); 
textStatus.append("\n Subtype: " + mobileInfo.getSubtype()); 
textStatus.append("\n SubtypeName: " + mobileInfo.getSubtypeName()); 
textStatus.append("\n Type: " + mobileInfo.getType()); 
textStatus.append("\n ConnectedOrConnecting: " + mobileInfo.isConnectedOrConnecting()); 
textStatus.append("\n DetailedState: " + mobileInfo.getDetailedState()); 
textStatus.append("\n ExtraInfo: " + mobileInfo.getExtraInfo()); 
textStatus.append("\n Reason: " + mobileInfo.getReason()); 
textStatus.append("\n Failover: " + mobileInfo.isFailover()); 
textStatus.append("\n Roaming: " + mobileInfo.isRoaming()); 

textStatus.append("\n\n 0: " + allInfo[0].toString()); 
textStatus.append("\n\n 1: " + allInfo[1].toString()); 
textStatus.append("\n\n 2: " + allInfo[2].toString()); 
9

Esto es lo que hice para conseguir el IP WiFi Hotspot:

public String getWifiApIpAddress() { 
    try { 
     for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en 
       .hasMoreElements();) { 
      NetworkInterface intf = en.nextElement(); 
      if (intf.getName().contains("wlan")) { 
       for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr 
         .hasMoreElements();) { 
        InetAddress inetAddress = enumIpAddr.nextElement(); 
        if (!inetAddress.isLoopbackAddress() 
          && (inetAddress.getAddress().length == 4)) { 
         Log.d(TAG, inetAddress.getHostAddress()); 
         return inetAddress.getHostAddress(); 
        } 
       } 
      } 
     } 
    } catch (SocketException ex) { 
     Log.e(TAG, ex.toString()); 
    } 
    return null; 
} 

esto le dará la dirección IP del cualquier dispositivo wifi, lo que significa que no es sólo para el punto de acceso. Si estás conectado a otra red wifi (lo que significa que no estás en el modo de punto de acceso), devolverá una IP.

Debería verificar si está en modo AP primero o no. Puede usar esta clase para eso: http://www.whitebyte.info/android/android-wifi-hotspot-manager-class

+0

Hola @ajma, gracias por compartir este valioso código, esto es trabajando y darme una dirección IP para "WiFi simple router network" y "WiFi Tethering or hotspot". –

+2

Esto no es 100% correcto. Descubrí que el nombre de la interfaz de red varía mucho. HTC Desire Z: wl0.1; Prestigio 3540: ap0; Nexus 5/Samsung DUOS: wlan0. Por otro lado, en todos los casos, solo se ha incluido un dispositivo (sin bucle invertido, etc.). –

+0

este código no funciona en algunos dispositivos donde la interfaz se llama ap0. Sugiero la siguiente corrección: if ((intf.getName(). contains ("wlan")) || (intf.getName(). contains ("ap"))) {en mi teléfono hay una interfaz wlan0 pero no tiene dirección de entrada porque la dirección de IP está en ap0. También tengo la interfaz de bucle invertido en mi caso. cuando está conectado a un enrutador wifi usa el wlan0. – Gaucho

2

Puede usar eso. No está probado, pero debería funcionar.

((WifiManager) mContext.getSystemService(Context.WIFI_SERVICE)).getDhcpInfo().serverAddress 
0
private static byte[] convert2Bytes(int hostAddress) { 
    byte[] addressBytes = { (byte)(0xff & hostAddress), 
      (byte)(0xff & (hostAddress >> 8)), 
      (byte)(0xff & (hostAddress >> 16)), 
      (byte)(0xff & (hostAddress >> 24)) }; 
    return addressBytes; 
} 

public static String getApIpAddr(Context context) { 
    WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 
    DhcpInfo dhcpInfo = wifiManager.getDhcpInfo(); 
    byte[] ipAddress = convert2Bytes(dhcpInfo.serverAddress); 
    try { 
     String apIpAddr = InetAddress.getByAddress(ipAddress).getHostAddress(); 
     return apIpAddr; 
    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 
+1

sería genial agregar alguna explicación para el código – Yurets

0

I utilizar la solución de ajma, cambiando intf.getName().contains("wlan") a intf.getName().contains("wl") || intf.getName().contains("ap"). Y funciona para muchos teléfonos móviles.

Pero devuelve nulo cuando acaba de conectado a un WiFi.

Cuestiones relacionadas