Начало работы с wpa_supplicant с использованием C

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


Что мне нужно

Моя цель - получить доступ к wpa_supplicant из программы на C, чтобы сделать следующее:

  1. Смотрите активные соединения
  2. Определить, когда интерфейсы выходят из строя
  3. Подключение к точке доступа / Настройка точки доступа и т. Д.

Что я узнал

  • Мне не нужен 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 было много зависимостей). Затем я написал простую программу на C hostapd_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, В противном случае вам нужно найти исходный код, который определяет этот символ, чтобы вы могли ссылаться на него.

Редактировать: очевидно, вам нужно определить пару символов.

НТН.

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