2009-07-28 6 views
0

Il existe un certain nombre de façons d'obtenir des informations relatives aux adaptateurs réseau & d'une machine telles que Sigar & getNetworkInterfaces de java.net(). Cependant, en utilisant l'un de ces moyens, je suis incapable de déterminer si un certain adaptateur est sans fil (à moins que le nom/la description le dise explicitement).Comment peut-on déterminer si une carte réseau est sans fil?

Existe-t-il des moyens de déterminer cela à l'aide du code? (Je voudrais être en mesure de le faire dans Windows & Linux, mais je suis prêt à faire face à des solutions spécifiques au système).

+0

Après avoir exécuté plusieurs tests sur plusieurs systèmes, je trouve que le code Java est pas très fiable du tout. Tant à travers java.net & sigar, je constate qu'ils manquent souvent certains appareils sur linux tout à fait. C'est peut-être la façon dont Linux gère les périphériques. Cependant, comme Linux semble enregistrer de manière fiable les adaptateurs sans fil en tant que tels, en référençant les données dans/proc/net/wireless (à partir de la publication d'Atmocreations) et ifconfig, je peux déterminer quelles adaptations sont sans fil. Windows m'évite encore car j'évite quelque chose d'aussi complexe que celui de VoidPointer. – dborba

Répondre

1

Edit:enlevé la partie qui ne concerne pas

vous pourriez peut-être utiliser la (interface native java) JNI appeler une fonction C qui obtient ce drapeau ... avec C, cela devrait être possible (bien que possible que le code deviendrait nonportable)

Editer: Pour linux, j'ai trouvé ce qui suit. Téléchargé le code source des outils sans fil, y compris iwconfig. Ils ont inclus la bibliothèque, iwlib.c, extrait simplement les noms de l'interface de/proc/net/sans fil ou/proc/net/dev

Vous pouvez obtenir les sources de here, cela vient de Fedora. Comme la bibliothèque extrait ses données d'un chemin d'un système de fichiers standardisé, la seule chose dont vous avez besoin est le support du noyau pour procfs.

Maintenant, je ne peux que vous conduire dans le fichier « iwlib.c », la fonction

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

je ne sais pas ces paramètres, mais le code source est commenté. Peut-être que vous devrez comparer la liste que vous obtenez de Java avec celle que vous recevez à travers ce JNI-hack ...

Devinez c'est beaucoup de travail pour une "petite tâche"; espérons que vous trouverez votre chemin à travers ...

ce qui a trait

+0

J'ai mentionné en regardant le nom/description pour une indication que la carte est sans fil. Cette solution ne convient pas. De plus, comme je l'ai dit, cela ne me dérange pas si la solution est spécifique au système - ce qui signifierait que JNI est d'accord avec différentes solutions pour chaque système. Maintenant, vous parlez d'une fonction C qui obtient ce drapeau - que serait-ce? Je n'ai trouvé aucune chose pareille. – dborba

+0

excusez-moi, doit avoir mal lu ... vous avez raison. J'ai regardé aussi bien, n'a encore rien trouvé. Si je vois une fonction C qui retourne si une interface est sans fil, je l'afficherai. D'une certaine manière, ça ne peut pas être trop difficile, je suppose, parce qu'iwconfig est aussi capable de distinguer. peut-être que nous devons juste jeter un coup d'oeil à celui-là. salutations – Atmocreations

+0

a mis à jour la réponse avec une approche. enlevé les points avec lesquels vous n'étiez pas d'accord avant ... salutations – Atmocreations

0

Si vous voulez construire une plate-forme de mise en œuvre spécifique JNI de votre fonctionnalité, la fonction API Windows, vous pouvez utiliser pour obtenir une liste des interfaces réseau sans fil est WlanEnumInterfaces dans Wlanapi.h. Vous aurez besoin de lier Wlanapi.lib/.dll. En outre, voir le documentation.

Je vous recommande de construire une petite bibliothèque JNI avec deux fonctions:

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

Si vous faites réellement que les 6 octets pour l'adresse sont attribués sur le côté Java et juste remplir le natif côté. De cette façon, vous n'avez pas à vous soucier de la gestion de la mémoire du côté natif. Vous pouvez envelopper ces deux JNI appelle une méthode Java comme

List<NetworkInterface> getWirelesNetworkInterfaces(); 

.... qui appelle les deux méthodes JNI, obtient la liste de toutes les interfaces via l'API NetworkInterface et jette toutes les interfaces dont l'adresse n'a pas été retournée par les méthodes JNI.

0

Bien que cette question est assez ancienne, quelqu'un peut être à la recherche de cette solution, alors voici une façon simple de trouver dans Windows.

Dans la classe NetworkInterface actuelle la fonction getName() renverra des noms uniques qui peuvent être des choses comme « eth0 », « wlan0 » ou « net0 », toujours quelques lettres, plus un nombre. Après avoir rassemblé la liste des NetworkInterfaces et sélectionné les réels, vous pouvez ensuite vérifier si la fonction getName() renvoie "ethX" pour une interface filaire ou "wlanX" pour une interface sans fil (X est un nombre qui dépend du nombre de les interfaces que vous avez dans votre ordinateur.)

Le code suivant est un exemple pour la façon dont vous pouvez faire cette identification, bien qu'il soit nécessaire de premièrement de trouver quelles interfaces sont réelles, il y a beaucoup de solutions pour cela.

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

Une sortie:

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