Как я могу получить список доступных беспроводных сетей в Linux? - PullRequest
33 голосов
/ 30 декабря 2008

Я хотел бы получить список доступных беспроводных сетей. В идеале это было бы через какой-то C-вызов, но я не возражаю, если мне придется делать это с помощью системного вызова. Еще лучше, если требуемый C-вызов или программа не требуют какой-то экзотической сторонней программы.

Интернет, кажется, предлагает использовать sudo iwlist <interface> scan, который, кажется, делает трюк из командной строки, но я бы предпочел не требовать прав root. Я только хочу увидеть основы, а не менять что-либо.

Ответы [ 2 ]

35 голосов
/ 25 мая 2013

Довольно просто выполнить сканирование в командной строке. Справочные страницы - ваш друг (проверьте iwconfig и iwlist ). Но использовать интерфейс C немного сложнее, поэтому я сосредоточусь на этом.

Прежде всего, как уже упоминали другие, обязательно скачайте исходный код беспроводных инструментов . Вся документация для интерфейса программирования находится в файлах .c . Насколько я могу сказать, нет веб-документации для API. Тем не менее, исходный код довольно легко читается. Для этого вопроса вам достаточно всего лишь iwlib.h и iwlib.c .

Хотя вы можете использовать iw_set_ext и iw_get_ext, libiw реализует базовую функцию сканирования iw_scan, из которой вы можете извлечь большую часть необходимой информации.

Вот простая программа для получения ESSID для всех доступных беспроводных сетей. Скомпилируйте с -liw и запустите с 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);
}

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Это просто демонстрационная программа. Для некоторых результатов возможно не иметь essid. Кроме того, это предполагает, что ваш беспроводной интерфейс "wlan0". Вы поняли.

Прочитайте исходный код iwlib !

26 голосов
/ 30 декабря 2008

Пакет Wireless Tools , в состав которого входит iwlist , также содержит библиотеку помощников Wireless Tools. Вам необходимо включить iwlib.h и ссылку с libiw.a (т.е. добавить -liw). Затем найдите документацию для функции iw_set_ext . Параметр SIOCSIWSCAN будет наиболее полезным. Для примера того, как использовать этот интерфейс, взгляните на источник KWifiManager в библиотеке KDE (см. Interface_wireless_wirelessextensions :: get_available_networks метод). Кроме того, вы также можете загрузить исходный код Wireless Tools и посмотреть, как функция iwlib iw_set_ext также используется для сканирования в iwlist.c.

Что касается привилегий, я полагаю, что процесс должен запускаться от имени пользователя root для выполнения сканирования. Я бы хотел знать, можно ли это сделать иначе.

Поскольку вы используете Ubuntu 8.04, должен использоваться пакет libiw-dev .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...