2008-12-30 154 views
31

我想获得可用无线网络的列表。理想情况下,这将通过一些C调用,但我不介意是否必须通过系统调用来修改它。如果所需的C调用或程序不需要一些奇特的第三方软件包,那更好。如何获得Linux上的可用无线网络列表?

互联网似乎暗示我使用sudo iwlist <interface> scan似乎从命令行做伎俩,但我宁愿不需要root权限。我只想看到基础知识,不会改变任何事情。

+2

您不需要root就可以运行iwlist,但它只会报告上次定期扫描的缓存值。要强制进行新的扫描,您需要成为root用户。 – Hudson 2008-12-30 15:02:16

+0

嗯,当运行非root用户时,至少在Ubuntu 8上不会返回任何内容。04: -/ – richq 2008-12-30 15:21:55

回答

26

Wireless Tools包 - 其中iwlist是一部分 - 也包含无线工具助手库。您需要包含iwlib.h并链接到libiw.a(即添加-liw)。然后查找iw_set_ext函数的文档。参数将是最常用的。有关如何使用此接口的示例,请查看KDE库中的KWifiManager源代码(请参阅:Interface_wireless_wirelessextensions::get_available_networks方法)。或者,您也可以下载Wireless Tools source code并查看iwlist.c中iwlset iw_set_ext函数是如何用于扫描的。

至于特权,我想过程将需要以root身份运行以执行扫描。我很想知道这是否可以以其他方式完成。

由于您使用的是Ubuntu 8.04,因此应该使用libiw-dev软件包。

+0

我可以在商业应用程序中使用** Wirelsess Tool **包(** libiw-dev **)吗?可能我不能,但我想确定。 – rraszewski 2014-09-04 10:11:32

35

在命令行中执行扫描非常简单。手册页是你的朋友在这里(检查出iwconfigiwlist)。但是使用C接口有点困难,所以我会专注于此。

首先,正如其他人所提到的,绝对要下载出wireless tools source code。编程接口的所有文档位于.c文件中。据我所知,这个API没有web文档。但是,源代码很容易阅读。你几乎只需要iwlib.hiwlib.c这个问题。

虽然你可以使用iw_set_extiw_get_ext,在libiw实现基本的扫描功能iw_scan,从中可以提取大部分是你所需要的信息。

这是一个简单的程序来获取所有可用无线网络的ESSID。编译-liw并运行sudo

#include <stdio.h> 
#include <time.h> 
#include <iwlib.h> 

int main(void) { 
    wireless_scan_head head; 
    wireless_scan *result; 
    iwrange range; 
    int sock; 

    /* Open socket to kernel */ 
    sock = iw_sockets_open(); 

    /* Get some metadata to use for scanning */ 
    if (iw_get_range_info(sock, "wlan0", &range) < 0) { 
    printf("Error during iw_get_range_info. Aborting.\n"); 
    exit(2); 
    } 

    /* Perform the scan */ 
    if (iw_scan(sock, "wlan0", range.we_version_compiled, &head) < 0) { 
    printf("Error during iw_scan. Aborting.\n"); 
    exit(2); 
    } 

    /* Traverse the results */ 
    result = head.result; 
    while (NULL != result) { 
    printf("%s\n", result->b.essid); 
    result = result->next; 
    } 

    exit(0); 
} 

免责声明:这只是一个演示程序。某些结果可能没有essid。另外,这假设你的无线接口是“wlan0”。你明白了。

阅读iwlib源代码!

相关问题