使用手机作为接入点的设备的IP地址

时间:2011-11-30 10:10:05

标签: android networking ip wifi

任何人都可以解释或说明如何获取通过手机的便携式WI-FI热点连接的计算机(或其他设备)的IP地址吗?

我尝试了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;
}

但是只返回默认网关。

我在SO上也发现了another example,它可能只是解决方案,但我不知道如何将它应用到我的情况中。具体来说,我看不到那段代码中IP地址的位置。

2 个答案:

答案 0 :(得分:3)

检查你的arp表是否有wlan接口。 cat /proc/net/arp在命令行。

答案 1 :(得分:0)

虽然给出了答案,但如果有人对直接答案感兴趣:

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