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!
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
Hmm, cuando se ejecuta no root no devuelve nada, al menos en Ubuntu 8.04: -/ – richq