如何确定网络适配器是否无线?

时间:2009-07-28 21:24:13

标签: java

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

有没有办法通过代码确定这个? (我希望能够在Windows和Linux中都这样做,但我愿意处理特定于系统的解决方案。)

3 个答案:

答案 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