有許多方法可以獲得一臺機器的網絡適配器&相關信息,如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