如何在Linux上获取可用无线网络列表?

时间:2008-12-30 13:23:40

标签: linux wireless

我想获得一份可用的无线网络列表。理想情况下,这将是通过一些C调用,但我不介意我是否必须通过系统调用来解决它。如果所需的C呼叫或程序不需要一些奇特的第三方包,那就更好了。

互联网似乎建议我使用sudo iwlist <interface> scan似乎从命令行中做了这个技巧,但我宁愿不要求root权限。我只想看到基础知识,而不是改变任何东西。

3 个答案:

答案 0 :(得分:35)

在命令行中进行扫描非常容易。手册页是您的朋友(请查看 iwconfig iwlist )。但是使用C接口要困难得多,所以我会专注于此。

首先,正如其他人提到的那样,绝对要下载wireless tools source code。编程接口的所有文档都在 .c 文件中。据我所知,api没有web文档。但是,源代码很容易阅读。对于这个问题,你几乎只需要 iwlib.h iwlib.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 源代码!

答案 1 :(得分:26)

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

至于权限,我想这个过程需要以root身份运行才能执行扫描。我很想知道是否可以这样做。

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

答案 2 :(得分:0)

您可以使用nmcli,它不需要root权限或WIFI接口名称。

nmcli -t -f ssid dev wifi