获取WIFI信号强度-寻求最佳方法(IOCTL、iwlist(iw)等)

2024-01-12

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

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

之后,我遇到了IOCTL。它看起来真的很强大*而且很专业。但是从 WIFI 获取信号强度的输出比 iwlist/iw 这样的简单方法更可靠吗?

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


如果您想确定您所在的 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分别不一定会导致新的扫描,但可能会返回旧的(缓存的)接入点列表。根据您的无线卡/驱动程序,可能无法强制执行新扫描。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取WIFI信号强度-寻求最佳方法(IOCTL、iwlist(iw)等) 的相关文章

  • 尝试 SSH 时设备的 ioctl 不合适

    我正在尝试通过 SSH 连接几台服务器并尝试获取sudo l每个服务器的输出 下面是我正在执行的脚本 bin bash serverlist tmp servers while IFS read r server netgroup user
  • :: 右侧的非法标记

    我有以下模板声明 template
  • 命令行参数中的“-”(破折号)有什么魔力?

    例子 创建 ISO 映像并将其直接刻录到 CD mkisofs V Photos r home vivek photos cdrecord v dev dev dvdrw 更改到上一个目录 cd 侦听端口 12345 并解压发送到该端口的数
  • 类似 wget 的 BitTorrent 客户端或库? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 是否有任何
  • 在 Linux 2.6.21 (glibc 2.3.5) 上进行 ARP 和反向 ARP

    我需要在任意 IP 网络上存储对第三方设备的持久引用 其中设备的 IP 地址可能是静态的或由 DHCP 随机分配 我不控制网络上的设备 也不能依赖 DNS 和其他现有的或与设备一起使用的临时网络协议 所以我被指示使用硬件地址和 ARP 进行
  • 如何随时暂停 pthread?

    最近我开始将 ucos ii 移植到 Ubuntu PC 上 我们知道 在pthread的回调函数中的 while 循环中简单地添加一个标志来执行暂停和恢复是不可能模拟ucos ii中的 进程 的 如下解决方案 因为ucos ii中的 进程
  • 访问 Linux 线程(pthreads)的本地堆栈

    我目前正在实现一个使用多线程但对总内存消耗有要求的应用程序 我希望有一个主线程执行 I O 并有几个工作线程执行计算 目前 我在主堆栈上有几个可供工作人员访问的数据结构 我使用 OpenMP 进行工作分配 由于主 工作者模式不能很好地与 O
  • Linux shell 命令逐块读取/打印文件

    是否有一个标准的 Linux 命令可以用来逐块读取文件 例如 我有一个大小为 6kB 的文件 我想读取 打印第一个 1kB 然后是第二个 1kB 看来猫 头 尾在这种情况下不起作用 非常感谢 你可以这样做read n在循环中 while r
  • 当存在点和下划线时,使用 sed 搜索并替换

    我该如何更换foo with foo sed 只需运行 sed s foo foo g file php 不起作用 逃离 sed s foo foo g file php Example cat test txt foo bar sed s
  • 如何“grep”连续流?

    可以用吗grep在连续的流中 我的意思是有点tail f
  • 即使 makefile 和源代码存在,为什么“Build Project”在 Eclipse Helios CDT 中显示为灰色?

    我无法构建我的项目 我在 Eclipse Helios 中创建了一个新的 CDT 项目 并告诉它使用现有的源代码和 makefile 这两者都正确显示在 Package 和 Project 视图中 然而 项目 菜单中的 构建全部 和 构建项
  • bash双括号问题

    我对 bash 脚本非常陌生 在使用双括号时遇到了问题 我似乎无法让它们在 Ubuntu Server 11 10 中工作 我的下面的脚本位于 if test sh 中 bin bash if 14 14 then echo FOO fi
  • 有关 Linux 内存类型的问题

    关于Linux内存我有以下问题 我知道活动内存是最常访问的内存部分 但是有人可以解释一下 linux 如何考虑将内存位置用于活动内存或非活动内存 主动存储器由哪些部分组成 磁盘 文件缓存是否被视为活动内存的一部分 有什么区别Buffers
  • jpackage linux 创建的桌面文件不足

    我刚刚开始使用 jpackage 它是一个非常棒的工具 只要迈出一步 我的肩上的工作就减轻了很多 我对看起来硬编码且无法定制的东西越感到惊讶 JPackage 自动生成启动器 lib
  • 使用 C++ 输出字符串覆盖 Linux 终端上的最后一个字符串

    假设我有一个命令行程序 有没有办法让我说的时候 std cout lt lt stuff 如果我不做std cout lt lt n 在另一个之间std cout lt lt stuff 东西的另一个输出将覆盖同一行上的最后一个东西 清理行
  • 使用 MongoDB docker 镜像停止虚拟机而不丢失数据

    我已经在 AWS EC2 上的虚拟机中安装了官方的 MongoDB docker 映像 并且数据库上已经有数据 如果我停止虚拟机 以节省过夜费用 我会丢失数据库中包含的所有数据吗 在这些情况下我怎样才能让它持久 有多种选择可以实现此目的 但
  • 测试linux下磁盘空间不足

    我有一个程序 当写入某个文件的磁盘空间不足时 该程序可能会死掉 我不确定是否是这种情况 我想运行它并查看 但我的测试服务器不会很快耗尽空间 有什么办法可以嘲笑这种行为吗 看起来没有任何方法可以在 Ubuntu 中设置文件夹 文件大小限制 并
  • 静态链接共享对象?或者损坏的文件?

    我有一个从专有来源获得的库 我正在尝试链接它 但出现以下错误 libxxx so 文件无法识别 文件格式无法识别 Collect2 ld 返回 1 退出状态 确实 ldd libxxx so statically linked 这究竟意味着
  • 编写多个mysql脚本

    是否可以在复合脚本中包含其他 mysql 脚本 理想情况下 我不想为包含的脚本创建存储过程 对于较大的项目 我想分层维护几个较小的脚本 然后根据需要组合它们 但现在 我很乐意学习如何包含其他脚本 source是一个内置命令 您可以在 MyS
  • sqlite 插入需要很长时间

    我正在将不到 200 000 行插入到 sqlite 数据库表中 我只是在终端中通过 sqlite3 使用一个非常简单的 sql 文件 我打赌它已经运行了至少 30 分钟 这是正常现象还是我应该关闭该过程并尝试不同的方法 sqlite中的插

随机推荐