5

我想扫描从 3 AP 接收到的信号强度。如果这可以每 300 毫秒(最大 500 毫秒)发生一次,我会很高兴。我在路由器上刷了 OpenWRT。

我正在寻找一个好的工具来做到这一点。首先,我发现 iwconfig 有效,但仅适用于我连接的网络。所以我使用了 iwlist (iw 没用——也许我需要更新它?)。你知道它的输出有多准确吗?我可以相信它吗?

在那之后,我遇到了IOCTL。它看起来非常强大*和专业。但是从 WIFI 获取信号强度的输出是否比 iwlist/iw 之类的简单方法更可靠?

*甚至太强大了,因为我无法编译我使用它编写的任何程序

4

1 回答 1

13

如果您想确定连接的 WLAN 接入点的信号强度,扫描是正确的方法。

扫描由无线网卡执行,驱动程序有多少“帮助”,具体取决于无线网卡的设计。有些卡(更具体地说是芯片组)具有自己的处理器并独立于主机运行自己的固件代码。另一方面,有一些“愚蠢”的卡,主机上的驱动程序在其中完成了大部分工作。

在驱动程序和操作系统的其余部分之间,有一个接口 (API),用于向驱动程序发送命令并以标准化的方式读回信息。对于 Linux,至少有两种不同的 API。较旧的名为Wireless Extensions,较新的名为cfg80211。通常,驱动程序仅支持其中一种 API。大多数当前驱动程序使用 cfg80211,但可能有一些旧驱动程序仍使用无线扩展。

对于这两个 API 中的每一个,都有一个用户空间工具(或工具系列)可以使用它。对于无线扩展,有iwconfig(和iwlistiwpriv)对于 cfg80211,只有iw.

因此,有关正确工具的问题取决于无线驱动程序使用的 API。为了增加混淆 ;-),cfg80211 做了一些模拟,允许您对使用较新的 cfg80211 API 的驱动程序执行一些无线扩展调用。

关于您的问题ioctl():这是 Unix 操作系统中用户空间和内核空间之间通信的通用方法。旧的无线扩展 API 使用ioctl(). 较新的 cfg80211 API 不使用ioctl()基于 - 的接口,而是使用nl80211代替。

总结一下:是使用iw/cfg80211/nl80211 还是iwconfig/Wireless Extensions/ioctl 取决于驱动程序或您的无线网卡。

关于您想要的扫描间隔,我会说 300ms 相当短。这是因为为了进行有用的扫描,客户端需要离开其当前频道一小段时间,切换到另一个频道并在该频道上收听来自其他接入点的信号。由于离开其频道会中断通信,因此这些离开频道的时间通常很短并且很少执行。

分别调用iw <dev> scanoriwlist <dev> scan不一定会导致新的扫描,但可能会返回旧的(缓存的)接入点列表。根据您的无线网卡/驱动程序,可能(不可能)强制执行新扫描。

于 2014-09-22T17:07:50.337 回答