Comment puis-je obtenir une liste des réseaux sans fil disponibles sur Linux?

j'aimerais obtenir une liste des réseaux sans fil disponibles. Idéalement, ce serait via un appel C, mais ça ne me dérange pas si je dois le faire avec un appel système. Encore mieux si L'appel C requis ou le programme ne nécessite pas un paquet de tierce partie exotique.

L'internet semble me suggère d'utiliser sudo iwlist <interface> scan ce qui semble faire l'affaire depuis la ligne de commande, mais je préfère ne pas avoir besoin de permissions racine. Je veux seulement voir les bases, rien changer.

32
demandé sur richq 2008-12-30 16:23:39

2 réponses

Outils Sans Fil package: iwlist est une partie -- contient également une bibliothèque D'aide D'outils sans fil. Vous devez inclure iwlib.h et un lien libiw. (C.-à-d. add-liw). Ensuite, cherchez la documentation pour le iw_set_ext fonction. SIOCSIWSCAN paramètre sera des plus utiles. Pour un exemple d'utilisation de cette interface, regardez la source KWifiManager dans la bibliothèque KDE (voir: Interface_wireless_wireless extensions:: get_available_networks méthode). Alternativement, vous pouvez également télécharger le outils sans fil code source et regardez comment la fonction iwlib iw_set_ext est également utilisée pour la numérisation dans iwlist.c.

en ce qui concerne les privilèges, j'imagine que le processus devra être exécuté en tant que root pour effectuer le scan. J'aimerais savoir si cela pouvait être fait autrement.

puisque vous utilisez Ubuntu 8.04 le libiw-dev l'emballage devrait être utile.

26
répondu Judge Maygarden 2008-12-30 18:34:14

Il est assez facile de faire un scan en ligne de commande. Les pages de manuel sont votre ami ici (check out iwconfig et iwlist). Mais utiliser l'interface C est un peu plus difficile donc je vais me concentrer là-dessus.

tout d'Abord, comme d'autres personnes l'ont mentionné, certainement télécharger le outils sans fil code source. Toute la documentation pour l'interface de programmation est dans le .c fichiers. Pour autant que je sache, il n'est pas documentation web pour l'api. Cependant, le code source est assez facile à lire. Vous avez à peu près seulement besoin d' iwlib.h et iwlib.c pour cette question.

Alors que vous pouvez utiliser iw_set_ext et iw_get_ext, le libiw implémente une fonction de numérisation de base iw_scan, d'où vous pouvez extraire la plupart des informations dont vous avez besoin.

voici un programme simple pour obtenir L'ESSID pour tous les réseaux sans fil disponibles. Compiler avec -liw et courir avec 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);
}

AVERTISSEMENT: Ce n'est qu'un programme de démonstration. Il est possible pour certains résultats de ne pas avoir un essid. De plus, cela suppose que votre interface sans fil est "wlan0". Vous obtenez l'idée.

Lire le iwlib code source!

35
répondu David Matlack 2015-02-19 09:27:10