2008-12-30 19 views
31

Je voudrais obtenir une liste des réseaux sans fil disponibles. Idéalement, ce serait via un appel C, mais je ne me dérange pas si je dois le kludge avec un appel système. Mieux encore si l'appel ou le programme C requis ne nécessite pas de package tiers exotique.Comment puis-je obtenir une liste des réseaux sans fil disponibles sur Linux?

L'Internet semble suggérer que j'utilise sudo iwlist <interface> scan qui semble faire l'affaire depuis la ligne de commande, mais je préfère ne pas avoir besoin d'autorisations root. Je veux seulement voir les bases, ne rien changer.

+2

Vous n'avez pas besoin d'être root pour exécuter iwlist, mais seulement les valeurs mises en cache de la dernière analyse périodique. Pour forcer une nouvelle analyse, vous devez être root. – Hudson

+0

Hmm, lorsqu'il n'est pas root, il ne renvoie rien, au moins sur Ubuntu 8.04: -/ – richq

Répondre

26

Le paquet Wireless Tools - dont iwlist fait partie - contient également une bibliothèque d'aide d'outils sans fil. Vous devez inclure iwlib.h et lier avec libiw.a (c'est-à-dire ajouter -liw). Recherchez ensuite la documentation de la fonction iw_set_ext. Le paramètre SIOCSIWSCAN sera le plus utile. Pour un exemple d'utilisation de cette interface, jetez un oeil à la source de KWifiManager dans la bibliothèque KDE (voir: méthode Interface_wireless_wirelessextensions::get_available_networks). Alternativement, vous pouvez également télécharger le Wireless Tools source code et voir comment la fonction iwlib iw_set_ext est également utilisée pour scanner dans iwlist.c. En ce qui concerne les privilèges, j'imagine que le processus doit être exécuté en tant que root pour effectuer l'analyse. J'aimerais savoir si cela pourrait aussi être fait autrement.

Puisque vous utilisez Ubuntu 8.04 le paquet libiw-dev devrait être utile.

+0

Puis-je utiliser le package ** Wirelsess Tool ** (** libiw-dev **) dans une application commerciale? Probablement je ne peux pas, mais je veux être sûr. – rraszewski

35

Il est assez facile de faire un scan dans la ligne de commande. Les pages man sont votre ami ici (consultez iwconfig et iwlist). Mais l'utilisation de l'interface C est un peu plus difficile, donc je vais me concentrer là-dessus.

Tout d'abord, comme d'autres personnes l'ont mentionné, certainement télécharger le wireless tools source code. Toute la documentation de l'interface de programmation se trouve dans les fichiers .c. Pour autant que je sache, il n'y a pas de documentation web pour l'API. Cependant, le code source est assez facile à lire. Vous avez à peu près besoin seulement iwlib.h et iwlib.c pour cette question.

Alors que vous pouvez utiliser iw_set_ext et iw_get_ext, le libiw met en oeuvre une fonction de balayage de base iw_scan, à partir de laquelle vous pouvez extraire la plupart des informations que vous avez besoin.

Voici un programme simple pour obtenir l'ESSID pour tous les réseaux sans fil disponibles. Compilez avec -liw et exécutez avec sudo.

#include <stdio.h> 
#include <time.h> 
#include <iwlib.h> 

int main(void) { 
    wireless_scan_head head; 
    wireless_scan *result; 
    iwrange range; 
    int sock; 

    /* Open socket to kernel */ 
    sock = iw_sockets_open(); 

    /* Get some metadata to use for scanning */ 
    if (iw_get_range_info(sock, "wlan0", &range) < 0) { 
    printf("Error during iw_get_range_info. Aborting.\n"); 
    exit(2); 
    } 

    /* Perform the scan */ 
    if (iw_scan(sock, "wlan0", range.we_version_compiled, &head) < 0) { 
    printf("Error during iw_scan. Aborting.\n"); 
    exit(2); 
    } 

    /* Traverse the results */ 
    result = head.result; 
    while (NULL != result) { 
    printf("%s\n", result->b.essid); 
    result = result->next; 
    } 

    exit(0); 
} 

AVERTISSEMENT: Ceci est juste un programme de démonstration. Il est possible que certains résultats n'aient pas d'esside. En outre, cela suppose que votre interface sans fil est "wlan0". Vous avez eu l'idée.

Lire le code source iwlib!

+0

Pouvez-vous également obtenir l'adresse AP (adresse MAC) en utilisant cette méthode? Comment? Merci :) – bubbly

+0

Je reçois l'adresse MAC avec: result-> ap_addr mais ce n'est pas sous une forme imprimable. Il imprime quelque chose comme 71732. – bubbly

+0

** iwconfig ** imprime le point d'accès au format habituel. Vérifiez le code source de la commande dans 'iwconfig.c' (recherchez" Access Point "). –