Como posso obter uma lista de redes sem fio disponíveis no Linux?
Pergunta
Gostaria de obter uma lista de redes sem fio disponíveis. Idealmente, isso seria através de alguma chamada C, mas eu não me importo se eu tiver que kludge-lo com uma chamada de sistema. Ainda melhor se a chamada C exigido ou programa não requer algum pacote partido 3ª exótico.
A internet parece sugerir que eu uso sudo iwlist <interface> scan
que parece fazer o truque na linha de comando, mas eu prefiro não requerem permissões de root. Eu só quero ver o básico, não muda nada.
Solução
Wireless ferramentas pacote - dos quais iwlist é uma parte - também contém uma rede sem fio ferramentas auxiliares de biblioteca. Você precisa incluir iwlib.h e ligação com libiw.a (ou seja, adicionar -liw). Em seguida, procure a documentação para o função iw_set_ext. O SIOCSIWSCAN parâmetro será de maior uso. Para um exemplo de como usar esta interface, dê uma olhada na fonte KWiFiManager na biblioteca KDE (ver: Interface_wireless_wirelessextensions :: get_available_networks método). Alternativamente, você também pode baixar o sem fio código-fonte Ferramentas e dar uma olhada em como a função iwlib iw_set_ext também é usado para a digitalização no iwlist.c.
Como para privilégios, imagino que o processo terá de ser executado como root para executar a digitalização. Eu adoraria saber se isso poderia ser feito de outra forma também.
Uma vez que você estiver usando o Ubuntu 8.04 pacote libiw-dev deve ser de uso.
Outras dicas
É muito fácil fazer uma varredura na linha de comando. As páginas de manual são o seu amigo aqui (confira iwconfig e iwlist ). Mas usando a interface C é um pouco mais difícil por isso vou focar nisso.
Em primeiro lugar, como outras pessoas mencionados, definitivamente download a ferramentas sem fio código fonte . Toda a documentação para a interface de programação está nos .c arquivos. Tanto quanto eu posso dizer, não há documentação web para a api. No entanto, o código fonte é muito fácil de ler. Você praticamente só precisa de iwlib.h e iwlib.c para esta questão.
Enquanto você pode usar iw_set_ext
e iw_get_ext
, o libiw implementa uma iw_scan
função de digitalização básica, a partir do qual você pode extrair a maioria das informações que você precisa.
Aqui é um programa simples para obter o ESSID para todas as redes sem fio disponíveis. Compilar com -liw
e correr com 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);
}
IMPORTANTE: Este é apenas um programa de demonstração. É possível que alguns resultados não ter um essid. Além disso, este assume a sua interface wireless é "wlan0". Você começa a idéia.
Leia o iwlib código fonte!