有许多方法可以获得一台机器的网络适配器&相关信息,如Sigar & java.net的getNetworkInterfaces()。但是,使用这两种方法之一,我无法确定某个适配器是否是无线的(除非名称/说明明确说明)。如何确定网络适配器是否是无线的?
有什么方法可以通过代码来确定吗? (我希望能够在两个Windows中都能这样做,但我愿意处理系统特定的解决方案)。
有许多方法可以获得一台机器的网络适配器&相关信息,如Sigar & java.net的getNetworkInterfaces()。但是,使用这两种方法之一,我无法确定某个适配器是否是无线的(除非名称/说明明确说明)。如何确定网络适配器是否是无线的?
有什么方法可以通过代码来确定吗? (我希望能够在两个Windows中都能这样做,但我愿意处理系统特定的解决方案)。
编辑:去除不相关的部分
,也许你可以使用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获得的列表进行比较...
猜测“小任务”有很多工作要做,希望你觉得通过你的方式......
问候
我提到看名称/说明以指示卡是无线的。该解决方案不适合。另外,正如我所说的,我不介意解决方案是否是系统特定的 - 所以这本质上意味着JNI对于每个系统的不同解决方案都可以)。 现在,你提到了一个得到这个标志的C函数 - 那会是什么?我找不到这样的事情。 – dborba 2009-07-28 21:43:37
如果你想建立一个平台特定的JNI实现你的功能,你可以用它来获得的无线网络接口的列表中的Windows API函数是WlanEnumInterfaces Wlanapi.h中的。您需要链接Wlanapi.lib/.dll。另请参阅documentation。
我建议你建立一个小的JNI库有两个功能:
getWirlessInterfaceCount();
getWirelessInterfaceAddr(int nIf, char *addr);
如果你实际上确保了该地址的6个字节被分配在Java端和刚填充在本机侧。这样你就不用担心本地的内存管理。你可以用这两个JNI的Java方法就像
List<NetworkInterface> getWirelesNetworkInterfaces();
....这就要求两个JNI方法调用的方法,获得通过的NetworkInterface API的所有接口的列表,并抛出其地址没有被返回的所有接口由JNI方法。
虽然这个问题很老,有人可能正在寻找这个解决方案,所以在这里它找到了一个简单的方法找出Windows。
在当前的NetworkInterface类功能的getName()将返回唯一的名称,可以是像“eth0的”,“为wlan0”或“NET0”,总是几个字母加一个数字。 在收集NetworkInterfaces列表并选择真正的列表之后,您可以检查getName()函数是否返回有线接口的“ethX”或无线接口的“wlanX”(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
在几个系统上运行多个测试后,我发现Java代码是不是很可靠的。无论是通过java.net和sigar,我都发现他们经常会错过linux上的一些设备。这可能与linux管理设备的方式有关。但是,由于Linux似乎可靠地注册无线适配器,所以通过交叉引用/ proc/net/wireless(来自Atmocreations的帖子)和ifconfig中的数据,我可以确定哪些适配器是无线的。 Windows仍然在逃避我,因为我避免了像VoidPointer所要求的那样复杂的事情。 – dborba 2009-07-29 01:15:53