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

38
我想获取可用的无线网络列表。理想情况下,这应该通过一些C调用来实现,但如果我必须通过系统调用来解决问题,我也不介意。如果所需的C调用或程序不需要某些奇特的第三方软件包,那就更好了。
互联网似乎建议我使用sudo iwlist <interface> scan,从命令行来看,这似乎能解决问题,但我宁愿不要求root权限。我只想看到基本信息,不想做任何更改。

3
运行 iwlist 不需要 root 权限,但它只会报告上次定期扫描的缓存值。如果要强制进行新的扫描,则需要拥有 root 权限。 - Hudson
嗯,在非root用户下运行时,它好像什么也没有返回,在Ubuntu 8.04上至少是这样的 :-/ - richq
3个回答

41

在命令行中进行扫描非常容易。在这里,man页面是您的朋友(查看iwconfig和iwlist)。但是使用C接口要困难一些,所以我会重点关注这个。

首先,像其他人提到的那样,一定要下载无线工具源代码。编程接口的所有文档都在.c文件中。据我所知,没有网络文档可用于API。然而,源代码很容易阅读。对于此问题,您几乎只需要iwlib.h和iwlib.c。

虽然您可以使用iw_set_ext和iw_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 源代码!


你能否使用这种方法获取AP地址(MAC地址)? 怎么做?谢谢 :) - bubbly
我使用以下代码获取MAC地址:result->ap_addr,但它不是可打印的格式。它会输出类似于71732的内容。 - bubbly
iwconfig 以通常的格式打印出访问点。请查看 iwconfig.c 命令的源代码(搜索“Access Point”)。 - David Matlack
@DavidMatlack,列表中的第一个是我当前连接的吗? - Didac Perez Parera
@DavidMatlack,许可证是什么? - Pacerier
显示剩余3条评论

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

至于权限,我想这个过程需要以 root 身份运行才能执行扫描。如果有其他方式执行扫描,我很乐意了解。

由于您正在使用 Ubuntu 8.04,因此libiw-dev包应该有用。


我能在商业应用程序中使用Wireless Tool包(libiw-dev)吗?可能我不能,但我想确保一下。 - rraszewski

3
您可以使用nmcli,它不需要root权限或WIFI接口的名称。
nmcli -t -f ssid dev wifi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接