2008-12-30 16 views
31

Mi piacerebbe avere un elenco delle reti wireless disponibili. Idealmente, ciò avverrebbe tramite una chiamata C, ma non mi interessa se devo effettuare una kludge con una chiamata di sistema. Ancora meglio se la chiamata o il programma C richiesti non richiede un pacchetto di terze parti esotico.Come posso ottenere un elenco di reti wireless disponibili su Linux?

Internet sembra suggerire di utilizzare sudo iwlist <interface> scan che sembra eseguire il trucco dalla riga di comando, ma preferisco non richiedere i permessi di root. Voglio solo vedere le basi, non cambiare nulla.

+2

Non è necessario essere root per eseguire iwlist, ma riporta solo i valori memorizzati nell'ultima scansione periodica. Per forzare una nuova scansione è necessario essere root. – Hudson

+0

Hmm, quando eseguito non-root non restituisce nulla, almeno su Ubuntu 8.04: -/ – richq

risposta

26

Il pacchetto Wireless Tools - di cui iwlist è una parte - contiene anche una libreria di strumenti di strumenti wireless. È necessario includere iwlib.h e creare un collegamento con libiw.a (ad esempio aggiungere -liw). Quindi cercare la documentazione per la funzione iw_set_ext. Il parametro SIOCSIWSCAN sarà molto utile. Per un esempio di come usare questa interfaccia, dai un'occhiata al sorgente di KWifiManager nella libreria di KDE (vedi: metodo Interface_wireless_wirelessextensions::get_available_networks). In alternativa, puoi anche scaricare Wireless Tools source code e dare un'occhiata a come la funzione iw_b_set_ext viene utilizzata anche per la scansione in iwlist.c.

Per quanto riguarda i privilegi, immagino che il processo dovrà essere eseguito come utente root per eseguire la scansione. Mi piacerebbe sapere se questo potrebbe essere fatto altrimenti.

Poiché si utilizza Ubuntu 8.04, il pacchetto libiw-dev deve essere utile.

+0

Posso usare il pacchetto ** Wirelsess Tool ** (** libiw-dev **) nell'applicazione commerciale? Probabilmente non posso, ma voglio esserne sicuro. – rraszewski

35

È piuttosto facile eseguire una scansione nella riga di comando. Le pagine man sono i tuoi amici qui (controlla iwconfig e iwlist). Ma usare l'interfaccia C è un po 'più difficile quindi mi concentrerò su quello.

Prima di tutto, come altre persone hanno menzionato, scaricare definitivamente il wireless tools source code. Tutta la documentazione per l'interfaccia di programmazione si trova nei file .c. Per quanto posso dire, non esiste documentazione web per l'API. Tuttavia, il codice sorgente è abbastanza facile da leggere. Hai praticamente solo bisogno di iwlib.h e iwlib.c per questa domanda.

Sebbene sia possibile utilizzare iw_set_ext e iw_get_ext, il libiw implementa la funzione di scansione di base iw_scan, da cui è possibile estrarre maggior parte delle informazioni di cui avete bisogno.

Ecco un semplice programma per ottenere l'ESSID per tutte le reti wireless disponibili. Compilare con -liw ed eseguire con 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); 
} 

DISCLAIMER: Questo è solo un programma di dimostrazione. È possibile che alcuni risultati non abbiano un essid. Inoltre, si presume che l'interfaccia wireless sia "wlan0". Hai un'idea.

Leggi il codice sorgente iwlib!

+0

Puoi anche ottenere l'indirizzo AP (indirizzo mac) usando questo metodo? Come? Grazie :) – bubbly

+0

Ottengo l'indirizzo MAC con: result-> ap_addr ma non è in una forma stampabile. Stampa qualcosa come 71732. – bubbly

+0

** iwconfig ** stampa il punto di accesso nel solito formato. Controlla il codice sorgente per il comando in "iwconfig.c" (cerca "Access Point"). –

Problemi correlati