2011-11-30 1 views
3

Est-ce que quelqu'un peut expliquer ou montrer comment obtenir l'adresse IP d'un ordinateur (ou d'un autre périphérique) connecté via le point d'accès WI-FI portable du téléphone?Adresse IP du périphérique utilisant le téléphone comme point d'accès

J'ai essayé le code suivant de here

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()) { 
        return inetAddress.getHostAddress().toString(); 
       } 
      } 
     } 
    } catch (SocketException ex) { 
     Log.e(LOG_TAG, ex.toString()); 
    } 
    return null; 
} 

Mais cela ne retourne la passerelle par défaut.

J'ai également trouvé another example ici sur SO, et il pourrait juste être la solution, mais je ne sais pas comment l'appliquer à ma situation. Plus précisément, je ne peux pas voir où se trouve l'adresse IP dans ce code.

+0

Est-ce que ce travail dans ce cas? http://stackoverflow.com/questions/1069103/how-to-get-my-own-ip-address-in-c –

+0

Non, je devrais peut-être clarifier. Depuis mon application Android, je souhaite détecter l'adresse IP d'un périphérique connecté à Internet via le point d'accès WI-FI portable du téléphone. Votre exemple montre comment trouver l'adresse IP à partir d'un programme sur l'appareil connecté lui-même – Marmoy

Répondre

3

Vérifiez votre table arp pour l'interface wlan. cat /proc/net/arp sur la ligne de commande.

+0

Thats un hack intelligent – Ronnie

5

Le code suivant vous donnera l'ip adrress & autres détails des dispositifs wifi activé connectés au dispositif hotspot Android

Main.java

import java.util.ArrayList; 
import android.app.Activity; 
import android.os.Bundle; 
import android.widget.TextView; 
import com.whitebyte.hotspotclients.R; 
import com.whitebyte.wifihotspotutils.ClientScanResult; 
import com.whitebyte.wifihotspotutils.WifiApManager; 

public class Main extends Activity { 
     TextView textView1; 
     WifiApManager wifiApManager; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    textView1 = (TextView) findViewById(R.id.textView1); 
    wifiApManager = new WifiApManager(this); 

    scan(); 
} 

private void scan() { 
    ArrayList<ClientScanResult> clients = wifiApManager.getClientList(false); 

    textView1.append("Clients: \n"); 
    for (ClientScanResult clientScanResult : clients) { 
     textView1.append("####################\n"); 
     textView1.append("IpAddr: " + clientScanResult.getIpAddr() + "\n"); 
     textView1.append("Device: " + clientScanResult.getDevice() + "\n"); 
     textView1.append("HWAddr: " + clientScanResult.getHWAddr() + "\n"); 
     textView1.append("isReachable: " + clientScanResult.isReachable() + "\n"); 
    } 
} 

ClientScanResult.java

public class ClientScanResult { 

private String IpAddr; 

private String HWAddr; 

private String Device; 

private boolean isReachable; 

public ClientScanResult(String ipAddr, String hWAddr, String device, boolean isReachable) { 
    super(); 
    IpAddr = ipAddr; 
    HWAddr = hWAddr; 
    Device = device; 
    this.setReachable(isReachable); 
} 

public String getIpAddr() { 
    return IpAddr; 
} 

public void setIpAddr(String ipAddr) { 
    IpAddr = ipAddr; 
} 

public String getHWAddr() { 
    return HWAddr; 
} 

public void setHWAddr(String hWAddr) { 
    HWAddr = hWAddr; 
} 

public String getDevice() { 
    return Device; 
} 

public void setDevice(String device) { 
    Device = device; 
} 

public void setReachable(boolean isReachable) { 
    this.isReachable = isReachable; 
} 

public boolean isReachable() { 
    return isReachable; 
} 

}

WIFI_AP_STATE.java

 public enum WIFI_AP_STATE 
    { 
     WIFI_AP_STATE_DISABLING, WIFI_AP_STATE_DISABLED, WIFI_AP_STATE_ENABLING, WIFI_AP_STATE_ENABLED, WIFI_AP_STATE_FAILED 
    } 

WifiApManager.java

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 
import java.lang.reflect.Method; 
import java.net.InetAddress; 
import java.util.ArrayList; 
import android.content.Context; 
import android.net.wifi.WifiConfiguration; 
import android.net.wifi.WifiManager; 
import android.util.Log; 

