使用C开始使用wpa_supplicant

时间:2016-07-06 02:17:25

标签: c linux wpa-supplicant

在人们跳到结论说这是一个重复的帖子之前,我想指出我已经完成了关于这个主题的其他帖子,但实际上还没有找到解决方案。

我需要什么

我的目标是从C程序访问wpa_supplicant以执行以下操作:

  1. 查看有效连接
  2. 检测接口何时关闭
  3. 连接到AP /设置AP等
  4. 我发现了什么

    • 如果我需要编写一个与wpa_supplicant进行通信的C程序,我不需要DBus
    • 我可以通过在项目目录中包含这些文件来使用wpa_ctrl.h中的函数
    • 以下是我发现的与此问题相关的一些链接。 123
    • 我还浏览了使用wpa_ctrl.c
    • 讨论外部程序的official documentation

    为什么以上并没有真正解决问题

    • 我在SO和其他相关网站上发现的关于此问题的大多数帖子都指向官方文档这样的资源,这些资源很好但不能解决问题
    • 在很多这些帖子中,人们已放弃追求或已制定出解决方案,但尚未在网上发布。
    • 对于本主题的新手,如果可以发布一个工作示例 - wpa_supplicant的'hello world',将会很有帮助。

    到目前为止我做了什么

    • this链接,我将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:更正了拼写错误并添加了构建日志

2 个答案:

答案 0 :(得分:2)

好的,所以我可以在树莓派上使用它。一切归功于树莓派论坛上的Gyph(链接:https://www.raspberrypi.org/forums/viewtopic.php?t=42949)。

需要的文件

in wpa_supplicant/src/common : 
wpa_ctrl.h 
wpa_ctrl.c


in wpa_supplicant/src/utils : 
build_config.h 
common.h 
includes.h 
os.h 
os_unix.c 
wpabuf.h 
wpa_debug.h
your own file

运行以下命令进行编译:

gcc -Wall -Wextra -I ./ -MMD -c -g -o wpa_ctrl.o wpa_ctrl.c -D CONFIG_CTRL_IFACE -D CONFIG_CTRL_IFACE_UNIX
gcc -Wall -Wextra -I ./ -MMD -c -g -o os_unix.o os_unix.c -D CONFIG_CTRL_IFACE -D CONFIG_CTRL_IFACE_UNIX
gcc -Wall -Wextra -o your_file your_file.c os_unix.o wpa_ctrol.o

要使用wpa_supplicant,我发现仅复制hostapd_cli并根据需要进行调整是最容易的。请注意,如果使用wpa_supplicant而不使用hostapd,则必须调整ctrl_iface_dir变量。 (对我来说是“ / var / run / wpa_supplicant”)。

答案 1 :(得分:1)

  

未定义对`wpa_ctrl_open&#39;

的引用

这是一个链接器错误。如果是命令,

$ nm wpa_ctrl.o

显示它定义了 wpa_ctrl_open ,那么您的直接问题可能只是命令行顺序。试试:

gcc -o main hostapd_cli.o wpa_ctrl.o -lpthread

因为hostapd_cli引用wpa_ctrl.o中的符号。否则,您需要找到定义该符号的源代码,以便链接到该符号。

修改:显然您需要define a couple of symbols

HTH。