我想监视连接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设备不支持iwconfig等工具
答案 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脚本中,它似乎提供了可靠的数据。