public class WifiApManager { 
private final WifiManager mWifiManager; 

public WifiApManager(Context context) { 
    mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 
} 



/** 
* Gets a list of the clients connected to the Hotspot, reachable timeout is 300 
* @param onlyReachables {@code false} if the list should contain unreachable (probably disconnected) clients, {@code true} otherwise 
* @return ArrayList of {@link ClientScanResult} 
*/ 
public ArrayList<ClientScanResult> getClientList(boolean onlyReachables) { 
    return getClientList(onlyReachables, 300); 
} 

/** 
* Gets a list of the clients connected to the Hotspot 
* @param onlyReachables {@code false} if the list should contain unreachable (probably disconnected) clients, {@code true} otherwise 
* @param reachableTimeout Reachable Timout in miliseconds 
* @return ArrayList of {@link ClientScanResult} 
*/ 
public ArrayList<ClientScanResult> getClientList(boolean onlyReachables, int reachableTimeout) { 
    BufferedReader br = null; 
    ArrayList<ClientScanResult> result = null; 

    try { 
     result = new ArrayList<ClientScanResult>(); 
     br = new BufferedReader(new FileReader("/proc/net/arp")); 
     String line; 
     while ((line = br.readLine()) != null) { 
      String[] splitted = line.split(" +"); 

      if ((splitted != null) && (splitted.length >= 4)) { 
       // Basic sanity check 
       String mac = splitted[3]; 

       if (mac.matches("..:..:..:..:..:..")) { 
        boolean isReachable = InetAddress.getByName(splitted[0]).isReachable(reachableTimeout); 

        if (!onlyReachables || isReachable) { 
         result.add(new ClientScanResult(splitted[0], splitted[3], splitted[5], isReachable)); 
        } 
       } 
      } 
     } 
    } catch (Exception e) { 
     Log.e(this.getClass().toString(), e.getMessage()); 
    } finally { 
     try { 
      br.close(); 
     } catch (IOException e) { 
      Log.e(this.getClass().toString(), e.getMessage()); 
     } 
    } 

    return result; 
} 
} 
+0

rien n'est affiché, sauf 'clients'. – Kaushal28

0

Bien que la réponse si on leur donne, mais au cas où quelqu'un est intéressé par la réponse directe:

private static ArrayList<String> readArpCache() 
    { 
     ArrayList<String> ipList = new ArrayList<String>(); 
     BufferedReader br = null; 
     try { 
     br = new BufferedReader(new FileReader("/proc/net/arp"), 1024); 
     String line; 
     while ((line = br.readLine()) != null) { 
      Log.d(TAG ,line); 

      String[] tokens = line.split(" +"); 
      if (tokens != null && tokens.length >= 4) { 
       // verify format of MAC address 
       String macAddress = tokens[3]; 
       if (macAddress.matches("..:..:..:..:..:..")) { 
        //Log.i(TAG, "MAC=" + macAddress + " IP=" + tokens[0] + " HW=" + tokens[1]); 

        // Ignore the entries with MAC-address "00:00:00:00:00:00" 
        if (!macAddress.equals("00:00:00:00:00:00")) { 

        String ipAddress = tokens[0]; 
        ipList.add(ipAddress); 

        Log.i(TAG, macAddress + "; " + ipAddress); 
        } 
       } 
      } 
     } 
     } catch (Exception e) { 
     e.printStackTrace(); 
     } finally { 
     try { 
      br.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     } 

     return ipList; 
    } 

Aussi selon ma compréhension (n'a pas essayé par moi-même), si vous utilisez aysntask et devez faire sur le thread de travail (ne fonctionnera pas sur le thread principal), ce processus peut également être utilisé. Les deux méthodes utilisent pour trouver hotspotinterface ou utiliser directement _hotspotInterface comme « wlan0 »

try { 
     InetAddress[] arr = InetAddress.getAllByName(_hotspotInterface); 

     } catch (UnknownHostException e) { 
     e.printStackTrace(); 
     } catch (Exception e) { 
     e.printStackTrace(); 
     } 

Pour hotspot j'utilisé cette méthode (mais pas très bon exemple)

String _hotspotInterface = ""; 
    for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) 
      { 
       NetworkInterface anInterface = en.nextElement(); 

       //look for 192.168.xx.xx first 
       for (Enumeration<InetAddress> enumIpAddr = anInterface.getInetAddresses(); enumIpAddr.hasMoreElements();) 
       { 
        InetAddress inetAddress = enumIpAddr.nextElement(); 
        String  hostAddress = inetAddress.getHostAddress(); 

        if (hostAddress.startsWith("192.168.")) 
        { 
         _hotspotInterface = anInterface.getName(); 
        } 
       } 
}