在人们得出结论说这是一个重复的帖子之前,我想指出我已经浏览了关于这个主题的其他帖子,但真的没有找到解决方案。
我需要的
我的目标是从 C 程序访问 wpa_supplicant 以执行以下操作:
- 查看活动连接
- 检测接口何时关闭
- 连接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.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; }
生成文件
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:更正错字并添加构建日志