Linux WiFI AP:刷新`iw dev wlan0 station dump`输出(非活动时间)

时间:2016-02-26 17:35:38

标签: linux networking wifi

  • 我有一个Linux(3.14.36)嵌入式主板充当WiFi AP。
  • WiFi芯片组不支持监控模式。
  • 我的笔记本电脑(客户端)通过WiFi连接到此板
  • WiFi AP充当到另一台计算机的网桥,并且不向客户端提供IP地址(WiFi AP仅具有客户端的MAC地址)

我想监视连接WiFi AP的信号强度< - >客户端并能够触发"刷新"信号强度值。

做:iw dev wlan0 station dump给了我:

Station xx:xx:xx:xx:xx:xx (on wlan0)
    inactive time:  123820 ms // <-- The problem
    rx bytes:   10291
    rx packets: 60
    ...
    signal:     -65 dBm // What I want to refresh
    ...

我知道每次网络活动时都会更新信号强度。 (因此,在上面的示例中,它已在123年前刷新过。)

如何强制刷新此值? (通过强制AP向客户端发送&#34;某些内容&#34;)知道主板/ WiFi驱动程序/ WiFi设备不支持i​​wconfig等工具

2 个答案:

答案 0 :(得分:2)

我会试一试:

你是嵌入式的,所以我猜你有busybox。您没有IP,但是您可以使用arping(如果您的busybox版本中未配置此applet,请更改配置)以发送可能唤醒该内容的小而无用的内容。您的ARP请求使用什么IP?好吧,你似乎可以使用“虚拟”IP。

我在PC上运行这个,但我确实有忙碌它的arping,我使用有线接口,但这是概念:

jbm@sumo:~/sandbox/iw$ sudo busybox arping -w 1 -U -I eth0 0.0.0.0
ARPING to 0.0.0.0 from 192.168.1.66 via eth0
Sent 2 probe(s) (2 broadcast(s))
Received 0 reply (0 request(s), 0 broadcast(s))

有用的是,虽然是“虚拟”IP,但我可以通过tcpdump检查arp请求是否确实在线路上(或在你的情况下在空中):

jbm@sumo:~$ sudo tcpdump -i eth0 -v arp
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
10:42:20.111100 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 0.0.0.0 (Broadcast) tell sumo, length 28
10:42:21.111206 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 0.0.0.0 (Broadcast) tell sumo, length 28
^C
2 packets captured
2 packets received by filter
0 packets dropped by kernel

因此,在您的无线接口上发送ARP请求可能足以“唤醒”您的连接并刷新您的RSSI。

编辑:

请在此处查看IP 0.0.0.0的有趣用法和属性:

https://en.wikipedia.org/wiki/0.0.0.0

编辑2:

重新思考它,我意识到如果您的无线接口本身没有IP,则会出现问题。如果我没有误会,可能不一定适用于您的桥接配置。在这种情况下,arping将没有源地址来构建其请求数据包(也不会知道如何监听响应),并且会失败。

您可以使用AF_PACKET套接字创建自己的“迷你单向arping”,并使用伪/随机源IP地址构建您自己的ARP请求数据包。它将是单向的,因为对伪造的ARP请求的响应(如果有的话)将转到随机源IP,这可能并且最好不应该存在。但它的原则是通过发送“某些东西”来唤醒你的无线连接,这可能就是这个伎俩。

关于如何编写这个“迷你单向arping”的灵感,请查看来自udhcpc / udhcpd的busybox实现(它比完整的arping busybox applet更简单):

https://git.busybox.net/busybox/tree/networking/udhcp/arpping.c#n38

from_ip参数是您想要伪造的。您可以将实际MAC用作from_mac,只是为了尊严:-)您甚至不必等待响应(从第89行开始),这样就像50行C代码如果你想为它添加一些选项,可以选择一点点。

答案 1 :(得分:2)

对于现在找到此主题的人来说:

我有这个问题,我的解决方案是在进行iw转储之前ping设备,例如

获取已连接MAC地址的列表:

iw dev wlan0 station dump | grep 'signal' | awk '{print $2}'

然后从这些MAC地址获取IP地址(或者您可以使用 arp

ip neigh | grep 'ma:ca:dd:re:ss:ss' | awk '{print $1}'

然后ping每一个:

ping -c 1 'IP.address'

然后获取该MAC地址的刷新信号

iw dev wlan0 station get 'ma:ca:dd:re:ss:ss' | grep 'signal' | awk '{print $2}'

我把所有这些都包含在Python脚本中,它似乎提供了可靠的数据。