IP-адрес устройства, использующего телефон в качестве точки доступа

Может ли кто-нибудь объяснить или показать, как получить 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-адрес в этом фрагменте кода.

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

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

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

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