有很多方法可以获得机器的网络适配器和相关信息,如Sigar& java.net的getNetworkInterfaces()。但是,使用这些方法之一,我无法确定某个适配器是否是无线的(除非名称/说明明确说明)。
有没有办法通过代码确定这个? (我希望能够在Windows和Linux中都这样做,但我愿意处理特定于系统的解决方案。)
答案 0 :(得分:1)
修改: 删除了不相关的部分
也许您可以使用JNI(java本机接口)来调用获取此标志的C函数...使用C,这应该是可能的(尽管可能代码将变得不可移植)
编辑:对于linux,我发现了以下内容。下载了无线工具的源代码,包括iwconfig。它们包括库,iwlib.c,只是从/ proc / net / wireless或/ proc / net / dev
中提取接口的名称您可以从here获取来源,这来自Fedora。当库从标准化文件系统的路径中提取数据时,您唯一需要的是对procfs的内核支持。
现在我只能引导你进入文件“iwlib.c”,功能
void iw_enum_devices(int skfd, iw_enum_handler fn, char * args[], int count)
我不知道这些参数,但是注释了源代码。也许你必须将你从java获得的列表与你通过这个JNI-hack获得的列表进行比较......
猜猜这是一项“小任务”的大量工作;希望你找到自己的方式......
问候
答案 1 :(得分:0)
如果要构建功能的平台特定JNI实现,可以使用Windows API函数获取无线网络接口列表,Wlanapi.h中的 WlanEnumInterfaces 。您需要链接Wlanapi.lib / .dll。另请参阅documentation。
我建议你构建一个带有两个函数的小JNI库:
getWirlessInterfaceCount();
getWirelessInterfaceAddr(int nIf, char *addr);
实际上确保地址的6个字节在Java端分配并且只在本机端填充。这样您就不必担心本机端的内存管理。您可以将这两个JNI调用包装在像
这样的Java方法中List<NetworkInterface> getWirelesNetworkInterfaces();
....调用两个JNI方法,通过NetworkInterface API获取所有接口的列表,并抛出所有未通过JNI方法返回其地址的接口。
答案 2 :(得分:0)
虽然这个问题很老,但有人可能正在寻找这个解决方案,所以这里有一个简单的方法可以找到 Windows 。
在当前的 NetworkInterface 类中,函数 getName()将返回唯一的名称,例如&#34; eth0&#34;,&#34; wlan0& #34;或者&#34; net0&#34;,总是很少的字母和数字。 收集NetworkInterfaces列表并选择真实的列表后,您可以检查 getName()函数是否返回&#34; ethX&#34;对于有线接口或&#34; wlanX&#34;对于无线接口(X是一个数字,取决于您的计算机中有多少接口。)
以下代码是示例,了解如何进行此识别,尽管首先需要找到哪些接口是真实的,但有很多解决方案。
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
public class TesteInterfaces {
public static void main(String[] args) {
Enumeration<NetworkInterface> tempNetInterface = null;
try {
tempNetInterface = NetworkInterface.getNetworkInterfaces();
} catch (SocketException ex) {
ex.printStackTrace();
}
for (NetworkInterface iNet : new ArrayList<>(Collections.list(tempNetInterface))) {
try {
if (iNet.getHardwareAddress() != null) { //This verification might not
//be enought to find if a Interface is real.
System.out.println(iNet.getDisplayName());
if (iNet.getName().contains("wlan")) {
System.out.println("It is WIRELESS");
} else {
System.out.println("It is NOT WIRELESS");
}
}
} catch (SocketException ex) {
ex.printStackTrace();
}
}
}
}
输出:
Intel(R) Centrino(R) Wireless-N 100
It is WIRELESS
Realtek PCIe GBE Family Controller
It is NOT WIRELESS