Android Найти ip-адрес устройства, когда он принимает хот-спот

Мне нужно найти ip-адрес устройства, когда он принимает хот-спот. Я использовал этот код до сих пор:

//if is using Hotspot
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)) {
                return inetAddress.getHostAddress();
            }
        }
    }
}

Это работает отлично, но имя wifi NetworkInterface отличается на некоторых устройствах. Поэтому сначала нужно найти имя устройства wifi NetworkInterface (для его точки доступа). Как я могу найти это имя? Или есть лучший подход для поиска IP-адреса устройства?

///Поиск правильного IP-адреса с помощью MAC также не работает

Ответ 1

Недавно я выяснил, что IP-адрес WifiAP жестко запрограммирован в Android. Если пользователь не изменил это значение вручную (я думаю, что это очень редко), использование жестко заданного значения является абсолютно достаточным. Я думаю, что это лучший способ пойти. IP-адрес: "192.168.43.1": https://github.com/CyanogenMod/android_frameworks_base/blob/cm-10.1/wifi/java/android/net/wifi/WifiStateMachine.java?source=c#L1299

Ответ 2

Сначала я попытался получить MAC-адрес интерфейса WiFi, чтобы сравнить его с MAC-адресом каждого интерфейса. Но оказывается, что по крайней мере на моем N4 запуске CM MAC-адрес интерфейса WiFi изменяется при включении Точки доступа.

Итак, я написал некоторый код, чтобы ходить по списку устройств, чтобы найти что-то, чтобы идентифицировать интерфейс wifi. Этот код отлично работает на моем N4:

private String getWifiIp() throws SocketException {
    for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces();
            en.hasMoreElements(); ) {
        NetworkInterface intf = en.nextElement();
        if (intf.isLoopback()) {
            continue;
        }
        if (intf.isVirtual()) {
            continue;
        }
        if (!intf.isUp()) {
            continue;
        }
        if (intf.isPointToPoint()) {
            continue;
        }
        if (intf.getHardwareAddress() == null) {
            continue;
        }
        for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses();
                enumIpAddr.hasMoreElements(); ) {
            InetAddress inetAddress = enumIpAddr.nextElement();
            if (inetAddress.getAddress().length == 4) {
                return inetAddress.getHostAddress();
            }
        }
    }
    return null;
}

Только один интерфейс соответствует всем условиям: wlan0.

Возможное другое решение:

Пройдите по наиболее распространенным именам интерфейсов и попробуйте найти их в списке: new String[] { "wlan0", "eth0", ...];

Ответ 3

Это может помочь вам.

Выполняя вызов оболочки, чтобы спросить сетевые адаптеры и проверить те, которые вам нужны, в этом случае это wlan, поэтому следуйте этому коду

Process p=Runtime.getRuntime().exec("ip link show | grep -o \": wlan[0-9]:\" ");

BufferedReader readCommandOutput = 
    new BufferedReader(new InputStreamReader(p.getInputStream()));

String line=null;
while((line=readCommandOutput.readLine())!=null){
    // Lines containing wlan will be returned
    // parse to get the name of that interface.
    String interface=line.split(":")[1];
    //this is the interface you need.
}

if (line==null){
    //nothing was found.
}

readCommandOutput.close();

Прилагаемые примечания

This image is the output of the command on the shell. Или вы можете использовать эмулятор терминала Android из магазина воспроизведения, чтобы запустить эту команду в оболочке Android.

Для получения IP-адреса

WifiManager wifi=(WifiManager)getSystemService(WIFI_SERVICE);
int address=wifi.getDhcpInfo().ipAddress;
Toast.makeText(this,intToIP(address),1).show();         


public String intToIP(int i) {
    return ((i & 0xFF) 
            + "." + ((i >> 8) & 0xFF)
            + "." + ((i >> 16) & 0xFF)
            + "." + ((i >> 24) & 0xFF));
 }

Ответ 4

это решение работает, когда вы хотите получить ip-адрес устройства hotspot на том же устройстве, но не знаете, как его получить на подключенном устройстве (в основном IP-сервер - 192.168.43.1, вы можете выполнить работу с помощью жесткого кодирования)

 public void serverip()

    {
     DhcpInfo dhcpInfo = wifiManager.getDhcpInfo();
            if (dhcpInfo==null){
                Toast.makeText(MainActivity.this, "No ip for server", Toast.LENGTH_SHORT).show();
            }else{

                Toast.makeText(MainActivity.this, "ip of server "+android.text.format.Formatter.formatIpAddress(dhcpInfo.gateway), Toast.LENGTH_SHORT).show();
    }


            }

Ответ 5

Пожалуйста, замените intf.getName() на intf.getDisplayName(), а затем попробуйте.

Ответ 6

Попробуйте этот код:

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()) {

                        String ip = Formatter.formatIpAddress(inetAddress.hashCode());
                        Toast.makeText(getApplicationContext(), "***** IP="+ ip, 1).show();

                        return ip;
                    }
                }
            }
        } catch (SocketException ex) {
            Toast.makeText(getApplicationContext(), "***** IP="+ex.toString(), 1).show();

        }
        return null;
    }

Введите код в oncreat для проверки, hotspot is Enable не.....

WifiManager wifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE); 
        wifiManager.setWifiEnabled(true);
        wifiManager.setWifiEnabled(false);
        boolean wifiEnabled = wifiManager.isWifiEnabled();
        if (wifiEnabled) {
            Toast.makeText(getApplicationContext(),"on",Toast.LENGTH_SHORT).show();
            getLocalIpAddress();
        }else {
                Toast.makeText(getApplicationContext(),"off",Toast.LENGTH_SHORT).show();
        }

Ответ 7

user2224350 сказал: "Недавно я выяснил, что IP-адрес WifiAP жестко закодирован на Android".

Если пользователь не изменил это значение вручную (я думаю, что это очень редко), использование жестко заданного значения является абсолютно достаточным. Я думаю, что это лучший способ пойти. IP-адрес "192.168.43.1", как показано здесь.

Это работает на моем Samsung A3 и Huawei PRA-LX1, но HTC Desires 530 также возвращает 192.168.1.1.