【问题标题】:Linux WiFI AP : refresh `iw dev wlan0 station dump` output (inactive time)Linux WiFi AP:刷新`iw dev wlan0 station dump`输出(非活动时间)
【发布时间】:2016-02-26 17:35:38
【问题描述】:
  • 我有一个 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向客户端发送“东西”)知道板子/WiFi驱动程序/WiFi设备不支持i​​wconfig等工具

【问题讨论】:

    标签: linux networking wifi


    【解决方案1】:

    对于现在找到此主题的任何人:

    我遇到了这个问题,我的解决方案是在执行 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 脚本中,它似乎提供了可靠的数据。

    【讨论】:

    • 使用iw dev wlan0 station dump | grep 'Station' | awk '{print $2}'获取MAC地址列表
    【解决方案2】:

    我试试看:

    你是嵌入的,所以我猜你有busybox。您没有 IP,但您可以使用arping(如果您的busybox 构建中未配置此小程序,请更改配置)发送一些小而无用的东西,可能会唤醒这个东西。为您的 ARP 请求使用什么 IP?好吧,看来您可以使用“虚拟”IP。

    我在 PC 上运行它,但我确实有带有 arping 的busybox,而且我使用有线接口,但这里是概念:

    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 实现(它比成熟的 arpingbusybox 小程序更简单):

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

    from_ip 参数是您要伪造的。您可以使用您的实际 MAC 作为from_mac,只是为了尊严 :-) 您甚至不必等待响应(从第 89 行开始),所以这就像 50 行 C 代码 + 一个如果您想向其中添加一些选项,请使用 little main。

    【讨论】:

    • 非常感谢您的回答。网络不是我的主要主题,所以感谢您详细介绍,它真的很有帮助:)。 busybox arping -w 1 -U -I wlan0 0.0.0.0 arping: can't connect to remote host (0.0.0.0): Invalid argument 我想这是因为你在 ÈDIT 2 中解释的问题。我尝试使用 python RAW 套接字制作 ARP 请求,但设备没有回复(但它接收到),因此不足以触发信号的刷新。现在我正在尝试制作一个 RARP 请求,然后我会在Edit 2 中尝试解决方案,除非我能找到更简单的方法
    • 不客气。我真的很想知道您的“RSSI 由于不活动时间而未刷新”的假设是否有效,以及您是否/如何验证/无效它以及解决它(或失败)的解决方法。哎呀... Python on一个嵌入式系统......这方式太容易了:-) 过去,我几乎没有“1”和“0”。有时我没有得到“0”,不得不使用字母“o”。
    猜你喜欢
    • 2019-04-26
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    • 2013-12-12
    • 1970-01-01
    相关资源
    最近更新 更多