获取所连接WiFi网络的信号电平

时间:2017-11-30 20:12:54

标签: c linux wifi wireless wpa-supplicant

在ARM Debian上使用wpa_supplicant 2.4。

有没有办法获得我目前连接的无线网络的分贝或百分比信号电平?

STATUS命令仅返回下列的一组值:BSSID,频率,SSID,ID,模式,pairwise_cipher,group_cipher,key_mgmt这,wpa_state,IP_ADDRESS P2P_DEVICE_ADDRESS,地址,UUID

我之后可以运行SCAN,等待结果并按SSID搜索。但这很慢且容易出错,我想做得更好。

驱动程序应该已经知道这些信息(因为已连接,并调整了节能的传输级别),有没有办法只查询它?

这个问题与通用计算硬件和软件无关。我通过wpa_ctrl.h标头中定义的C API使用wpa_supplicant,通过一对unix与服务进行交互域套接字(一个用于命令,另一个用于未经请求的事件)。

我不喜欢当前SCAN + SCAN_RESULT解决方案的一个原因是,它不适用于隐藏的SSID网络。扫描找不到网络,因此我没有以这种方式获得信号电平。另一个问题是应用程序启动时出现轻微的视觉故障我的应用由systemd After=multi-user.target启动。除非是第一次发布,否则Linux已经连接到Wi-Fi了。在我的应用程序的GUI(该产品将具有触摸屏),我渲染类似手机的状态栏,其中包括WiFi信号强度图标。目前,它最初显示最低级别(我知道它已连接,因为STATUS命令显示SSID),仅在约1秒后我从wpa_supplicant获得CTRL-EVENT-SCAN-RESULTS事件,运行{{1}命令并将信号强度更新为正确的值。

在API级别上,我的代码很简单。我有两个线程,都调用SCAN_RESULT,命令线程调用wpa_ctrl_open,事件线程有一个无限循环调用poll传递wpa_ctrl_request描述符和{{1 }事件掩码,后跟wpa_ctrl_get_fd()POLLIN

这是/ sys / class / net / wlan0中的文件列表:

wpa_ctrl_pending

2 个答案:

答案 0 :(得分:2)

您可以通过wpa_supplicant cmd获取已连接wifi的信号电平SIGNAL_POLL

wpa_supplicant会返回:

RSSI=-60
LINKSPEED=867
NOISE=9999
FREQUENCY=5745

RSSI的值是信号电平。

您可以通过wpa_supplicant cmd BSS <bssid>获取已连接wifi的信号电平。 关于连接的wifi的bssid,你可以从wpa_supplicant cmd STATUS获得。

https://android.googlesource.com/platform/external/wpa_supplicant_8/+/622b66d6efd0cccfeb8623184fadf2f76e7e8206/wpa_supplicant/ctrl_iface.c#1986

答案 1 :(得分:1)

iw compatible devices

以下命令给出当前站(也称为AP)信号强度:

iw dev wlp2s0 station dump -v

如果您需要C API,只需挖掘iw的source code

快速浏览一下后,您需要的功能是here

对于broadcom设备,请尝试搜索broadcom wl。它是密切的来源,不知道是否提供了C API。