wifi网络接口名称

时间:2011-01-13 07:19:19

标签: android networking wifi

我正在开发一个Android应用程序,其中手机连接到wifi网络或充当wifi接入点。我需要获得正确的接口名称。当手机连接到mac上的wifi网络时,接口名称为'eth0',当它作为接入点时,它是'wl0.1'。

我使用NetworkInterface.getNetworkInterfaces()找到它,它列出了所有接口。我只想获得有效的wifi界面名称。对此有何帮助?

3 个答案:

答案 0 :(得分:2)

NetworkInterfacegetHardwareAddress用于返回接口的硬件(MAC)地址。表示当前Wi-Fi状态(由WifiInfo获取)的WifiManager.getConnectionInfo具有getMacAddress方法。只需使用后者即可找到您的Wi-Fi接口。

请记住,在比较地址时,您应该将它们转换为通用格式,因为getHardwareAddress返回字节数组,而getMacAddress返回带冒号分隔的十六进制值的字符串。

答案 1 :(得分:1)

据我所知,有两种方法可以使用Java在Android设备上获取Wi-Fi适配器的接口名称。通过Wi-Fi接口:

  1. MAC地址,通过WifiInfo's getMacAddress()
  2. IP地址,通过WifiInfo's getIpAddress()
  3. 获得任何一条信息后,您可以使用NetworkInterface来确定其余信息。

    选项#1,通过MAC地址,可能是最佳选择。即使设备不在网络上,MAC地址也始终可用。当设备未连接到网络时,某些人实际上可能需要获取接口名称。 MAC地址永远不会改变,如果很少。因此,通过Wi-Fi适配器的MAC地址实现这一目标将更加强大。

    以下是如何通过其MAC地址获取Wi-Fi接口名称的示例。这是 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 name on Android的问题部分中得到了很好的解释。尝试通过IP地址获取Wi-Fi接口名称时,需要注意以下几点:

    • 仅当设备连接到Wi-Fi网络时才有效。
    • IP地址发生变化,因此如果您发现设备更改IP地址,则操作失败的可能性非常小。
    • 这个我还在想弄清楚。但是,各种设备的字节顺序和WifiInfo getIpAddress()的结果可能存在问题。再说一遍,我不确定。我所知道的是,我必须反转字节顺序才能获得实际的IP地址。

    以下示例基于Get Wifi Interface name on 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。

答案 2 :(得分:0)

任何没有root用户的Android版本:

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

如果设备名称以 wl 开头是无线的。哦, p2p 。 例如:wlan0,wlp2s0等