3

我目前正在开发一种 wifi 嗅探器。为此,我使用为 arm 编译的 tcpdump 二进制文件。但假设我知道 Wifi 接口的名称。

根据 SDK 文档NetworkInterface提供一个 getName() 方法。
我打算用这个方法,所以第一步是获取我的wifi接口对应的NetworkInterface对象。
为此,我使用 WifiInfo 获取 ip 地址,然后获取与此 IP 对应的 InetAddress,最后通过使用静态方法 getByInetAddress(InetAddress address) 获取 NetworkInterface 的实例。

这是我的代码:

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 类型定义。我不明白发生了什么......
任何帮助将不胜感激。

4

6 回答 6

4

你所要做的就是改变

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

Log.e("MyTemp",netInterface.getDisplayName());
于 2011-07-18T15:53:45.083 回答
1

试试这个

for(Enumeration<NetworkInterface> list = NetworkInterface.getNetworkInterfaces(); list.hasMoreElements();)
    {
            NetworkInterface i = list.nextElement();
            Log.e("network_interfaces", "display name " + i.getDisplayName());
    }
于 2011-06-04T17:55:48.770 回答
1

使用这个: String interfaceName = SystemInfo.getInstance().getProperty("wifi.interface");

这肯定会奏效..

于 2012-07-09T06:44:03.100 回答
0

您可以调用/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
于 2012-03-01T03:49:07.040 回答
0

试试这个:

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

非 root,在 Android 4、Android 7.1、Android 9 和 Arch Linux 上测试。

于 2019-11-19T18:12:08.370 回答
0

与此问题相关的所有答案都不是直截了当的。但是你可以通过反思来实现这一点。即使没有 wifi 连接,下面提到的代码也可以工作。

    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 级别(即使您的 targetsdk 将是 30,尽管反射中添加了一些限制)。

于 2020-11-22T18:40:58.943 回答