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

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

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

Вам не нужно быть пользователем root для запуска iwlist, но он будет сообщать только кэшированные значения из последнего периодического сканирования. Чтобы принудительно выполнить новое сканирование, вам нужно быть root.

Hudson 30.12.2008 18:02

Хм, при запуске без полномочий root ничего не возвращает, по крайней мере, на Ubuntu 8.04: - /

richq 30.12.2008 18:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
36
2
75 451
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Пакет Беспроводные инструменты, частью которого является iwlist, также содержит вспомогательную библиотеку беспроводных инструментов. Вам нужно включить 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.

Могу ли я использовать пакет Инструмент Wirelsess (libiw-dev) в коммерческом приложении? Наверное, не могу, но хочу быть уверенным.

rraszewski 04.09.2014 14:11

Выполнить сканирование в командной строке довольно просто. Страницы руководства - ваш друг (посмотрите 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». Вы уловили идею.

Прочтите исходный код иулиб!

Можете ли вы также получить адрес точки доступа (MAC-адрес), используя этот метод? Как? Спасибо :)

bubbly 26.07.2013 16:35

Я получаю MAC-адрес с помощью: result-> ap_addr, но его нет в форме для печати. Он выводит что-то вроде 71732.

bubbly 28.07.2013 03:43
iwconfig распечатывает точку доступа в обычном формате. Ознакомьтесь с исходным кодом команды в iwconfig.c (ищите «Точка доступа»).
David Matlack 02.09.2013 03:07

@DavidMatlack, первый в списке тот, к которому я сейчас подключен?

Didac Perez Parera 10.09.2014 12:54

@MattLong В настоящее время вы ни к чему не подключены. Карта сканируется.

calumb 20.01.2016 02:00

@DavidMatlack, Какая лицензия?

Pacerier 23.02.2017 07:37

Вы можете использовать nmcli, который не требует прав root или имени интерфейса WIFI.

nmcli -t -f ssid dev wifi

Другие вопросы по теме