背景
最近基于OpenWRT开发了WiFi探针的功能,可以实现基本的客户端MAC及客户端的信号强度搜集,搜集结束之后通过MQTT上传至后台服务进行分析,可实现更多的扩展功能,如人流量统计,粗略定位等.
本文描述不涉及后台的分析功能,只是通过路由器提供的AP功能,将搜集到的信息提交给服务后台.
好,正式开始.
开发思路
如果熟悉802.11协议的话,开发思路比较明确了,先上802.11报文格式,如下:
其中Address2为发送端的MAC地址,同时,基于802.11协议的行为模式,802.11协议规定:
- AP基站每个100ms发送一次信标Beacon帧,用来提供BSS网络基础架构;
- Station客户端,在WiFi功能开启状态下,每隔一段时间会向附近所有能收到Beacon帧的AP(即使客户端没有链接到AP),发Probe Request报文,基站收到
此报文后会回应Probe Response报文;
而Probe Request报文属于管理帧(Type=00)的一种,子类型为Probe Request(SubType=0100),了解这些,要实现探针的思路就很明确了.主要分两个步骤:
- WiFi驱动层,抓取到我们想要的信息(内核空间),通过某种方式传递给用户空间;
- 用户空间接收到内核空间传递的信息,进行数据的提取及发送到云端;
1.内核空间代码
我使用AR71XX系列设备,其WiFi驱动的源码,在OpenWRT编译之后的build_dir/target-mips_34kc_uClibc-0.9.33.2/linux-ar71xx_generic/compat-wireless-2016-01-10目录下,不同版本可能会有区别,所有收到的WiFi数据包,都会通过net/mac80211/rx.c的__ieee80211_rx_handle_packet函数进行处理,因此检测Probe Request帧就在这里处理,添加代码片段如下:
--- compat-wireless-2016-01-10/net/mac80211/rx.c 2019-07-18 17:43:35.176544318 +0800
+++ compat-wireless-2016-01-10-mod/net/mac80211/rx.c 2019-07-18 16:05:46.538622629 +0800
@@ -31,6 +31,