2008-12-30 13 views
31

Me gustaría obtener una lista de las redes inalámbricas disponibles. Idealmente, esto sería a través de alguna llamada C, pero no me importa si tengo que bloquearlo con una llamada al sistema. Aún mejor si el llamado o programa C requerido no requiere algún paquete exótico de terceros.¿Cómo puedo obtener una lista de redes inalámbricas disponibles en Linux?

Internet parece sugerir que utilizo sudo iwlist <interface> scan que parece ser el truco desde la línea de comandos, pero prefiero no requerir permisos de root. Solo quiero ver lo básico, no cambiar nada.

+2

No necesita ser root para ejecutar iwlist, pero solo informará los valores en caché del último escaneo periódico. Para forzar un nuevo escaneo, necesita ser root. – Hudson

+0

Hmm, cuando se ejecuta no root no devuelve nada, al menos en Ubuntu 8.04: -/ – richq

Respuesta

26

El paquete Wireless Tools - del cual iwlist es una pieza - también contiene una Biblioteca de herramientas inalámbricas de ayuda. Debe incluir iwlib.h y vincular con libiw.a (es decir, agregar -liw). A continuación, busque la documentación para la función iw_set_ext. El parámetro SIOCSIWSCAN será de mayor uso. Para ver un ejemplo de cómo usar esta interfaz, eche un vistazo a la fuente de KWifiManager en la biblioteca de KDE (consulte el método Interface_wireless_wirelessextensions::get_available_networks). Alternativamente, también puede descargar Wireless Tools source code y ver cómo la función iwlib iw_set_ext también se usa para escanear en iwlist.c.

En cuanto a los privilegios, imagino que el proceso deberá ejecutarse como root para realizar el escaneo. Me encantaría saber si esto también podría hacerse de otra manera.

Dado que está utilizando Ubuntu 8.04, el paquete libiw-dev debe ser útil.

+0

¿Puedo utilizar el paquete ** Wirelsess Tool ** (** libiw-dev **) en una aplicación comercial? Probablemente no puedo, pero quiero estar seguro. – rraszewski

35

Es bastante fácil hacer un escaneo en la línea de comando. Las páginas man son su amigo aquí (consulte iwconfig y iwlist). Pero usar la interfaz C es un poco más difícil, así que me centraré en eso.

En primer lugar, como otras personas han mencionado, definitivamente descargue wireless tools source code. Toda la documentación para la interfaz de programación se encuentra en los archivos .c. Por lo que puedo decir, no hay documentación web para la API. Sin embargo, el código fuente es bastante fácil de leer. Simplemente necesita iwlib.h y iwlib.c para esta pregunta.

Aunque se puede usar iw_set_ext y iw_get_ext, la libiw implementa la función de exploración básica iw_scan, desde donde se puede extraer la mayor parte de la información que necesita.

Aquí hay un programa simple para obtener el ESSID para todas las redes inalámbricas disponibles. Compilar con -liw y ejecutar 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); 
} 

DESCARGO DE RESPONSABILIDAD: Este es solo un programa de demostración. Es posible que algunos resultados no tengan un essid. Además, esto supone que su interfaz inalámbrica es "wlan0". Entiendes la idea.

Lea el código fuente iwlib!

+0

¿También puede obtener la dirección AP (dirección MAC) usando este método? ¿Cómo? Gracias :) – bubbly

+0

Obtengo la dirección MAC con: result-> ap_addr pero no está en una forma imprimible. Imprime algo así como 71732. – bubbly

+0

** iwconfig ** imprime el punto de acceso en el formato habitual. Consulte el código fuente del comando en 'iwconfig.c' (busque" Punto de acceso "). –

Cuestiones relacionadas