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