如何在Android中获取wifi热点的IP?

时间:2012-03-05 20:06:01

标签: java android wifi android-wifi

正如标题所说......当我将它配置为热点时,我正试图获得wifi的IP。理想情况下,我想找到适用于所有手机的东西。

当然,在从AP获取信息时,WifiManager是无用的。

幸运的是,通过这样做,我已经能够获得所有接口的IP:

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

这段代码将打印所有接口的所有IP(包括Wifi热点)。主要问题是我找不到识别WiFi接口的方法。这是一个问题,因为有些手机有多个接口(WiMax等)。这是我到目前为止所尝试的:

  • 通过wifi iface显示名称进行过滤:这不是一个好方法,因为显示名称从一个设备更改为另一个设备(wlan0,eth0,wl0.1等)。
  • 按其mac地址过滤:几乎可以正常工作,但在某些设备上,热点iface没有MAC地址(iface.getHardwareAddress()返回null)...所以不是有效的解决方案。

有什么建议吗?

7 个答案:

答案 0 :(得分:8)

以下是我为获取wifi热点ip所做的工作:

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

这将为您提供任何 wifi设备的IP地址,这意味着它不仅仅适用于热点。如果你连接到另一个wifi网络(意味着你不在热点模式),它将返回一个IP。

您应首先检查您是否处于AP模式。您可以使用此类:http://www.whitebyte.info/android/android-wifi-hotspot-manager-class

答案 1 :(得分:2)

你可以使用它。它没有经过测试,但应该可以使用。

((WifiManager) mContext.getSystemService(Context.WIFI_SERVICE)).getDhcpInfo().serverAddress

答案 2 :(得分:0)

以下是可能solution利用WiFiManager ConnectionInfo查找相应的NetworkInterface

如果您只需要IP,那么您可以使用:

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

答案 3 :(得分:0)

当Wifi未设置为热点时,它的名称为android-xx7632x324x32423 当热点打开时,该名称消失了。 ip地址也会改变。

因此,如果您在启用热点之前能够获得Wifi配置,首先您可以使用intf.getName()来获取它的引用。

其次,ip已更改,因此如果您知道wifi处于CONNECTED模式的接口,则可以在启用热点后使用该信息进行识别。

下面是我用于调试的一些代码。我只是吐出我能找到的所有东西,弄得一团糟,然后在我解决问题时将其清理干净。 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());

答案 4 :(得分: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;
}

答案 5 :(得分:0)

我使用ajma的解决方案,将intf.getName().contains("wlan")更改为intf.getName().contains("wl") || intf.getName().contains("ap")。它适用于许多手机。

但当 连接到WiFi时,它会返回null。

答案 6 :(得分:0)

随着每年新制造商生产的新电话数量不断增加,仅仅确定无线接口的名称注定在不久的将来会失败。以下方法可以从getDhcpInfo()。serverAddress返回的整数ip获取远程服务器ip。

public String getIPv4Address(int ipAddress) {
    // convert integer ip to a byte array
    byte[] tempAddress = BigInteger.valueOf(ipAddress).toByteArray();
    int size = tempAddress.length;
    // reverse the content of the byte array
    for(int i = 0; i < size/2; i++) {
        byte temp = tempAddress[size-1-i];
        tempAddress[size-1-i] = tempAddress[i];
        tempAddress[i] = temp;
    }
    try {
        // get the IPv4 formatted ip from the reversed byte array
        InetAddress inetIP = InetAddress.getByAddress(tempAddress);
        return inetIP.getHostAddress();
    } catch (UnknownHostException e) {
        e.printStackTrace();
    }
    return "";
}

然后,您可以在使用WiFi服务的活动中像这样使用它

WifiManager wifi = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
String serverIp = getIPv4Address(wifi.getDhcpInfo().serverAddress);
Log.v("Server Ip", serverIp);

这应该向您显示所连接服务器的IP。

注意:在查询服务器IP之前,请确保您已经通过WiFi与访问点(例如,热点)建立了成功的连接。您仅需要SSID和preSharedkey(如果安全)即可创建成功的连接,而无需服务器ip。