как получить IP-адрес точки доступа Wi-Fi в Android? - PullRequest
15 голосов
/ 06 марта 2012

Как видно из названия ... Я пытаюсь получить IP-адрес wifi iface, когда он настроен как точка доступа. В идеале я хотел бы найти что-то, что работает для всех телефонов.

Конечно, 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 и т. Д.). Это то, что я пробовал до сих пор:

  • Фильтрация по отображаемому имени Wi-Fi iface: это не очень хороший подход, поскольку отображаемое имя меняется с одного устройства на другое (wlan0, eth0, wl0.1 и т. Д.).
  • Фильтрация по его mac-адресу: почти работает, но на некоторых устройствах точка доступа iface не имеет MAC-адреса (iface.getHardwareAddress () возвращает ноль) ... поэтому не является правильным решением.

Есть предложения?

Ответы [ 7 ]

8 голосов
/ 25 февраля 2013

Вот что я сделал, чтобы получить IP-адрес точки доступа Wi-Fi:

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

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

Сначала вы должны проверить, находитесь ли вы в режиме AP или нет.Вы можете использовать этот класс для этого: http://www.whitebyte.info/android/android-wifi-hotspot-manager-class

2 голосов
/ 21 мая 2015

Вы можете использовать это.Это не проверено, но должно работать.

((WifiManager) mContext.getSystemService(Context.WIFI_SERVICE)).getDhcpInfo().serverAddress
0 голосов
/ 04 октября 2018

В связи с тем, что число новых телефонов, выпускаемых каждый год новыми производителями, просто определяет имя беспроводного интерфейса, в ближайшем будущем произойдет сбой.Следующий метод может получить ip удаленного сервера из целочисленного ip, возвращаемого getDhcpInfo (). ServerAddress.

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 подключенного сервера.

ПРИМЕЧАНИЕ: убедитесь, что вы уже создали успешное соединение с точкой доступа (например, горячей точкой) через WiFi, прежде чем запрашивать у сервера ip.Для создания успешного соединения вам нужен только SSID и preSharedkey (если он защищен), а не ip сервера.

0 голосов
/ 13 июня 2016

Я использую решение ajma, меняя intf.getName().contains("wlan") на intf.getName().contains("wl") || intf.getName().contains("ap").И он работает для многих мобильных телефонов.

Но он возвращает ноль, когда вы просто подключены к WiFi.

0 голосов
/ 09 июля 2015
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;
}
0 голосов
/ 09 июля 2012

Когда Wi-Fi не настроен как точка доступа, он имеет имя android-xx7632x324x32423 home, когда точка доступа включена, это имя исчезло.Также меняется IP-адрес.

Так что, если вы можете получить конфигурацию Wifi до включения точки доступа, прежде всего вы можете использовать intf.getName(), чтобы получить ссылку на нее.

Во-вторых, ip изменился, поэтому, если вы знаете, какой интерфейс Wi-Fi находится в режиме 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());
0 голосов
/ 06 марта 2012

Вот возможное решение , которое использует WiFiManager ConnectionInfo для поиска соответствующего NetworkInterface.

Если вам нужен только IP, вы можете использовать:

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