Беспроводной API для Linux в C\C++

Я пытаюсь найти правильный способ повторного использования существующих реализаций инструментов Wi-Fi (iw) в собственном коде (c\c++). Мне нужно получить информацию о доступных точках доступа в диапазоне (мощность сигнала, MAC-адрес и т. д.). Я нашел пару примеров кода (WEXT и другие), которые используют подход ioctl, но он выполняет пассивное сканирование (и я получаю новую информацию только раз в две минуты в своей сети)[UPDATE1: Спасибо @fluter, я знаю, что WEXT тоже может выполнять активное сканирование.]. Я обнаружил, что iw выполняет активное сканирование, и это то, что мне нужно. Итак, мой вопрос:

Есть ли способ использовать код iw в моем собственном приложении без разбора его исходного кода по частям, или, может быть, для этой цели есть беспроводной API?

(ОБНОВЛЕНИЕ1: с основными примерами кода для начала.)

Похожий вопрос

ОБНОВЛЕНИЕ 2: я просмотрел свою задачу и обнаружил, что информации о точке доступа мне недостаточно, мне также нужно собирать данные о клиентах. Это приводит меня к перехвату пакетов Wi-Fi, и лучший инструмент, который я нашел для этого, — Horst. Итак, сейчас я пытаюсь повторно использовать его код в своем приложении.


person diabolusss    schedule 21.04.2016    source источник
comment
Если iw делает то, что вам нужно, почему бы просто не вызвать его?   -  person Wei Shen    schedule 21.04.2016
comment
Вы хотите вызвать это из моего кода? Я не знаю, хорошая ли это идея, но я готов услышать аргументы в ее пользу. И если есть возможность выполнить мою задачу чистым способом, я предпочитаю искать ее.   -  person diabolusss    schedule 21.04.2016
comment
да. Не могли бы вы подробнее рассказать о желаемом результате? Например, какую структуру данных хранить, или просто текст для последующего анализа и т. д.   -  person Wei Shen    schedule 22.04.2016
comment
основные данные, которые мне нужны, это mac, essid, signal_strength и шум, канал, last_seen. я полагаю временно сохранить его в структуре (коде) для целей обработки, как это делается в WEXT и любой другой программе. Возможно, я буду хранить эти данные вместе с обработанными в файле, но это не основная цель.   -  person diabolusss    schedule 22.04.2016


Ответы (2)


Вы можете начать с cfg80211.

cfg80211 заменяет Wireless-Extensions, и предлагается следующее:

Все новые беспроводные драйверы Linux должны быть написаны с прицелом либо на cfg80211 для устройств fullmac, либо на mac80211 для устройств softmac.

Так же написано:

Вместо того, чтобы писать wext ioctl, вы теперь пишете обратные вызовы операций cfg80211 и заполняете структуру wiphy, чтобы указать cfg80211 его возможности устройства.

Чтобы начать активное сканирование, начните здесь

person sjsam    schedule 21.04.2016
comment
Спасибо, что указали мне правильное направление. Я проверю это. - person diabolusss; 21.04.2016

Вы можете использовать wext API, предоставляемый ядром, в основном, вызывать ioctl с SIOCSIWSCAN и получать отсканированный результат с SIOCGIWSCAN. Вы можете установить сканирование всех с помощью флага IW_SCAN_ALL_ESSID и выбрать тип сканирования с помощью флага IW_SCAN_TYPE_ACTIVE или IW_SCAN_TYPE_PASSIVE.

person fluter    schedule 21.04.2016
comment
хорошо, я пропустил этот флаг. Спасибо! - person diabolusss; 21.04.2016
comment
поставил этот флаг на запрос и ничего не изменилось - только пассивное сканирование. я что-то пропустил? - person diabolusss; 22.04.2016
comment
@diabolusss опубликуйте свой код для проверки. - person fluter; 22.04.2016
comment
на самом деле я не прав, извините. я снова проверил эти флаги, используя другой код, и это сработало! - person diabolusss; 22.04.2016
comment
@diabolusss хорошо, рад узнать, что это работает. - person fluter; 22.04.2016