Я хочу получить список доступных беспроводных сетей. В идеале это могло бы быть через какой-то вызов C, но я не возражаю, если мне придется забивать его системным вызовом. Еще лучше, если требуемый вызов C или программа не требует каких-то экзотических сторонних пакетов.
Интернет, кажется, предлагает мне использовать sudo iwlist <interface> scan, который, похоже, выполняет трюк из командной строки, но я бы предпочел не требовать прав root. Я хочу увидеть только основы, ничего не менять.
Хм, при запуске без полномочий root ничего не возвращает, по крайней мере, на Ubuntu 8.04: - /





Пакет Беспроводные инструменты, частью которого является 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) в коммерческом приложении? Наверное, не могу, но хочу быть уверенным.
Выполнить сканирование в командной строке довольно просто. Страницы руководства - ваш друг (посмотрите 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-адрес), используя этот метод? Как? Спасибо :)
Я получаю MAC-адрес с помощью: result-> ap_addr, но его нет в форме для печати. Он выводит что-то вроде 71732.
iwconfig.c (ищите «Точка доступа»).
@DavidMatlack, первый в списке тот, к которому я сейчас подключен?
@MattLong В настоящее время вы ни к чему не подключены. Карта сканируется.
@DavidMatlack, Какая лицензия?
Вы можете использовать nmcli, который не требует прав root или имени интерфейса WIFI.
nmcli -t -f ssid dev wifi
Вам не нужно быть пользователем root для запуска iwlist, но он будет сообщать только кэшированные значения из последнего периодического сканирования. Чтобы принудительно выполнить новое сканирование, вам нужно быть root.