请教:C代码基于wpa_supplicant如何编写无线连接程序

xigua1102 2012-09-13 05:45:41
加精
各位大侠好,我是一个c代码新手
目前需要制作一个无线连接程序,驱动什么的已经搞好了
目前我基于wpa_supplicant和wireless tools做了一个,感觉好像很别扭

首先,对于wpa_supplicant需要的配置文件,我使用fopen创建文件,把配置在一个字符串数组里组装好,然后fwrite到配置文件里,然后使用system执行 wpa_supplicant -B -iwlan0 -c/etc/wpa_supplicant.conf -Dwext 这样的命令来进行无线连接。

搜索过程,我就是使用system执行 iwlist ra0 scan >tmp_file,把结果写到文件里,fopen后,用ftell一句一句的分析,把需要的essid,加密方式这些参数提取出来

对于连接的情况,也是通过执行相关命令把命令结果存在文件中,然后fopen后,读出来检查。

因为没有参加太多的软件开发,所以,目前我只想了这么一个办法。

这个办法很别扭,如果完全都是正确的话,那直接就连接了,没什么问题。
但是如果wpa_supplicant命令执行错了,比如密码有问题等,没法反馈出来
特别是wep方式,密码错了,完全没有打印反馈回来的,我也没法准确的提示出连接正确还是错误。

特地来请教各位大侠,有没有更好的办法?我感觉我这个办法,那是相当的费时费力啊。。。

万分感谢了!!
...全文
11380 73 打赏 收藏 转发到动态 举报
写回复
用AI写文章
73 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdqifeng 2014-06-12
  • 打赏
  • 举报
回复
wpa_supplicant 不要放到后台执行,你将能看到足够的信息说明
  • 打赏
  • 举报
回复
很久以前弄过wpa_supplicant为基础的WINDOWS上无线管理工具代替自带的工具,可惜在升级window7之后后台服务没有注册windows签名,最终流产
CD_keanu 2013-07-31
  • 打赏
  • 举报
回复
确实只能这样了,如果用wpa_ctrl,开发工作量会比较大,还要考虑后期维护问题。 只能给lz推荐一个更好的调用shell脚本的函数,popen,可以直接捕获标准输入输出设备的信息。好处是不用建文件,直接用字符串就可以。 但见鬼的是wpa_supplicant本身的输出信息甚至调试信息无论如何都勾不到,直接命令行都勾不到,试了N多种方法都不行。没看源代码,不知道是输出到什么设备上了。 所以,只能用iw命令来查看网络连接信息了。
xigua1102 2013-04-27
  • 打赏
  • 举报
回复
引用 65 楼 beizhongshui_7100 的回复:
wpa_supplicant编译生成wpa_supplicant和wpa_cli时, 编译过程会生成每个文件的.o文件, 用ar -rsv libwpa.a wpa_supplicant.o ctrl_interface.o driver_wext.o ....就可以生成静态链接库.a。 用gcc -fPIC -shared 生成动态链接库.so。 后面的,你懂得。。。。
这中实现方式应该是可以的,安卓的无线实现其实也是这个样子的。 不过这个实现过程对我这个新手来说,不太容易,暂时还未实现。 目前采用的依然是将相关命令的结果输出到文本,然后解析文本 只是在最开始的基础上优化了一点点,响应速度稍微快一点 但是依然不是好办法。 谢谢楼上各位的回复!结贴了
小小浣熊 2013-03-27
  • 打赏
  • 举报
回复
好帖子学习了,以后学嵌入式Linux还是得学习
cooButter 2013-03-26
  • 打赏
  • 举报
回复
用系统自带的接口实现是可以的,基本都是这样,前期可以这样测试功能性,后期的时候可以修改wpa的源码,或者干脆把wpa_supplication的源码修改咯放到你的应用程序中,然后把其他的源码打包成库。
worldzhy 2013-03-21
  • 打赏
  • 举报
