2009-07-28 11 views
0

Es gibt mehrere Möglichkeiten, die Netzwerkadapter eines Geräts zu beziehen & verwandte Informationen wie Sigar & java.net's getNetworkInterfaces(). Mit einer dieser Methoden kann ich jedoch nicht bestimmen, ob ein bestimmter Adapter drahtlos ist (sofern der Name/die Beschreibung dies nicht ausdrücklich angibt).Wie kann festgestellt werden, ob ein Netzwerkadapter kabellos ist?

Gibt es Möglichkeiten, dies durch Code zu bestimmen? (Ich würde das gerne in beiden Windows & Linux tun, aber ich bin bereit, mit systemspezifischen Lösungen umzugehen).

+0

Nach einigen Tests auf mehreren Systemen ausgeführt wird, ich finde, dass die Java-Code überhaupt nicht sehr zuverlässig ist. Sowohl bei java.net & sigar habe ich festgestellt, dass sie oft einige Geräte auf Linux vermissen. Dies vielleicht auf die Weise, wie Linux die Geräte verwaltet. Da Linux jedoch drahtlose Adapter zuverlässig zu registrieren scheint, kann ich durch Querverweisen auf die Daten in/proc/net/wireless (aus Atmocreations 'Beitrag) und ifconfig bestimmen, welche Adapter drahtlos sind. Windows entgeht mir immer noch, da ich etwas so Komplexes vermeide wie von VoidPointer. – dborba

Antwort

1

Edit:das Teil entfernt, die nicht relevant

vielleicht ist Ihnen die JNI (Java Native Interface) verwenden könnte eine C-Funktion aufrufen, die dieses Flag wird ... mit C, sollte dies möglich sein (obwohl möglich, dass der Code unportable werden würde)

Edit: Für Linux fand ich Folgendes. Download des Quellcodes von Wireless-Tools, einschließlich iwconfig. Sie enthalten Bibliothek, iwlib.c, extrahiert einfach die Namen der Schnittstelle aus/proc/net/wireless oder/proc/net/dev

Sie können die Quellen von here erhalten, das ist von Fedora. Wenn die Bibliothek ihre Daten aus einem Pfad eines standardisierten Dateisystems extrahiert, müssen Sie nur noch Kernel-Unterstützung für procfs haben.

Jetzt kann ich nur Sie auf die Datei „iwlib.c“ führen, Funktion

void iw_enum_devices(int skfd, iw_enum_handler fn, char * args[], int count) 

ich weiß nicht, über diese Parameter, aber der Quellcode ist kommentiert. Vielleicht müssen Sie die Liste, die Sie von Java erhalten, mit der vergleichen, die Sie durch diesen JNI-Hack erhalten ...

Raten Sie, es ist eine Menge Arbeit für eine "kleine Aufgabe"; hoffe, Sie finden Ihren Weg durch ...

Grüße

+0

Ich erwähnte den Blick auf den Namen/die Beschreibung für eine Anzeige, die Karte ist drahtlos. Diese Lösung ist nicht geeignet. Auch, wie gesagt, es macht mir nichts aus, wenn die Lösung systemspezifisch ist - das würde inhärent bedeuten, dass JNI mit verschiedenen Lösungen für jedes System in Ordnung ist. Jetzt erwähnen Sie eine C-Funktion, die diese Flagge bekommt - was wäre das? Ich habe so etwas nicht gefunden. – dborba

+0

Entschuldigung, muss falsch gelesen haben ... du hast Recht. Ich habe auch gesucht, habe noch nichts gefunden. Wenn ich eine C-Funktion sehe, die zurückgibt, ob eine Schnittstelle drahtlos ist, werde ich es veröffentlichen. irgendwie kann es nicht zu schwierig sein, denke ich, weil iwconfig auch unterscheiden kann. Vielleicht müssen wir uns das mal anschauen. Grüße – Atmocreations

+0

aktualisiert die Antwort mit einem Ansatz. entfernt die Punkte, mit denen Sie vorher nicht einverstanden waren ... Grüße – Atmocreations

0

Wenn Sie eine plattformspezifische JNI Implementierung Ihrer Funktionalität aufbauen wollen, kann die Windows-API-Funktion, die Sie Schnittstellen eine Liste von drahtlosen Netzwerks erhalten verwenden, ist WlanEnumInterfaces in Wlanapi.h. Sie müssen Wlanapi.lib/.dll verbinden. Siehe auch die documentation.

würde ich empfehlen, dass Sie eine wenig JNI-Bibliothek mit zwei Funktionen bauen:

getWirlessInterfaceCount(); 
getWirelessInterfaceAddr(int nIf, char *addr); 

Wo Sie tatsächlich das 6 Bytes für die Adresse stellen Sie sicher, auf der Java-Seite zugeordnet ist und nur auf dem nativen ausgefüllt Seite. Auf diese Weise müssen Sie sich nicht um die Speicherverwaltung auf der nativen Seite kümmern. Sie können die beiden JNI-Aufrufe in einer Java-Methode wie

List<NetworkInterface> getWirelesNetworkInterfaces(); 

wickeln ...., die die beiden JNI Methoden aufruft, wird die Liste aller Schnittstellen über die Network API und wirft alle Schnittstellen, deren Adresse nicht zurückgegeben nach den JNI-Methoden.

0

Obwohl diese Frage ziemlich alt ist, könnte jemand nach dieser Lösung suchen, also hier geht es einen einfachen Weg, um herauszufinden, in Windows.

In der aktuellen Network Klasse der Funktion getName() werden eindeutige Namen zurück, die Dinge wie „eth0“ sein kann „wlan0“ oder „net0“, immer einige Buchstaben und eine Zahl. Nachdem Sie die Liste der NetworkInterfaces gesammelt und die echten ausgewählt haben, können Sie überprüfen, ob die Funktion getName() "ethX" für eine verdrahtete Schnittstelle oder "wlanX" für eine drahtlose Schnittstelle zurückgibt (X ist eine Zahl, die davon abhängt, wie viele Schnittstellen, die Sie in Ihrem Computer haben.)

Der folgende Code ist ein Beispiel für wie Sie diese Identifizierung machen können, obwohl zunächst notwendig ist, um herauszufinden, welche Schnittstellen real sind, gibt es viele Lösungen dafür.

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(); 
     } 
    } 
}  
} 

Ein Ausgang:

Intel(R) Centrino(R) Wireless-N 100 
It is WIRELESS 
Realtek PCIe GBE Family Controller 
It is NOT WIRELESS 
Verwandte Themen