【问题标题】:Get signal level of the connected WiFi network获取已连接 WiFi 网络的信号电平
【发布时间】:2018-05-14 21:00:59
【问题描述】:

在 ARM Debian 上使用 wpa_supplicant 2.4。

有没有办法获取我当前连接的无线网络的信号电平(以分贝或百分比为单位)?

STATUS 命令只返回以下一组值:bssid、freq、ssid、id、mode、pairwise_cipher、group_cipher、key_mgmt、wpa_state、ip_address、p2p_device_address、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 事件,运行SCAN_RESULT 命令并将信号强度更新为正确值.

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

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

./mtu
./type
./phys_port_name
./netdev_group
./flags
./power/control
./power/async
./power/runtime_enabled
./power/runtime_active_kids
./power/runtime_active_time
./power/autosuspend_delay_ms
./power/runtime_status
./power/runtime_usage
./power/runtime_suspended_time
./speed
./dormant
./name_assign_type
./proto_down
./addr_assign_type
./phys_switch_id
./dev_id
./duplex
./gro_flush_timeout
./iflink
./phys_port_id
./addr_len
./address
./operstate
./carrier_changes
./broadcast
./queues/rx-0/rps_flow_cnt
./queues/rx-0/rps_cpus
./queues/rx-1/rps_flow_cnt
./queues/rx-1/rps_cpus
./queues/rx-2/rps_flow_cnt
./queues/rx-2/rps_cpus
./queues/rx-3/rps_flow_cnt
./queues/rx-3/rps_cpus
./queues/tx-0/xps_cpus
./queues/tx-0/tx_maxrate
./queues/tx-0/tx_timeout
./queues/tx-0/byte_queue_limits/limit
./queues/tx-0/byte_queue_limits/limit_max
./queues/tx-0/byte_queue_limits/limit_min
./queues/tx-0/byte_queue_limits/hold_time
./queues/tx-0/byte_queue_limits/inflight
./queues/tx-1/xps_cpus
./queues/tx-1/tx_maxrate
./queues/tx-1/tx_timeout
./queues/tx-1/byte_queue_limits/limit
./queues/tx-1/byte_queue_limits/limit_max
./queues/tx-1/byte_queue_limits/limit_min
./queues/tx-1/byte_queue_limits/hold_time
./queues/tx-1/byte_queue_limits/inflight
./queues/tx-2/xps_cpus
./queues/tx-2/tx_maxrate
./queues/tx-2/tx_timeout
./queues/tx-2/byte_queue_limits/limit
./queues/tx-2/byte_queue_limits/limit_max
./queues/tx-2/byte_queue_limits/limit_min
./queues/tx-2/byte_queue_limits/hold_time
./queues/tx-2/byte_queue_limits/inflight
./queues/tx-3/xps_cpus
./queues/tx-3/tx_maxrate
./queues/tx-3/tx_timeout
./queues/tx-3/byte_queue_limits/limit
./queues/tx-3/byte_queue_limits/limit_max
./queues/tx-3/byte_queue_limits/limit_min
./queues/tx-3/byte_queue_limits/hold_time
./queues/tx-3/byte_queue_limits/inflight
./tx_queue_len
./uevent
./statistics/rx_fifo_errors
./statistics/collisions
./statistics/rx_errors
./statistics/rx_compressed
./statistics/rx_dropped
./statistics/tx_packets
./statistics/tx_errors
./statistics/rx_missed_errors
./statistics/rx_over_errors
./statistics/tx_carrier_errors
./statistics/tx_heartbeat_errors
./statistics/rx_crc_errors
./statistics/multicast
./statistics/tx_fifo_errors
./statistics/tx_aborted_errors
./statistics/rx_bytes
./statistics/tx_compressed
./statistics/tx_dropped
./statistics/rx_packets
./statistics/tx_bytes
./statistics/tx_window_errors
./statistics/rx_frame_errors
./statistics/rx_length_errors
./dev_port
./ifalias
./ifindex
./link_mode
./carrier

【问题讨论】:

    标签: c linux wifi wireless wpa-supplicant


    【解决方案1】:

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

    wpa_supplicant 将返回:

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

    RSSI的值就是信号电平。

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

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

    【讨论】:

      【解决方案2】:

      对于iw compatible devices

      以下命令给出当前电台(又名 AP)的信号强度:

      iw dev wlp2s0 station dump -v
      

      如果需要C API,挖iw的source code就行了。

      快速浏览一下,你需要的函数是here

      对于 Broadcom 设备,请尝试搜索 Broadcom wl。是开源的,不知道有没有提供C API。

      【讨论】:

      • -bash: iw: command not found 我不认为是博通,我认为卡是Realtek RTL8723BS。
      • github.com/torvalds/linux/tree/master/drivers/staging/rtl8723bs 似乎它的内核驱动程序非常新鲜。希望您能在 4.15 内核中获得官方 iw 支持。或使用 vonder(又名 Realtek)提供的专有解决方案
      • 卡本身目前工作完美,内核为 4.4.71 和 wpa_supplicant。我只需要我当前连接的无线网络的信号级别。
      • 您需要弄清楚卡正在使用的底层驱动程序,并对其进行处理。或者使用带有iw 的开源linux 无线驱动程序。 wpa_supplicant 只是一个身份验证工具,它很少知道设备的详细信息。关于 RTL8723BS 设备,我几乎无法给出任何有用的建议,之前从未接触过。
      猜你喜欢
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-28
      • 1970-01-01
      • 2014-05-27
      • 1970-01-01
      相关资源
      最近更新 更多