获取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)等) 的相关文章

  • 如果文件没有行尾字符,则 wc -l 不计算文件的最后一个

    我需要计算 unix 文件的所有行数 该文件有 3 行 但是wc l仅给出 2 个计数 我知道它不计算最后一行 因为它没有行尾字符 任何人都可以告诉我如何计算这一行吗 grep c返回匹配行的数量 只需使用一个空字符串 作为您的匹配表达式
  • 如何告诉 mex 链接到 /usr/lib 中的 libstdc++.so.6 而不是 MATLAB 目录中的 libstdc++.so.6?

    现在 MATLAB 2012a 中的 mex 仅正式支持 gcc 4 4 6 但我想使用 gcc 4 7 风险自负 现在如果我直接用 mex 编译一些东西 它会抱怨 usr lib gcc i686 linux gnu 4 7 cc1plu
  • Qt 嵌入式触摸屏 QMouseEvents 在收到 MouseButtonRelease 之前未收到

    我在带有触摸屏的小型 ARM 嵌入式 Linux 设备上使用 Qt 4 8 3 我的触摸屏配置了 tslib 并对其进行了校准 因此 etc 中有一个 pointcal 文件 我的触摸事件的位置工作得很好 但无论如何我都会在鼠标按下或鼠标释
  • 使用 ioctl 在 C++ 中以编程方式添加路由

    我编写了简单的 C 函数 添加了新路线 void addRoute int fd socket PF INET SOCK DGRAM IPPROTO IP struct rtentry route memset route 0 sizeof
  • 检测 Android 上的网络连接类型

    如何检测 Android 上的网络连接类型 是否通过ConnectivityManager getActiveNetworkInfo getType 答案是否仅限于 Wifi 和移动设备 如果问题是要确定手机的网络是否已连接且速度是否足以满
  • 更新Linux中的包含路径

    我的 my path to file 文件夹中有几个头文件 我知道如何将这些文件包含在新的 C 程序中 但每次我都需要在包含它之前输入头文件的完整路径 我可以在linux中设置一些路径变量 以便它自动查找头文件吗 您可以创建一个 makef
  • 如何从 Bash 命令行在后台 Vim 打开另一个文件?

    我正在从使用 Gvim 过渡到使用控制台 Vim 我在 Vim 中打开一个文件 然后暂停 Vim 在命令行上运行一些命令 然后想返回到 Vim Ctrl Z 在正常模式下 暂停 Vim 并返回到控制台 fg可用于将焦点返回到 Vim job
  • bash while 循环的布尔表达式中的 -lt 意味着什么?

    我猜测它代表小于基于输出 但是我在哪里可以找到有关此语法的文档 bin bash COUNTER 0 while COUNTER lt 10 do echo The counter is COUNTER let COUNTER COUNTE
  • Python glob,操作系统,相对路径,将文件名放入列表中[重复]

    这个问题在这里已经有答案了 我正在尝试创建一个目录中所有文件的列表 其中文件名以 root 结尾 在阅读了论坛中的一些文章后 我尝试使用 glob 和 os listdir 的基本策略 但我都遇到了麻烦 首先 当我使用 import glo
  • 如何在 Linux 和 C 中使用文件作为互斥体?

    我有不同的进程同时访问 Linux 中的命名管道 并且我想让此访问互斥 我知道可以使用放置在共享内存区域中的互斥体来实现这一点 但作为一种家庭作业 我有一些限制 于是 我想到的是对文件使用锁定原语来实现互斥 我做了一些尝试 但无法使其发挥作
  • “git add”返回“致命:外部存储库”错误

    我刚刚进入 git 的奇妙世界 我必须提交我对程序所做的一系列更改 位于名为的目录中 var www myapp 我创建了一个新目录 home mylogin gitclone 从这个目录中 我做了一个git clone针对公共回购 我能够
  • 在 x86 汇编语言中获取文件大小的简单方法

    假设我已经在汇编中打开了一个文件 并且在寄存器 eax 中有该文件的文件句柄 我将如何获取文件的大小 以便为其分配足够的缓冲区空间 我在这里研究了另一个讨论 建议使用sys fstat 28 系统调用来获取文件统计信息但无法实现它 My a
  • 为什么 fork 炸弹没有使 android 崩溃?

    这是最简单的叉子炸弹 我在许多 Linux 发行版上执行了它 但它们都崩溃了 但是当我在 android 终端中执行此操作时 即使授予后也没有效果超级用户权限 有什么解释为什么它没有使 Android 系统崩溃吗 一句话 ulimit Li
  • 如何才能将 TCP 连接返回到同一端口?

    机器是 RHEL 5 3 内核 2 6 18 有时我在 netstat 中注意到我的应用程序有连接 建立了 TCP 连接本地地址 and 国外地址是一样的 其他人也报告了同样的问题 症状与链接中描述的相同 客户端连接到本地运行的服务器的端口
  • awk 在循环中使用时不打印任何内容[重复]

    这个问题在这里已经有答案了 我有一堆使用 file 1 a 1 txt 格式的文件 如下所示 A 1 B 2 C 3 D 4 并使用以下命令添加包含每个文件名称的新列 awk print FILENAME NF t 0 file 1 a 1
  • 在 docker 中重定向命令输出

    我想为我的服务器做一些简单的日志记录 它是一个在 Docker 容器中运行的小型 Flask 应用程序 这是 Dockerfile Dockerfile FROM dreen flask MAINTAINER dreen WORKDIR s
  • ssh 连接超时

    我无法在 git 中 ssh 到 github bitbucket 或 gitlab 我通常会收到以下错误消息 如何避免它 输出 ssh T email protected cdn cgi l email protection i ssh
  • ioctl 命令的用户权限检查

    我正在实现 char 驱动程序 Linux 并且我的驱动程序中有某些 IOCTL 命令仅需要由 ADMIN 执行 我的问题是如何在 ioctl 命令实现下检查用户权限并限制非特权用户访问 IOCTL 您可以使用bool capable in
  • Linux 中 m 标志和 o 标志将存储在哪里

    我想知道最近收到的路由器通告的 m 标志和 o 标志的值 从内核源代码中我知道存储了 m 标志和 o 标志 Remember the managed otherconf flags from most recently received R
  • 如何使用 JSch 将多行命令输出存储到变量中

    所以 我有一段很好的代码 我很难理解 它允许我向我的服务器发送命令 并获得一行响应 该代码有效 但我想从服务器返回多行 主要类是 JSch jSch new JSch MyUserInfo ui new MyUserInfo String

随机推荐