Получить имя интерфейса Wi-Fi на Android

В настоящее время я разрабатываю своего рода сниффер Wi-Fi. Для этого я использую бинарный файл tcpdump, скомпилированный для arm. Но предполагается, что я знаю имя интерфейса Wi-Fi.

Согласно документации SDK NetworkInterface предоставьте метод getName().< br> Я планирую использовать этот метод, поэтому первым шагом будет получение объекта NetworkInterface, соответствующего моему интерфейсу Wi-Fi.
Для этого я использую WifiInfo для получения IP-адреса, затем получаю InetAddress, соответствующий этому IP-адресу, и наконец, получите экземпляр NetworkInterface, используя статический метод getByInetAddress (адрес InetAddress).

Вот мой код:

WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int ipAddress = wifiInfo.getIpAddress();
byte[] bytes = BigInteger.valueOf(ipAddress).toByteArray();
InetAddress addr = InetAddress.getByAddress(bytes);
NetworkInterface netInterface = NetworkInterface.getByInetAddress(addr);
Log.e("MyTemp",netInterface.getName());

Выход :

SSID: Nancy-Universite, BSSID: 00:19:30:6a:a9:40, MAC: B4:07:F9:D5:7C:8C, Supplicant    state: COMPLETED, RSSI: -80, Link speed: 11, Net ID: 6

Но я исключаю что-то вроде:

eth0

Я также пробую метод isVirtual(), но он не компилируется, и я получаю сообщение об ошибке, в котором говорится, что метод isVirtual() не определен для типа NetworkInterface. Я не понимаю, что происходит...
Будем признательны за любую помощь.


person a.b.d    schedule 12.05.2011    source источник
comment
Это зависит от телефона, у меня это eth0, можно запустить команду netcfg через adb для отображения списка сетевых интерфейсов.   -  person a.b.d    schedule 13.05.2011
comment
Как получить имя сетевого интерфейса Wi-Fi в java относится к этому вопросу, но не является точной копией. Здесь я спросил именно об Android, а не о том, как это сделать на простой Java. Другой вопрос стоит прочитать, но я думаю, что вам следует использовать определенные Android API, когда они доступны, поскольку они должны быть более надежными.   -  person a.b.d    schedule 10.09.2013
comment
@a.b.d Удалось ли вам понять это из всего списка интерфейсов, как бы вы отличили интерфейс для Wi-Fi? Будет ли ваше решение работать, когда пользователь не в сети?   -  person Shobhit Puri    schedule 10.01.2017


Ответы (6)


Попробуй это

for(Enumeration<NetworkInterface> list = NetworkInterface.getNetworkInterfaces(); list.hasMoreElements();)
    {
            NetworkInterface i = list.nextElement();
            Log.e("network_interfaces", "display name " + i.getDisplayName());
    }
person angadsg    schedule 04.06.2011

Все, что вам нужно сделать, это изменить

Log.e("MyTemp",netInterface.getName());

to

Log.e("MyTemp",netInterface.getDisplayName());
person robquad    schedule 18.07.2011
comment
Из документации: на Android это та же строка, которую возвращает {@link #getName}. - person Kevin Coppock; 17.09.2015

Используйте это: String interfaceName = SystemInfo.getInstance().getProperty("wifi.interface");

Это точно сработает..

person Harshit Syal    schedule 09.07.2012
comment
Это недоступно на Android. - person bk138; 23.11.2012
comment
Значение доступно через getprop. Мне было бы интересно узнать, что это общее для всех устройств. Преимущество этого метода в том, что он работает при отключенном Wi-Fi, в отличие от всех других ответов, которые уходят корнями в то, что сказала Хлоя. - person Rob Pridham; 12.04.2013

Вы можете вызвать /system/ip link и проанализировать результаты.

bash-3.2# ip link
ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: usb0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether 6e:3d:7a:3a:62:ee brd ff:ff:ff:ff:ff:ff
3: usb1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether da:bb:3f:04:1b:cd brd ff:ff:ff:ff:ff:ff
4: sit0: <NOARP> mtu 1480 qdisc noop state DOWN
    link/sit 0.0.0.0 brd 0.0.0.0
5: ip6tnl0: <NOARP> mtu 1460 qdisc noop state DOWN
    link/tunnel6 :: brd ::
6: ifb0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN qlen 32
    link/ether 76:3c:4e:23:cc:f8 brd ff:ff:ff:ff:ff:ff
7: ifb1: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN qlen 32
    link/ether 02:17:54:31:ff:bd brd ff:ff:ff:ff:ff:ff
8: tun: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 500
    link/ether b2:b7:11:da:7c:6a brd ff:ff:ff:ff:ff:ff
16: tiwlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 100
    link/ether 40:fc:89:e4:67:4c brd ff:ff:ff:ff:ff:ff
person Chloe    schedule 01.03.2012

Попробуй это:

ls /sys/class/ieee80211/*/device/net/

Без полномочий root, протестировано на Android 4, Android 7.1, Android 9 и Arch Linux.

person VasileM    schedule 19.11.2019

Все ответы, связанные с этим вопросом, не являются прямыми. Но вы можете добиться этого путем отражения. Упомянутый ниже код будет работать даже при отсутствии подключения к Wi-Fi.

    String interfaceName=null;
        try {
            Method m = Class.forName("android.os.SystemProperties").getMethod("get", String.class);
            interFace = (String) m.invoke(null, "wifi.interface");
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        System.out.println("Wifi Interface Name: " + interfaceName);

Он работает на всех уровнях API (даже если ваш targetdk будет равен 30, несмотря на некоторые ограничения, добавленные при отражении).

person Mrudul Tora    schedule 22.11.2020