2012-03-05 15 views
16

Jak mówi tytuł ... Próbuję uzyskać adres IP urządzenia wifi, gdy jest skonfigurowany jako hotspot. Idealnie, chciałbym znaleźć coś, co działa na wszystkie telefony.Jak zdobyć adres IP hotspotu Wi-Fi w systemie Android?

Oczywiście WifiManager jest bezużyteczny, jeśli chodzi o uzyskanie informacji z AP.

Na szczęście udało mi się uzyskać adresy IP wszystkich interfejsów w ten sposób:

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; 
} 

Ten kawałek kodu wypisze wszystkie IP wszystkich interfejsów (Wi-Fi hotspot w zestawie). Głównym problemem jest to, że nie znajduję sposobu na identyfikację interfejsu Wi-Fi. Jest to problem, ponieważ niektóre telefony mają wiele interfejsów (WiMax itp.). To, co starałem dotąd:

  • Filtering przez wifi nazwy wyświetlanej iface: nie jest to dobre podejście, ponieważ zmienia się nazwa wyświetlana z jednego urządzenia do drugiego (wlan0, eth0 wl0.1, etc) .
  • Filtrowanie według adresu mac: prawie działa, ale na niektórych urządzeniach hotspot nie ma adresu MAC (iface.getHardwareAddress() zwraca null) ... więc nie jest to poprawne rozwiązanie.

Wszelkie sugestie?

Odpowiedz

0

Oto możliwe solution, który wykorzystuje WiFiManagerConnectionInfo, aby znaleźć odpowiadające NetworkInterface.

Jeśli wystarczy IP można użyć:

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

Przykro mi, ale to nie jest rozwiązanie. Jak już wspomniałem, WifiManager jest bezużyteczny, gdy iface jest w trybie AP. Android "myśli", że Wifi jest wyłączone. Z drugiej strony próbowałem czegoś podobnego do rozwiązania, które oferujesz, ale używając adresu MAC zamiast adresu IP. Ale jak już wskazałem, to nie działa. Z jakiegoś powodu adres mac z iface wifi ma wartość null (w niektórych urządzeniach). – sirlion

+0

@ sirlion, czy ACCESS_WIFI_STATE w Twoim manifeście? – tenorsax

+2

Tak, jest. Zaufaj mi, to podejście nie działa. Możesz go wypróbować, jeśli chcesz ..:/ – sirlion

0

Gdy Wifi nie jest ustawiony jako hotspot, ma nazwę android-xx7632x324x32423 domu gdy hotspot jest włączona, nazwa ta nie ma. Zmienia się także adres IP.

Więc jeśli jesteś w stanie uzyskać konfigurację Wifi przed włączeniem hotspotu, przede wszystkim możesz użyć intf.getName(), aby uzyskać odniesienie do niego.

Po drugie, adres IP został zmieniony, więc jeśli wiesz, który interfejs to wifi w trybie CONNECTED, możesz użyć tych informacji do późniejszego zidentyfikowania po włączeniu hotspotu.

Poniżej znajduje się kod używany do debugowania. Wyplułem wszystko, co mogłem znaleźć, zrobić wielki bałagan, a potem posprzątać, gdy wymyśliłem swój problem. 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

Oto co zrobiłem, aby uzyskać 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; 
} 

to daje adres IP dowolnego urządzenia WiFi, co oznacza, że ​​nie tylko dla hotspot. Jeśli masz połączenie z inną siecią Wi-Fi (co oznacza, że ​​nie jesteś w trybie hotspot), zwróci ona adres IP.

Powinieneś najpierw sprawdzić, czy jesteś w trybie AP, czy nie. Możesz użyć tej klasy do tego: http://www.whitebyte.info/android/android-wifi-hotspot-manager-class

+0

Hi @ajma, Dzięki za udostępnienie tego cennego kodu, to jest działa i daje mi adres IP zarówno dla "WiFi simple router network" i "WiFi Tethering lub hotspot". –

+2

To nie jest w 100% poprawne. Dowiedziałem się, że nazwa interfejsu sieciowego jest bardzo różna. HTC Desire Z: wl0.1; Prestigio 3540: ap0; Nexus 5/Samsung DUOS: wlan0. Z drugiej strony we wszystkich przypadkach wymieniono tylko jedno urządzenie (brak sprzężenia zwrotnego itp.). –

+0

ten kod nie działa na niektórych urządzeniach, których interfejs nazywa się ap0. Proponuję następującą korektę: if ((intf.getName(). zawiera ("wlan")) || (intf.getName(). zawiera ("ap"))) {na moim telefonie jest interfejs wlan0, ale to nie ma adresu inet, ponieważ adres ip znajduje się w ap0. W moim przypadku mam także interfejs pętli zwrotnej. kiedy jest podłączony do routera wifi, używa wlan0. – Gaucho

2

Możesz tego użyć. To nie jest testowane, ale powinno działać.

((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

byłoby wspaniale, aby dodać objaśnienie kodu – Yurets

0

używam rozwiązanie ajma, zmieniając intf.getName().contains("wlan") do intf.getName().contains("wl") || intf.getName().contains("ap"). I działa na wielu telefonach komórkowych.

Ale zwraca zero, gdy po prostu podłączony do WiFi.