2009-07-28 80 views
0

有许多方法可以获得一台机器的网络适配器&相关信息,如Sigar & java.net的getNetworkInterfaces()。但是,使用这两种方法之一,我无法确定某个适配器是否是无线的(除非名称/说明明确说明)。如何确定网络适配器是否是无线的?

有什么方法可以通过代码来确定吗? (我希望能够在两个Windows中都能这样做,但我愿意处理系统特定的解决方案)。

+0

在几个系统上运行多个测试后,我发现Java代码是不是很可靠的。无论是通过java.net和sigar,我都发现他们经常会错过linux上的一些设备。这可能与linux管理设备的方式有关。但是,由于Linux似乎可靠地注册无线适配器,所以通过交叉引用/ proc/net/wireless(来自Atmocreations的帖子)和ifconfig中的数据,我可以确定哪些适配器是无线的。 Windows仍然在逃避我,因为我避免了像VoidPointer所要求的那样复杂的事情。 – dborba 2009-07-29 01:15:53

回答

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获得的列表进行比较...

猜测“小任务”有很多工作要做,希望你觉得通过你的方式......

问候

+0

我提到看名称/说明以指示卡是无线的。该解决方案不适合。另外,正如我所说的,我不介意解决方案是否是系统特定的 - 所以这本质上意味着JNI对于每个系统的不同解决方案都可以)。 现在,你提到了一个得到这个标志的C函数 - 那会是什么?我找不到这样的事情。 – dborba 2009-07-28 21:43:37

0

如果你想建立一个平台特定的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方法。

0

虽然这个问题很老,有人可能正在寻找这个解决方案,所以在这里它找到了一个简单的方法找出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 
相关问题