OpenWrt下WiFi无线指标的提取(MAC地址、RSSI等)

实验平台如下:

路由器型号:TP-LINK TL-WR703N v1
OpenWrt版本:Chaos Calmer 15.05.1

前言:

802.11帧有三种,管理帧、控制帧,数据帧。每种类型帧又分很多种“子帧”。手机WIFI开启扫描热点、连接热点的过程主要涉及管理帧。

当我们的手机扫描周边WiFi热点时,会发出一种probe_request的帧(它是管理帧的一种,其中包含了手机的MAC地址),遍历空间所有信道,等待AP返回Probe Response帧。

这个交互过程中,终端到各AP的信号强度值是一清二楚的,从而可以采用RSSI等方式来定位。也就是说只要你手机终端开启了Wi-Fi,在后台它是会与空间内的AP发生一次或反复的帧听与响应,这些可以帧听,基本暴露了你在空间的大致位置了。

通过这种方式,WiFi热点亦可扫描并收集周围的AP信号,无论是否加密,是否已连接,甚至信号强度不足以显示在无线信号列表中,都可以获取到AP广播出来的MAC地址。


一、基本原理

利用工作在monitor模式的无线网卡可以探测到所有经过它的数据流,在AP端使用无线网卡抓取AP与AP、AP与STA之间的MAC层管理数据包,然后对抓取的MAC帧进行实时解包,提取所需要的Timestamp、MAC address、RSSI等信息,并将其存入服务器数据库中,用于后续的wifi定位、链路分析等。


二、获取周围wifi强度的两种方法:

1、抓取AP与AP之间的MAC层管理数据包

OpenWrt路由器无线网卡工作于AP模式,无需连接周围wifi,通过以下指令即可监听到它们的MAC地址、RSSI强度等信息。

如何在Linxu程序内部嵌入shell终端指令并获取该指令的输出结果。请参考 此处。

iw dev wlan0 scan | egrep "^BSS|singal"//参考注释[4]

最终效果:在703N路由器测试最快速度为 0.8秒以上,此外获得的RSSI不稳定,浮动较大,不适合做控制,故寻找第二种方法。

原因分析:此条语句执行时,会将周围所有的 wifi热点的MAC层管理数据包都捕获进来,然后再挨个解包、提取,这个过程将花费相当长时间,造成读取线程堵塞。

2、抓取AP与STA之间的MAC层管理数据包

OpenWrt路由器无线网卡工作于AP模式并作为Master路由器,其它路由器作为Client,连上该AP,即可通过下列指令查看所有连入该AP的客户端的信息。

  • 如使用带WDS功能的路由器作为客户端,请参考 TP-LINK无线路由器设置无线WDS扩展无线网络

  • 如使用OpenWrt路由器作为客户端,请参考,OpenWrt路由器设置万能中继及如何永久修改MAC地址

iw dev wlan0 station dump | egrep "Station|singal:"//参考注释[5]
//iw wlan0 station get 40:b0:fa:c1:75:41//查看单个路由器信息

最终效果:在703N路由器测试最快速度为 28ms,获得的RSSI较为稳定,实时性也满足要求。


参考文章:

[1] wifi关键数据提取
[2] Linux使用tcpdump抓获取WIFI包
[3] Linux系统无线网络抓包程序(分析手机WIFI MAC地址)
[4] 实战无线网络分析(篇一)无线监听
[5] How to get RSSI in a linux AP (iw station dump doesn’t work)

                                                                        @本文作者:LeathreWang

你可能感兴趣的:(OpenWrt)