如果您想确定未连接的 WLAN 接入点的信号强度,扫描是正确的方法。
扫描由无线网卡执行,驱动程序有多少“帮助”,具体取决于无线网卡的设计。有些卡(更具体地说是芯片组)具有自己的处理器并独立于主机运行自己的固件代码。另一方面,有一些“愚蠢”的卡,主机上的驱动程序在其中完成了大部分工作。
在驱动程序和操作系统的其余部分之间,有一个接口 (API),用于向驱动程序发送命令并以标准化的方式读回信息。对于 Linux,至少有两种不同的 API。较旧的名为Wireless Extensions,较新的名为cfg80211。通常,驱动程序仅支持其中一种 API。大多数当前驱动程序使用 cfg80211,但可能有一些旧驱动程序仍使用无线扩展。
对于这两个 API 中的每一个,都有一个用户空间工具(或工具系列)可以使用它。对于无线扩展,有iwconfig
(和iwlist
等iwpriv
)对于 cfg80211,只有iw
.
因此,有关正确工具的问题取决于无线驱动程序使用的 API。为了增加混淆 ;-),cfg80211 做了一些模拟,允许您对使用较新的 cfg80211 API 的驱动程序执行一些无线扩展调用。
关于您的问题ioctl()
:这是 Unix 操作系统中用户空间和内核空间之间通信的通用方法。旧的无线扩展 API 使用ioctl()
. 较新的 cfg80211 API 不使用ioctl()
基于 - 的接口,而是使用nl80211代替。
总结一下:是使用iw
/cfg80211/nl80211 还是iwconfig
/Wireless Extensions/ioctl 取决于驱动程序或您的无线网卡。
关于您想要的扫描间隔,我会说 300ms 相当短。这是因为为了进行有用的扫描,客户端需要离开其当前频道一小段时间,切换到另一个频道并在该频道上收听来自其他接入点的信号。由于离开其频道会中断通信,因此这些离开频道的时间通常很短并且很少执行。
分别调用iw <dev> scan
oriwlist <dev> scan
不一定会导致新的扫描,但可能会返回旧的(缓存的)接入点列表。根据您的无线网卡/驱动程序,可能(不可能)强制执行新扫描。