Linux Wireless编程

Hyacinthus_M 发布于 2013/04/15 12:13
阅读 1K+
收藏 0

## 有无线开发知识的请进 ##

 - 最近,公司要求我个人开发一个客户程序。其功能如下:

  1.   可以SCAN无线网络的基本信息,如ESSID,信号强度,是否加密以及加密方法等。
  2.   根据扫描到的网络信息的ESSID选择目标网络,还可以手动输入ESSID进行网络连接。
  3.   若目标网络加密,还需要输入密码。
  4.   还需要可以配置无线网络。


 - 因为我没有无线网络开发的经验,不熟悉WIFI开发的相关API接口,所以就想让大家给点思路。目前

 - 我是准备修改wireless-tools的代码,来完成我的工作,但其代码量有点大,我也不知道一周内是否

 - 可以完成工作。

 - 不知道这种方法是否可行? 

 - 希望大家给点建议。


 - 已经开始改wireless-tools的源码了。笨鸟还是第一次修改这么多的代码。吱吱,好像有点挑战呀,我

 - 喜欢。

加载中
0
mallon
mallon
一般都是调用现成的命令,解析命令输出
mallon
mallon
回复 @Hyacinthus_M : 几乎所有编程语言都有执行命令获取输出的方法的,获取完之后,按行正则表达式匹配提取信息即可
Hyacinthus_M
Hyacinthus_M
回复 @Mallon : 那你能给点这方面解析的资料吗?我的GREP等用得不好,首先得有思路了,不然我会觉得还没有改代码来得可行。
Hyacinthus_M
Hyacinthus_M
回复 @Mallon : 意思是先iwlist eth0 scan | grep "Target"吗,那怎么样设置密码呢?在这方面我很迷惑
mallon
mallon
回复 @Hyacinthus_M : 你在程序里调用命令行,Linux下基本就是这个套路
Hyacinthus_M
Hyacinthus_M
可是要求是写程序。 这个程序是面对客户的,我总不能要求客户还能用命令行吧。我只想知道有没有代码量小点的方法。
0
Hyacinthus_M
Hyacinthus_M

是这样的。我开始的时候也想过通过用system调用通过shell的工具来完成任务,可是shell功底有些不足。 我所需要的只是iwlist eth0 scan 结果中的ESSID, TXPOWER,还有就是加密相关的内容。 而又要求将这些内容以每个网络块的方式输出,而通过grep 后,所有的相同的项都在一起了。 那么要通过样才能实现我的需求呢,shell我真的很基本。

0
mallon
mallon

引用来自“Hyacinthus_M”的答案

是这样的。我开始的时候也想过通过用system调用通过shell的工具来完成任务,可是shell功底有些不足。 我所需要的只是iwlist eth0 scan 结果中的ESSID, TXPOWER,还有就是加密相关的内容。 而又要求将这些内容以每个网络块的方式输出,而通过grep 后,所有的相同的项都在一起了。 那么要通过样才能实现我的需求呢,shell我真的很基本。

shell作为程序设计语言功能太弱了,上perl python吧,推荐后者,呵呵
mallon
mallon
回复 @Hyacinthus_M : 纯C麻烦,我没研究过...
Hyacinthus_M
Hyacinthus_M
这个程序只能C做,纯的。python,呵呵。说重点好吗,
0
mallon
mallon
grep是shell用的,其它语言都内置正则模块的
0
0
txgcwm
txgcwm

按照楼主的描述,我猜公司是让你在一个嵌入式设备上实现该功能吧。

wireless-tools需要跟底层的硬件配合使用,它本身无非就是通过socket从内核获取到信息。设备的wifi驱动也是你们自己搞的?如果从驱动着手的话,可能还更简单点。方便的话,可以说一下你们所使用的平台。

Hyacinthus_M
Hyacinthus_M
我也是刚去上班不久的,对硬件了解也少,驱动好像不是他们写的。 我已经改了不少了,这个星期应该能完成吧。 iw_get_ext()这个接口?
0
Hyacinthus_M
Hyacinthus_M
是用的baspberrypi的。系统基本和debian的一样。只是只有基本的一些功能。
Hyacinthus_M
Hyacinthus_M
回复 @txgcwm : 大哥。真是谢谢你啊。 我真的很需要这样的交流。 你也早点睡啊。我先睡了。
Hyacinthus_M
Hyacinthus_M
回复 @Hyacinthus_M : 大哥。真是谢谢你啊。 我真的很需要这样的交流。 你也早点睡啊。我先睡了。
Hyacinthus_M
Hyacinthus_M
回复 @txgcwm : 你好。我对你说的“楼主可以使用fopen来执行“iwlist eth0 scan”指令,将获取到的结果逐个解析出来”的意思不是太理解? 是先将结果定向到一个文件中,然后再解析? 好像你不是这个意思啊,有些地方我不是很懂,可以请你说具体点吗
Hyacinthus_M
Hyacinthus_M
回复 @txgcwm : 是啊,我也想通过调用system()来运行iwlist eth0 scan来做,然后解析输出,包括无线网络的配置,同样也可以用同样的方法来做,但是我的问题出在解析部分。 希望你给点具体点的建议。
txgcwm
txgcwm
如果是那样的话,预计你执行那些指令是没有多少问题的。 楼主可以使用fopen来执行“iwlist eth0 scan”指令,将获取到的结果逐个解析出来(这样比你修改代码好多了,字符串解析应该相对简单一些嘛)。
0
Hyacinthus_M
Hyacinthus_M

