程序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 版本的 headers(在第一个命令中)。链接第二个命令中列出的所有 object 文件,并链接 real-time 库(使用-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。如果您可以运行命令,rm wpa_cli.o; rm wpa_cli; make V=1 在您的设备构建的 wpa_supplicant 目录中,您将看到所需的确切命令。
您可能不需要 edit_simple.o 文件。但是,当扫描请求完成时,可能需要 eloop 从驱动程序获取未经请求的事件;至少如果您想使用许多不同的 Wifi 芯片。步骤是,
- 发送
SCAN。
- 等待。
- 发送
SCAN_RESULTS。