【问题标题】:Get Wifi Interface name on Android在 Android 上获取 Wifi 接口名称
【发布时间】:2011-05-12 15:54:30
【问题描述】:

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

【问题讨论】:

  • 取决于手机,我是eth0,你可以通过adb运行netcfg命令来显示网络接口列表。
  • How to get the wifi network interface name in java 与此问题有关,但不完全相同。在这里,我专门询问了 Android,而不是如何在纯 Java 中做到这一点。另一个问题值得一读,但我认为您应该在可用时使用特定的 Android API,因为它们应该更可靠。
  • @a.b.d 您是否能够从所有接口列表中找出这一点,您将如何区分用于 Wi-Fi 的接口?当用户离线时,您的解决方案是否也有效?

标签: android android-networking


【解决方案1】:

你要做的就是改变

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

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

【讨论】:

  • 来自文档:“在 Android 上,这与 {@link #getName} 返回的字符串相同。”
【解决方案2】:

试试这个

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

【讨论】:

    【解决方案3】:

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

    这肯定行得通..

    【讨论】:

    • 这在 Android 上不可用。
    • 该值可通过 getprop 获得。我很想知道这在所有设备上都很常见。这种方法的优点是它可以在 Wi-Fi 关闭时工作,不像其他所有答案都源于 Chloe 所说的。
    【解决方案4】:

    您可以调用/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
    

    【讨论】:

      【解决方案5】:

      试试这个:

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

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

      【讨论】:

        【解决方案6】:

        与此问题相关的所有答案都不是直截了当的。 但是你可以通过反思来实现这一点。即使没有 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,尽管反射中添加了一些限制)。

        【讨论】:

          猜你喜欢
          • 2018-09-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-28
          • 2018-06-08
          相关资源
          最近更新 更多