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接口的:
- MAC地址,通过WifiInfo's getMacAddress()
- 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。