回复
引用 46 楼 yyttiao 的回复:
我来说一下吧..不知道你那行不行,不过应该是一样的....当你的密码啥啥的,都正确的时候,那么你建立socket之后,你可以用ioctl获取到网卡的信息,里面就有关于连接是否成功的数据,连接完成... typedef enum { WPA_DISCONNECTED, // Disconnected state WPA_INACTIVE,……
谢谢啦!
xigua1102 2013-03-13
  • 打赏
  • 举报
回复
引用 65 楼 beizhongshui_7100 的回复:
wpa_supplicant编译生成wpa_supplicant和wpa_cli时, 编译过程会生成每个文件的.o文件, 用ar -rsv libwpa.a wpa_supplicant.o ctrl_interface.o driver_wext.o ....就可以生成静态链接库.a。 用gcc -fPIC -shared 生成动态链接库.so。 后面的,你……
灰常感谢,我试试看
beizhongshui_7100 2013-03-08
  • 打赏
  • 举报
回复
wpa_supplicant编译生成wpa_supplicant和wpa_cli时, 编译过程会生成每个文件的.o文件, 用ar -rsv libwpa.a wpa_supplicant.o ctrl_interface.o driver_wext.o ....就可以生成静态链接库.a。 用gcc -fPIC -shared 生成动态链接库.so。 后面的,你懂得。。。。
beizhongshui_7100 2013-03-07
  • 打赏
  • 举报
回复
如果移植wpa_suppliacant源码困难的话,不妨试试下面官方提倡的做法: 来自于wpa_supplicant-devel文档 3、控制接口 wpa_supplicant实现了一个由外部程序使用来控制wpa_supplicant守护程序操作和得到状态信息和事件通知的控制接口。有一个单独文件的小C库wpa_ctrl.c提供辅助函数来方便使用这个控制接口。外部程序可以把这个文件链接到他们并使用wpa_ctrl.h中提供的函数来与wpa_supplicant交互。这个库也可以被C++使用。wpa_cli.c和wpa_gui 是使用这个库的实例。
xigua1102 2013-03-07
  • 打赏
  • 举报
回复
引用 63 楼 beizhongshui_7100 的回复:
如果移植wpa_suppliacant源码困难的话,不妨试试下面官方提倡的做法: 来自于wpa_supplicant-devel文档 3、控制接口 wpa_supplicant实现了一个由外部程序使用来控制wpa_supplicant守护程序操作和得到状态信息和事件通知的控制接口。有一个单独文件的小C库wpa_ctrl.c提供辅助函数来方便使用这个控制接口。外部程序可以把这个文件链接到他……
哇塞,就是这个东西,想要的就是这个。 请问一下,要使用wpa_cli.c,我需要链接什么库呢?我一直在考虑的就是,如何把wpa_supplicant编成个什么库来调用。麻烦帮忙解答下,非常感谢~~
xigua1102 2013-03-02
  • 打赏
  • 举报
回复
引用 61 楼 zoe6553 的回复:
引用 59 楼 xigua1102 的回复:这个问题目前我想到一个办法,参照安卓的无线实现部分 直接把wpa_supplicant加到代码里面,调用它的接口 不过目前还没实现成功,把wpa_supplicant放到自己的代码里面编到一起,没那么容易。。。 你觉得难点在哪?参照android的做法,你的wpa_supplicant会编成一个可执行文件,你开两个sock……
对。直接使用编好的wpa_supplicant,然后在c里面通过system的方式来执行,连接无线很容易,不方便的就是对错误的判断。我考虑的是把wpa_suppliacant源码,学着安卓那样,直接跟代码关联起来,我直接调用wpa_supplicant的接口,这样获取连接状况的情况会更准确,及时一些。想把wpa_supplicant编译成.a或者.so以我目前的经验,很难,我还在一点一点的摸索。。。
zoe6553 2013-03-01
  • 打赏
  • 举报
回复
引用 59 楼 xigua1102 的回复:
这个问题目前我想到一个办法,参照安卓的无线实现部分 直接把wpa_supplicant加到代码里面,调用它的接口 不过目前还没实现成功,把wpa_supplicant放到自己的代码里面编到一起,没那么容易。。。
你觉得难点在哪?参照android的做法,你的wpa_supplicant会编成一个可执行文件,你开两个socket一个下命令一个监控。如果你只要求使用wpa_supplicant来连接和断开wifi的话其实不难,难的是对于网络出错或者验证出错的处理。
imissdanny 2013-02-27
  • 打赏
  • 举报
回复
看不太懂,努力学习中
xigua1102 2013-02-26
  • 打赏
  • 举报
回复
这个问题目前我想到一个办法,参照安卓的无线实现部分 直接把wpa_supplicant加到代码里面,调用它的接口 不过目前还没实现成功,把wpa_supplicant放到自己的代码里面编到一起,没那么容易。。。
xigua1102 2013-02-21
  • 打赏
  • 举报
回复
有没有高手来指点一点啊
xigua1102 2013-02-21
  • 打赏
  • 举报
回复
引用 54 楼 mike001177 的回复:
我做了一套WIFI的接口,通过SOCKET与WPA_SUSPPLICANT通信,当连接后,不管成功与否,直接发STATUS给WPA_SUSPPLICANT获取状态, 然后就能判断是否连接上了。 ASSOCIATING-》ASSOCIATED-》4WAY_HANDSHAKE-》GROUP_HANDSHAKE-》COMPLETED这就是它连接过程中的状态变化过程。你如果密码失……
求教,socket如何与wpa_supplicant通信,你这个办法比较好,可以正确判断链接成功或失败
mike001177 2012-11-07
  • 打赏
  • 举报
回复
我这也遇到了些关于WIFI的问题,希望能一起讨论。QQ: 317863067
mike001177 2012-11-07
  • 打赏
  • 举报
回复
我做了一套WIFI的接口,通过SOCKET与WPA_SUSPPLICANT通信,当连接后,不管成功与否,直接发STATUS给WPA_SUSPPLICANT获取状态, 然后就能判断是否连接上了。 ASSOCIATING-》ASSOCIATED-》4WAY_HANDSHAKE-》GROUP_HANDSHAKE-》COMPLETED这就是它连接过程中的状态变化过程。你如果密码失败,在四次握手的阶段就会失败了。
simonjay2007 2012-11-07
  • 打赏
  • 举报
回复
引用 53 楼 xigua1102 的回复:
没解决呢,还在想办法。 用了一个比较临时的判断方法,一般路由器不特定设置,通过iwconfig查看ra0的状况,在连接或未连接时,mode是不一样的。 不过这个办法不好,路由器设置一下,就不行了
我开始也是这样判断的,但是不行啊,wep加密方式的话,用错误的密码去连接,Mode也是Managed,我用的办法是用dhcp去获取ip,如果连接上了,那么用udhcpc命令(我们公司设备里面的dhcp命令)去获取ip,会有如下返回: # udhcpc -i ra0 -n -q udhcpc (v1.16.1) started Sending discover... Sending select for 192.168.1.147... Lease of 192.168.1.147 obtained, lease time 7200 deleting routers route: SIOCDELRT: No such process adding dns 192.168.1.1 如果有"adding"这个字符串,就说明获取到了ip,如果没有这个字符串的话,那么就是连接失败。 这种方法的问题在于,如果路由器是wep加密方式,并且未开启dhcp服务,那么这种方法就有问题。 不过路由器既用wep加密方式又未开启dhcp的情况非常之少,也只能这样了。
加载更多回复(39)

21,595

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