web-dev-qa-db-fra.com

Comment obtenir une liste des réseaux sans fil disponibles sous Linux?

Je voudrais obtenir une liste des réseaux sans fil disponibles. Idéalement, ce serait via un appel C, mais cela ne me dérange pas si je dois lui donner un coup de fil avec un appel système. Encore mieux si l'appel ou le programme C requis ne nécessite pas de package tiers exotique.

Internet semble suggérer que j'utilise Sudo iwlist <interface> scan ce qui semble faire l'affaire depuis la ligne de commande, mais je préfère ne pas avoir besoin des autorisations root. Je veux seulement voir les bases, ne rien changer.

33
richq

Le Wireless Tools package - dont iwlist fait partie - contient également une bibliothèque d'outils sans fil. Vous devez inclure iwlib.h et lier avec libiw.a ( c'est-à-dire ajouter -liw). Recherchez ensuite la documentation de la fonction iw_set_ext . Le paramètre [~ # ~] siocsiwscan [~ # ~] sera le plus utile. Pour un exemple d'utilisation de cette interface, jetez un œil à la source KWifiManager dans la bibliothèque KDE (voir: méthode Interface_wireless_wirelessextensions :: get_available_networks ). Alternativement, vous pouvez également télécharger le code source des outils sans fil et voir 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 s'exécuter en tant que root pour effectuer l'analyse. J'adorerais savoir si cela pourrait être fait autrement également.

Puisque vous utilisez Ubuntu 8.04, le package libiw-dev devrait être utile.

26
Judge Maygarden

Il est assez facile de faire un scan en ligne de commande. Les pages de manuel sont votre ami ici (consultez iwconfig et iwlist ) . Mais l'utilisation de l'interface C est un peu plus difficile, je vais donc me concentrer sur cela.

Tout d'abord, comme d'autres personnes l'ont mentionné, téléchargez définitivement le code source des outils sans fil . Toute la documentation de l'interface de programmation se trouve dans les fichiers . C . Pour autant que je sache, il n'y a pas de documentation Web pour l'API. Cependant, le code source est assez facile à lire. Vous avez à peu près seulement besoin iwlib.h et iwlib.c pour cela question.

Bien que vous puissiez utiliser iw_set_ext et iw_get_ext, la libiw implémente une fonction de numérisation de base iw_scan, à partir duquel 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 exécutez 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: Ceci est juste un programme de démonstration. Il est possible que certains résultats n'aient pas d'essence. De plus, cela suppose que votre interface sans fil est "wlan0". Vous avez eu l'idée.

Lisez le code source iwlib !

35
David Matlack