имя сетевого интерфейса Wi-Fi - PullRequest
2 голосов
/ 13 января 2011

Я занимаюсь разработкой приложения для Android, в котором телефон подключается к сети Wi-Fi или действует как точка доступа Wi-Fi.Мне нужно получить правильное имя интерфейса. Когда телефон подключается к сети Wi-Fi на Mac, имя интерфейса - «eth0», а когда оно действует как точка доступа, это «wl0.1».

Я нахожуэто с помощью NetworkInterface.getNetworkInterfaces (), который перечисляет все интерфейсы.Я хочу получить только активное имя интерфейса Wi-Fi. Любая помощь в этом?

Ответы [ 2 ]

2 голосов
/ 02 февраля 2011

NetworkInterface имеет getHardwareAddress для возврата аппаратного (MAC) адреса интерфейса.WifiInfo, представляющий текущее состояние Wi-Fi (полученное с помощью WifiManager.getConnectionInfo), имеет метод getMacAddress.Просто используйте последний, чтобы найти ваш Wi-Fi-интерфейс.

Помните, что при сравнении адресов вы должны конвертировать их в общий формат, так как getHardwareAddress возвращает массив байтов, а getMacAddress возвращает строку с двоеточиемшестнадцатеричные значения.

1 голос
/ 06 сентября 2013

Насколько я знаю, есть два способа получить имя интерфейса адаптера Wi-Fi на устройстве Android, используя Java.Через любой интерфейс Wi-Fi:

  1. MAC-адрес, через IP-адрес WifiInfo getMacAddress ()
  2. , через getIpAddress () * 1009 WifiInfo*

Если у вас есть какая-либо информация, вы можете использовать NetworkInterface , чтобы выяснить остальное.

Опция № 1, через MAC-адрес, вероятно, лучший вариант .MAC-адреса всегда доступны, даже если устройство отсутствует в сети.Для некоторых людей может быть желательно получить имя интерфейса, когда устройство не подключено к сети.MAC-адреса никогда не меняются, и если так редко.Выполнение этого через MAC-адрес адаптера Wi-Fi обещает быть более надежным.

Вот пример того, как получить имя интерфейса Wi-Fi через его MAC-адрес.Это расширение оригинального ответа Xion .

protected String wifiInterfaceName(final Context context) {

    // Get WiFi interface's MAC address as a BigInteger.
    WifiManager wifiManager = (WifiManager) context.getSystemService(WIFI_SERVICE);
    WifiInfo wifiInfo = wifiManager.getConnectionInfo();
    String wifiMacString = wifiInfo.getMacAddress();
    byte[] wifiMacBytes = macAddressToByteArray(wifiMacString);
    BigInteger wifiMac = new BigInteger(wifiMacBytes);

    String result = null;
    try {
        List<NetworkInterface> networkInterfaces
                = Collections.list(NetworkInterface.getNetworkInterfaces());

        for (NetworkInterface currentInterface : networkInterfaces) {

            byte[] hardwareAddress = currentInterface.getHardwareAddress();
            if (hardwareAddress != null) {
                BigInteger currentMac = new BigInteger(hardwareAddress);

                if (currentMac.equals(wifiMac)) {
                    result = currentInterface.getName();
                    break;
                }
            }
        }
    } catch (SocketException ex) {
        Log.e("WifiGet", "Socket excpetion: " + ex.getMessage());
    }

    return result;
}

protected byte[] macAddressToByteArray(String macString) {
    String[] mac = macString.split("[:\\s-]");
    byte[] macAddress = new byte[6];
    for (int i = 0; i < mac.length; i++) {
        macAddress[i] = Integer.decode("0x" + mac[i]).byteValue();
    }

    return macAddress;
}

Вариант № 2, через IP-адрес, довольно хорошо объяснен в разделе вопросов: Get Wifi Interfaceимя на Android .При попытке получить имя интерфейса Wi-Fi по IP-адресу следует учитывать несколько моментов:

  • Работает только при подключении устройства к сети Wi-Fi.
  • IP-адреса меняются, поэтому очень маловероятно, что ваша операция не будет работать, если вы поймете, что устройство меняет IP-адрес.
  • Этот я все еще пытаюсь выяснить.Но могут быть проблемы с порядком работы различных устройств и результатом WifiInfo getIpAddress () .Опять же, я не уверен.Все, что я точно знаю, это то, что мне нужно изменить порядок байтов, чтобы получить фактический IP-адрес.

Следующий пример основан на вопросительной части Получить имя интерфейса Wi-Fiна Android

protected String wifiInterfaceName2(final Context context) {

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

    // Convert little-endian to big-endianif needed
    if (ByteOrder.nativeOrder().equals(ByteOrder.LITTLE_ENDIAN)) {
        ipAddress = Integer.reverseBytes(ipAddress);
    }

    byte[] bytes = BigInteger.valueOf(ipAddress).toByteArray();

    String result;
    try {
        InetAddress addr = InetAddress.getByAddress(bytes);
        NetworkInterface netInterface = NetworkInterface.getByInetAddress(addr);
        result = netInterface.getName();
    } catch (UnknownHostException ex) {
        LOG.error("Unknown host.", ex);
        result = null;
    } catch (SocketException ex) {
        LOG.error("Socket exception.", ex);
        result = null;
    }

    return result;
}

Помните, что оба сегмента кода представлены только в качестве примера.Обязательно очистите код, добавьте обработку ошибок и проверьте, планируете ли вы использовать любой из них в рабочей среде.

О, и не забудьте добавить соответствующие разрешения для вашего AndroidManifest.xml .Я думаю, что они что-то вроде:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

Кроме того, эти примеры будут работать только на реальном устройстве.На эмуляторах нет Wi-Fi.

...