Начало работы с wpa_supplicant с использованием C
Прежде чем люди придут к выводу, что это дублирующий пост, я хотел бы отметить, что я просмотрел другие посты на эту тему, но на самом деле не нашел решения.
Что мне нужно
Моя цель - получить доступ к wpa_supplicant из программы на C, чтобы сделать следующее:
- Смотрите активные соединения
- Определить, когда интерфейсы выходят из строя
- Подключение к точке доступа / Настройка точки доступа и т. Д.
Что я узнал
- Мне не нужен DBus, если мне нужно написать программу на C для связи с wpa_supplicant
- Я могу использовать функции в
wpa_ctrl.h
просто включив эти файлы в мой каталог проекта - Вот некоторые ссылки, которые я нашел, связанные с этим вопросом. 1, 2, 3
- Я также просмотрел официальную документацию, в которой говорится о внешних программах, использующих
wpa_ctrl.c
Почему вышесказанное на самом деле не решает проблему
- Большинство постов, которые я нашел на SO и других связанных сайтах по этой проблеме, указывают на такие ресурсы, как официальная документация, которая хороша, но не решает проблему
- Во многих из этих сообщений люди перестали заниматься этим или разработали решение, но не опубликовали его в Интернете.
- Для новичка в этой теме будет полезно, если вы сможете опубликовать рабочий пример - "привет мир" wpa_supplicant.
Что я сделал до сих пор
По этой ссылке я скопировал
wpa_supplicant-2.5/src/common/wpa_ctrl.h
вwpa_supplicant-2.5/src/utils
каталог (сcommon.h
было много зависимостей). Затем я написал простую программу на Chostapd_cli.c
в том же каталоге, который показан ниже. Я получаю неопределенную ссылку на ошибку wpa_ctrl_open#include "includes.h" #include <dirent.h> #include "wpa_ctrl.h" #include "common.h" static struct wpa_ctrl *ctrl_conn; static int hostapd_cli_quit = 0; static int hostapd_cli_attached = 0; static const char *ctrl_iface_dir = "/var/run/wpa_supplicant"; static char *ctrl_ifname = NULL; static int ping_interval = 5; int main() { ctrl_conn = wpa_ctrl_open(ctrl_iface_dir); if (!ctrl_conn){ printf("Could not get ctrl interface!\n"); return -1; } return 0; }
Makefile
C=gcc
CFLAGS=-lpthread
DEPS = includes.h wpa_ctrl.h common.h
OBJ = wpa_ctrl.o hostapd_cli.o
%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
main: $(OBJ)
gcc -o $@ $^ $(CFLAGS)
.PHONY: clean
clean:
rm -f *.o *~ core $(INCDIR)/*~
Журнал сборки
gcc -o main wpa_ctrl.o hostapd_cli.o -lpthread
hostapd_cli.o: In function `main':
hostapd_cli.c:(.text+0xf): undefined reference to `wpa_ctrl_open'
collect2: error: ld returned 1 exit status
Makefile:10: recipe for target 'main' failed
make: *** [main] Error 1
Там не так много материала о том, как использовать эти файлы и интегрировать их во внешний проект или как скомпилировать его, и я вроде как не знаю. Любая помощь о том, как поступить, будет очень признательна.
Редактировать 1: исправлена опечатка и добавлен журнал сборки
1 ответ
Этот ответ приходит слишком поздно для OP, чтобы найти его полезным, но, возможно, он поможет другим, кто наткнется на эту же проблему.
В wpa_supplicant-2.9 вам не нужно компилировать wpa_ctrl.c
с вашими собственными исходными файлами. Вместо этого сначала создайтеlibwpa_client.so
(или libwpa_client.a
) из источников wpa_supplicant: $make -C wpa_supplicant libwpa_client.so
Затем свяжите общие библиотеки для создания собственной программы. Вам также нужно будет добавить пути включения. Например)$gcc main.c -Iwpa_supplicant-2.9/src/common -I.wpa_supplicant2-9/src/utils -lwpa_client
Хорошо, так что я заставил его работать на моем малиновом пи. Вся заслуга Gyph на форумах raspberry pi (ссылка: https://www.raspberrypi.org/forums/viewtopic.php?t=42949).
Необходимые файлы
in wpa_supplicant/src/common :
wpa_ctrl.h
wpa_ctrl.c
in wpa_supplicant/src/utils :
build_config.h
common.h
includes.h
os.h
os_unix.c
wpabuf.h
wpa_debug.h
your own file
Выполните следующие команды для компиляции:
gcc -Wall -Wextra -I ./ -MMD -c -g -o wpa_ctrl.o wpa_ctrl.c -D CONFIG_CTRL_IFACE -D CONFIG_CTRL_IFACE_UNIX
gcc -Wall -Wextra -I ./ -MMD -c -g -o os_unix.o os_unix.c -D CONFIG_CTRL_IFACE -D CONFIG_CTRL_IFACE_UNIX
gcc -Wall -Wextra -o your_file your_file.c os_unix.o wpa_ctrol.o
Для работы с wpa_supplicant я обнаружил, что проще всего просто скопировать hostapd_cli и настроить его под свои нужды. Обратите внимание, что если вы используете wpa_supplicant, а не hostapd, вам придется настроить переменную ctrl_iface_dir. (Для меня это " /var/run/wpa_supplicant").
неопределенная ссылка на `wpa_ctrl_open'
Это ошибка компоновщика. Если команда,
$ nm wpa_ctrl.o
показывает, что он определяет wpa_ctrl_open, тогда вашей непосредственной проблемой может быть просто порядок командной строки. Пытаться:
gcc -o main hostapd_cli.o wpa_ctrl.o -lpthread
так как hostapd_cli
ссылки на символы в wpa_ctrl.o
, В противном случае вам нужно найти исходный код, который определяет этот символ, чтобы вы могли ссылаться на него.
Редактировать: очевидно, вам нужно определить пару символов.
НТН.