据我所知,可以简单地将wpa\ctrl.c链接到一个外部程序中,然后您就可以使用它的函数来控制和接收来自wpa_pplient的信息。
有人能提供一个例子吗,最好是用C++,你会怎么做:
- 将外部程序链接到wpa\ctrl.c文件
- 进行"扫描"然后打印"scan_results"的代码会是什么样子
我刚开始在嵌入式linux平台上编程,在任何地方都没有这样的例子。非常感谢!
程序wpa_cli
就是您想要的东西的一个例子。wpa_supplient项目支持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_pplient版本的标头(在第一个命令中)。链接到第二个命令中列出的所有对象文件,并链接到实时库(使用-lrt
)。您还可以查看wpa_supplient版本的wpa_li.c,以获取如何向请求方进程发送命令的示例。
对象列表包括wpa\ctrl.o(正如您所猜测的)和许多其他对象。根据您使用的功能,其中一些可能不需要,但我会从完整的列表开始,然后在您有一个功能示例后对其进行修剪。
许可证是这个源代码上慷慨的BSD。
这里是wpa_li_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
;它与CCD_ 5在同一文件中。
API在wpa_supplient控制接口下也有很好的文档,您可以在其中扩展您的工作示例。确保您获得的源代码与系统上使用的wpa_pplient的版本相匹配。上面的命令适用于eglibcLinux系统;看起来bionic(Android库)默认提供-lrt
。如果您可以运行命令rm wpa_cli.o; rm wpa_cli; make V=1
,在设备构建的wpa_supplient目录中,您将看到所需的确切命令。
您可能不需要edit_simple.o文件。然而,当扫描请求完成时,可能需要eloop来从驱动程序获取未经请求的事件;至少如果你想使用许多不同的Wifi芯片。步骤是,
- 发送
SCAN
- 等待<SCAN_COMPLETE>
- 发送
SCAN_RESULTS