据我了解,只需将wpa_ctrl.c链接到一个外部程序中,然后您就可以使用它的功能来控制和接收来自wpa_supplicant的信息。

有人可以提供一个示例,最好是用C++编写的示例:

  • 将外部程序链接到wpa_ctrl.c文件。
  • 代码执行“扫描”然后打印“scan_results”的样子。

  • 我是嵌入式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/

    10-13 08:11