IP-адрес устройства, использующего телефон в качестве точки доступа - PullRequest
4 голосов
/ 30 ноября 2011

Может кто-нибудь объяснить или показать, как получить IP-адрес компьютера (или другого устройства), подключенного через мобильную точку доступа WI-FI телефона?

Я попробовал следующий код из здесь

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

Но это только возвращает шлюз по умолчанию.

Я также нашел другой пример здесь, на SO, и это может быть просто решением, но я не знаю, как применить его к моей ситуации.В частности, я не вижу, где находится IP-адрес в этом фрагменте кода.

Ответы [ 3 ]

5 голосов
/ 22 сентября 2012

Следующий код предоставит вам IP-адрес и другие детали устройств с поддержкой Wi-Fi, подключенных к устройству 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;
}
}
3 голосов
/ 31 января 2012

Проверьте вашу таблицу arp для интерфейса WLAN.cat /proc/net/arp в командной строке.

0 голосов
/ 18 апреля 2017

Хоть и ответ, если дан, но в случае, если кто-то заинтересован в прямом ответе:

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

Также, в соответствии с моим пониманием (не пробовал сам), если вы используете aysntask и вам нужноделать в рабочем потоке (не будет работать в основном потоке), этот процесс также можно использовать.Либо используйте метод для поиска hotspotinterface, либо напрямую используйте _hotspotInterface как "wlan0"

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

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

Чтобы найти точку доступа, я использовал этот метод (хотя и не очень хороший пример)

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();
                   }
                }
}
...