2009-07-28 81 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 
相關問題