È 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!
fonte
2013-05-25 18:55:11
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
Hmm, quando eseguito non-root non restituisce nulla, almeno su Ubuntu 8.04: -/ – richq