如何在使用hostapd的Linux系统中以编程方式获取无线接口的RSSI(信号强度)数值?

3
所以,我们在公司的一个大型机器人项目中使用了一个小型嵌入式 Linux 系统作为无线(WiFi)路由器。虽然这并不重要,但是它有一张卡片被配置为 5.8 GHz 无线 A(以避免与其他设备干扰),另外一张特殊的卡片则使用 900MHz 进行通讯,使得我们可以获得约 3 公里的范围。
我们的控制平板连接到 5.8GHz,然后将数据包中继到机器人上的 900MHz。因此,平板电脑和机器人都将路由器盒子作为接入点,并运行 hostapd。作为用户界面的一部分,我们希望从系统的不同组件收集 RSSI(信号强度/噪声等)信息并显示出来。
机器人(也运行 Linux)通过读取 /proc/net/wireless 并将其读取的数字发送到控制平板来实现此目标。然而,在路由器盒子上,如果卡片配置为 AP 模式(hostapd 运行),则 /proc/net/wireless 将会显示两个接口的行,但所有值都为 0。
如果我执行 iw station dump,它会输出一些 RSSI 数字,但我真的不想使用 grep 来过滤它的输出。我的 C 编程技能相当不错(我已经编写了一个实时内核),因此我想知道从内核获取这些信息的最佳方法是什么。我了解一些关于使用 WEXT ioctl 接口的知识,但我最近发现该 API 已过时,新的无线配置/管理系统正在逐步推出。
我可以通过编写使用 WEXT 的程序来完成这个任务,因为我们不会将嵌入式 Linux 安装程序更新到最新的版本。然而,如果有人可以向我指出新的 API 的教程/资源,我会非常感激。或者,如果有一种使 /proc/net/wireless 与 hostapd 很好地协作的方法,我也会采纳 :P
1个回答

1

SIOCGIWSTATS会从/proc/net/wireless获取统计数据。

include/linux/wireless.h

#define SIOCGIWSTATS    0x8B0F          /* Get /proc/net/wireless stats */
/* SIOCGIWSTATS is strictly used between user space and the kernel, and
 * is never passed to the driver (i.e. the driver will never see it). */

然而,要直接从驱动程序获取RSSI值,您需要使用特定于您的WiFi驱动程序的ioctl

例如,Broadcom有一个名为WLC_GET_RSSI的宏,可在SIOCDEVPRIVATE中使用。有关更多信息,请参考OpenWRT源代码(https://dev.openwrt.org/browser/trunk/package/broadcom-wl/src?rev=15242)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接