引用来自“txgcwm”的答案

按照楼主的描述,我猜公司是让你在一个嵌入式设备上实现该功能吧。

wireless-tools需要跟底层的硬件配合使用,它本身无非就是通过socket从内核获取到信息。设备的wifi驱动也是你们自己搞的?如果从驱动着手的话,可能还更简单点。方便的话,可以说一下你们所使用的平台。

是的呢。我不是科班出身的,一直在自己摸索,有很多东西都不太懂,很多时候都是在用笨方法来解决。      开始的时候,我的确是想用SHELL来实现的,然后解析。但是我的头说要用程序写,

开始真是一点头绪都没有,我只能想到去修改wireless-tools的源程序了。 我觉得自己可以解决的。 不过,还是希望你能给点建议。

tutuhu
tutuhu
楼主,现在这个问题肯定解决了吧!能不能分享一下最后的结果啊?我现在也遇到了和你同样的问题,可是我没有楼主那么厉害,可以直接更改源代码。能不能帮一下小弟,谢谢先!!!
Hyacinthus_M
Hyacinthus_M
回复 @txgcwm : 你好,我已经使用解析的方法完成了基本功能。最近在使用基于wireless.h,iwlib.h iwlib.c三个文件(丢弃iwlist.c iwconfig.c)来重写该程序,在main.c中,包括了#include "iwlib.h", 并且在iwlib.h声明了所有的函数原型,所有的函数实现均在iwlib.c中,
Hyacinthus_M
Hyacinthus_M
回复 @txgcwm : 恩。我已经在baspberrypi的板子上运行过wireless-tools的工具了,iwlist scan结果正常。
Hyacinthus_M
Hyacinthus_M
回复 @txgcwm : 比如,把scan的结果定向到一个文件中,然后再通过字符串的操作来实现,还是scan | grep 的方法来实现呢? 后者我不太熟悉,我的功底还没能满足需求,但是前者,对多个关健字的解析方面的算法实现,思路不是很明确。
txgcwm
txgcwm
回复 @Hyacinthus_M : 而且我建议你将这个工具在没有修改前先编译进去,看看是否能够输出你想要的数据(没有的话可能底层不支持,那样的话你上层改了也没有用)。
下一页
0
txgcwm
txgcwm
#include <sys/wait.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <stdio.h>


#define MAXLINE 1024

int main(int argc, char **argv)
{
	char buf[MAXLINE];
	int rc = 0; 
	FILE *fp = NULL;

	fp = popen("iwlist wlan0 scan", "r");
	if(fp == NULL) {
		perror("popen error!");
		return -1;
	}

	while(fgets(buf, MAXLINE, fp) != NULL) {
		int len = strlen(buf);
		if(buf[len-1] == '\n')
			buf[len-1] = '\0';
		printf("%s\r\n", buf);
	}

	if((rc = pclose(fp)) < 0) {
		perror("pclose error!");
		return -1;
	} 

	return 0;
}
Hyacinthus_M
Hyacinthus_M
回复 @txgcwm : 但是在主函数中,调用相关函数经常出现“undefined reference to”的错误,这些错误我有些不能理解。我在网上也看了一些相关的资料,但是是没能解决,希望你给点建议。
txgcwm
txgcwm
回复 @Hyacinthus_M : 给你一个大概的思路: 1、从数据上看,每个wifi信息都是以cell开头的,以此为标记; 2、使用isspace函数将前面的所有空格清除; 3、通过strcmp对比你要获取的数据项,然后将其后的数据保存。 你自己尝试解析,后续有问题,下班了再说。
Hyacinthus_M
Hyacinthus_M
回复 @txgcwm : 就是。我觉得他个人有点偏执。同样是用上层。他是把这个任务交给我的。我的公司小,只有十个人,其中几个还是实习的。我先用解析的方法做出来,如果有什么不懂的,还要请教你啊。 对了,设置关键字字符串数组,每一行一行的解析,是不是用strstr()简单来对每一行的内容与关键字进行配对来过滤内容就可以了?
txgcwm
txgcwm
回复 @Hyacinthus_M : 这个我也不太清楚哪里有这些资料,你自己去找找吧。无论你是去修改wireless tools还是按照解析输出数据的方法,也只是上层应用。如果要从内核的层次去了解这些东西,预计你一周的时间根本不够。 不太清楚你的主管需要你用什么样的方法实现?他固执的要用自己的方法(他自身是否对这些可能用到的方法作过分析?),他自己为什么不去实现。
Hyacinthus_M
Hyacinthus_M
回复 @txgcwm : 我把自己的想法和他说了,他还是让我熟悉底层的API(意思还是让我去修改wireless-tools)。先把用这个实现方法做出来吧。用wireless-tools修改程序的方法,和解析输出的方法没有本质区别吧。 对了,基于无线网络开发的API在哪能找到资料?难道要去看kernel?
下一页
返回顶部
顶部