5

在人们得出结论说这是一个重复的帖子之前,我想指出我已经浏览了关于这个主题的其他帖子,但真的没有找到解决方案。


我需要的

我的目标是从 C 程序访问 wpa_supplicant 以执行以下操作:

  1. 查看活动连接
  2. 检测接口何时关闭
  3. 连接AP/设置AP等

我发现了什么

  • 如果我需要编写一个 C 程序来与 wpa_supplicant 通信,我不需要 DBus
  • 我可以通过将wpa_ctrl.h这些文件包含在我的项目目录中来使用其中的功能
  • 以下是我发现的与此问题相关的一些链接。1、2、3 _ _ _ _
  • 我还浏览了有关使用外部程序的官方文档wpa_ctrl.c

为什么上面并没有真正解决问题

  • 我在 SO 和其他相关网站上找到的有关此问题的大多数帖子都指向官方文档之类的资源,这些资源很好但不能解决问题
  • 在很多这样的帖子中,人们已经放弃了这一点,或者已经制定了解决方案,但还没有在网上发布。
  • 对于本主题的新手来说,如果可以发布一个工作示例——wpa_supplicant 的“hello world”,将会很有帮助。

到目前为止我所做的

  • 这个链接,我复制 wpa_supplicant-2.5/src/common/wpa_ctrl.hwpa_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;
    }
    

生成文件

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:更正错字并添加构建日志

4

3 回答 3

6

对于 OP 来说,这个答案来得太晚了,但它可能会帮助其他遇到同样问题的人。

在 wpa_supplicant-2.9 中,您不需要wpa_ctrl.c使用自己的源文件进行编译。相反,首先从 wpa_supplicant 源构建libwpa_client.so(或):libwpa_client.a$make -C wpa_supplicant libwpa_client.so

然后,将共享库链接到构建您自己的程序。您还需要添加包含路径。例如)$gcc main.c -Iwpa_supplicant-2.9/src/common -I.wpa_supplicant2-9/src/utils -lwpa_client

于 2020-08-24T02:09:37.613 回答
3

好的,所以我让它在我的树莓派上工作。所有功劳归于树莓派论坛上的 Gyph(链接: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”)。

于 2020-10-08T08:46:15.360 回答
3

未定义对“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. 否则,您需要找到定义该符号的源代码,以便链接到它。

编辑:显然你需要定义几个符号

HTH。

于 2016-07-06T18:22:51.650 回答