wifi网络接口名称

wifi网络接口名称

问题描述:

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

我发现这个使用NetworkInterface.getNetworkInterfaces(),它列出了所有接口。我只想获得活跃的wifi接口名称。对此有何帮助?

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

请记住,在比较地址时,应将其转换为常见格式,如getHardwareAddress返回字节数组,而getMacAddress使用冒号分隔的十六进制值返回字符串。

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

  1. MAC地址,通过WifiInfo's getMacAddress()
  2. IP地址,通过WifiInfo's getIpAddress()

一旦你有任何一条信息,你可以使用NetworkInterface找出休息。

选项#1通过MAC地址可能是最佳选项。 MAC地址始终可用,即使设备不在网络中。当设备没有连接到网络时,某些人可能会希望得到接口名称。 MAC地址永远不会改变,如果很少的话。因此,通过Wi-Fi适配器的MAC地址做到这一点,将会更加健壮。

下面是如何通过其MAC地址获取Wi-Fi接口名称的示例。这是对Xion的原始答复的扩充。 Get Wifi Interface name on Android

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地址,是很好的问题部分解释。尝试通过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。