据我了解,只需将wpa_ctrl.c链接到一个外部程序中,然后您就可以使用它的功能来控制和接收来自wpa_supplicant的信息。
有人可以提供一个示例,最好是用C++编写的示例:
我是嵌入式Linux平台上的编码新手,任何地方都没有这样的示例。提前谢谢了!
最佳答案
程序 wpa_cli
正是您想要的示例。 wpa_supplicant项目支持V=1
选项,以查看创建此可执行文件所需的内容。这是我的ARM构建的结果,
gcc -c -o wpa_cli.o -MMD -O2 -Wall -g -I src -I src/utils \
-Iusr_ARM/include/libnl3 \
-DCONFIG_BACKEND_FILE -DCONFIG_IEEE80211W -DCONFIG_DRIVER_WEXT \
-DCONFIG_WIRELESS_EXTENSION -DCONFIG_DRIVER_NL80211 -DCONFIG_LIBNL20 \
-DEAP_PSK -DIEEE8021X_EAPOL -DCONFIG_SHA256 -DCONFIG_CTRL_IFACE \
-DCONFIG_CTRL_IFACE_UNIX -DCONFIG_SME \
wpa_cli.c
gcc -o wpa_cli wpa_cli.o ../src/common/wpa_ctrl.o ../src/utils/wpa_debug.o \
../src/utils/common.o ../src/utils/os_unix.o ../src/utils/eloop.o \
../src/utils/edit_simple.o -lrt
替换路径以获取目标ARM设备上使用的wpa_supplicant版本的 header (在第一个命令中)。链接到第二个命令中列出的所有目标文件,并链接到实时库(使用
-lrt
)。您还可以查看wpa_supplicant版本的wpa_cli.c,以获取有关如何向请求者进程发送命令的示例。对象列表包括wpa_ctrl.o(您猜到了)和许多其他对象。根据您所使用的功能,可能不需要其中的一些,但是我将以完整的列表开始,然后在您有可用的示例后对它们进行修整。
许可证是此源上的慷慨BSD。
这是wpa_cli_cmd_scan(),它发送扫描请求,
static int wpa_cli_cmd_scan(struct wpa_ctrl *ctrl, int argc, char *argv[])
{
return wpa_cli_cmd(ctrl, "SCAN", 0, argc, argv);
}
您可能还需要
scan_results
;它与wpa_cli_cmd_scan_results()
在同一文件中。该API也是well documented under wpa_supplicant control interface,您可以在其中扩展您的工作示例。确保获取的源与系统上使用的wpa_supplicant版本匹配。上面的命令用于eglibc Linux系统。看起来仿生(Android库)默认提供
-lrt
。如果您可以在设备的内部版本的wpa_supplicant目录中运行命令rm wpa_cli.o; rm wpa_cli; make V=1
,则将看到所需的确切命令。您可能不需要edit_simple.o文件。但是,完成扫描请求后,很可能需要eloop来从驱动程序获取未经请求的事件。至少如果您想使用许多不同的Wifi芯片。步骤是,
SCAN
。 SCAN_RESULTS
。 关于c++ - 编写外部程序以与C++中的wpa_supplicant接口(interface),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23250080/