获得WIFI信号强度 - 寻求最佳方式(IOCTL,iwlist(iw)等)

时间:2014-08-17 15:47:06

标签: linux wifi ioctl ssid iwconfig

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

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

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

*甚至太强大,因为我没能编译我用它写的任何程序

1 个答案:

答案 0 :(得分:9)

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

根据无线网卡的设计,扫描由无线网卡执行,驱动程序提供很多或很少的“帮助”。有些卡(芯片组,更具体)有自己的处理器,并独立于主机运行自己的固件代码。另一方面,有一些“愚蠢”的卡片,主机上的驱动程序可以完成大部分工作。

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

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

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

关于ioctl()的问题:这是Unix操作系统中用户空间和内核空间之间通信的通用方法。旧的Wireless Extensions API使用ioctl()。较新的cfg80211 API不使用基于ioctl()的界面,而是使用nl80211代替。

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

关于您所需的扫描间隔,我会说300毫秒相当短。这是因为对于有用的扫描,客户端需要在短时间内离开其当前频道,切换到另一个频道并收听来自该频道上其他接入点的信号。由于离开其通道会中断通信,因此这些非通道时间通常会保持较短并且不经常执行。

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