WIFI RADAR - Своими руками

Wi-Fi радар сделает проходящих мимо людей вашими клиентами.
Сбор базы клиентов настройка рекламы только на ваших клиентов.
Или догнать людей рекламой в интернете после посещения вашей промо-точки.
И все хотят на этом заработать, а мы поделимся как это сделать самим ...

Будем использовать:

WiFi адаптер с режимом монитора TL-WN722N
Существует несколько возможных USB WiFi адаптеров, которые поддерживают режим монитора. Лично я предпочитаю TL-WN722N или TN722N, который стоит всего ~ 10 долларов и прекрасно работает с каждой моделью Raspberry Pi.

Про настройку Rasspberry Pi рассказывать не будем об этом и так весь интернет пестрит.
Установка
Качаем образ Raspbian Buster Lite

Проверяем наличие модуля wifi в нашем случае это wlxf81a670f1236

pi@raspberrypi:~ $ ifconfig
enxb827eb9f99f0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.40 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::b8e9:2be2:cf04:6ef3 prefixlen 64 scopeid 0x20<link>
ether b8:27:eb:9f:99:f0 txqueuelen 1000 (Ethernet)
RX packets 110 bytes 26029 (25.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 66 bytes 10826 (10.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

wlxf81a670f1236: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether f8:1a:67:0f:12:36 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0


pi@raspberrypi:~ $ iw dev
phy#0
Interface wlxf81a670f1236
ifindex 3
wdev 0x1
addr f8:1a:67:0f:12:36
type managed
txpower 20.00 dBm

Добавляем в директории /etc/network/ в файл interfaces

allow-hotplug wlxf81a670f1236
iface wlxf81a670f1236 inet manual
pre-up iw wlxf81a670f1236 interface add mon0 type monitor
pre-up iw dev wlxf81a670f1236 del
pre-up ifconfig mon0 up

Перезагружаем Raspberry PI

Получили устройство mon0 в режиме мониторинга

pi@raspberrypi:~ $ iw dev
phy#0
Interface mon0
ifindex 4
wdev 0x2
addr f8:1a:67:0f:12:36
type monitor
channel 1 (2412 MHz), width: 20 MHz (no HT), center1: 2412 MHz
txpower 20.00 dBm

Устанавливаем Python3

sudo apt-get install -y python3

Устанавливаем tshark

sudo apt-get install -y tshark
Then update it so it can be run as non-root:

Устанавливаем wireshark

sudo apt-get install -y wireshark
sudo dpkg-reconfigure wireshark-common
Выбираем (select YES)

Затем обновите его, чтобы его можно было запускать без полномочий root:

sudo usermod -a -G wireshark $USER

Вам нужно будет выйти и снова войти в систему, чтобы изменения вступили в силу.

Устанавливаем дополнительный пакет howmanypeoplearearound для python3

sudo pip install howmanypeoplearearound

Первый запуск
pi@raspberrypi:~ $ howmanypeoplearearound

Ошибки при запуске
Если не работают команды или встречается ошибка «command not found», выполните:

python3 -m pip install --upgrade --no-cache-dir howmanypeoplearearound

Программа спросит с каким адапрером бедем работать

Вывод работы программы на экран

Specify WiFi adapter (use ifconfig to determine): wlan1
Using wlan1 adapter and scanning for 60 seconds...
[==================================================] 100% 0s left
There are about 5 people around.

Запускаем howmanypeoplearearound для работы с конкретным wifi адаптером и записью в файл test.json
howmanypeoplearearound -o test.json -a mon0
Using mon0 adapter and scanning for 60 seconds...
[==================================================] 100% 0s left
There are about 9 people around.

Вывод информации на экран
pi@raspberrypi:~ $ cat test.json
{"cellphones": [{"company": "TCT mobile ltd", "rssi": -75.88709677419355, "mac": "5c:77:76:XX:XX:XX"}, {"company": "Xiaomi Communications Co Ltd", "rssi": -81.78571428571429, "mac": "20:a6:0c:XX:XX:XX"}, {"company": "Xiaomi Communications Co Ltd", "rssi": -88.83333333333333, "mac": "70:bb:e9:XX:XX:XX"}, {"company": "Xiaomi Communications Co Ltd", "rssi": -89.0, "mac": "60:ab:67:XX:XX:XX"}, {"company": "Samsung Electronics Co.,Ltd", "rssi": -86.0, "mac": "b0:6f:e0:XX:XX:XX"}, {"company": "Samsung Electronics Co.,Ltd", "rssi": -88.0, "mac": "64:1c:b0:XX:XX:XX"}], "time": 1586439757.9287908}

В комплекте идет анализатор который генерит index.html

pi@raspberrypi:~ $ howmanypeoplearearound --analyze test.json
Wrote index.html
Open browser to http://localhost:8001
Type Ctl+C to exit

Но бывают проблемы. Не открываеться через браузер.
В папке /home/pi/.local/lib/python3.7/site-packages/howmanypeoplearearound в файле analysis.py

httpd = HTTPServer(('localhost', port), SimpleHTTPRequestHandler)

изменить на
httpd = HTTPServer(('', port), SimpleHTTPRequestHandler)

 

В процессе работы наткнулся на проблему что не все телефоны попадают в список.

Помогло наличие дополнительных комманд

pi@raspberrypi:~ $ howmanypeoplearearound -o test.json -a mon0 -v

Получили вывод на экран
20:e8:82:92:85:ba zte corporation False
74:2f:68:3a:2f:cf AzureWave Technology Inc. False
26:2f:68:3a:2f:cf Not in OUI False
84:c9:b2:0d:86:00 D-Link International False
78:31:2b:e9:dc:f8 zte corporation False
5c:77:76:c8:XX:XX TCT mobile ltd False
d4:ca:6d:84:32:4f Routerboard.com False
f4:b8:a7:de:ed:09 zte corporation False
2c:d0:5a:c6:e8:f2 Liteon Technology Corporation False
a0:0b:ba:fe:9a:b1 SAMSUNG ELECTRO MECHANICS CO., LTD. False
10:01:22:00:3a:01 Not in OUI False
20:55:31:1f:ee:66 Samsung Electronics Co.,Ltd True
a4:e9:75:1e:b6:df Apple, Inc. True
60:6c:66:40:f0:6f Intel Corporate False
a4:50:46:c6:58:ca Xiaomi Communications Co Ltd True
6c:00:6b:f2:33:89 Samsung Electronics Co.,Ltd True
80:35:c1:54:00:d9 Xiaomi Communications Co Ltd True
cc:4b:73:59:20:7e AMPAK Technology, Inc. False
d4:ca:6d:63:43:a3 Routerboard.com False
60:ab:67:ba:e9:00 Xiaomi Communications Co Ltd True
cc:03:fa:88:12:cb Technicolor CH USA Inc. False
b0:52:16:14:c1:95 Hon Hai Precision Ind. Co.,Ltd. False
00:b5:d0:f5:e6:45 Samsung Electronics Co.,Ltd True
e4:77:23:f1:99:3c zte corporation False
4c:4e:03:ce:XX:XX TCT mobile ltd False
00:f4:8d:94:7c:53 Liteon Technology Corporation False
4c:cc:6a:ae:71:01 Micro-Star INTL CO., LTD. False
[
{
"company": "Samsung Electronics Co.,Ltd",
"rssi": -89.0,
"mac": "20:55:31:1f:ee:66"
},
{
"company": "Apple, Inc.",
"rssi": -78.0,
"mac": "a4:e9:75:1e:b6:df"
},
{
"company": "Xiaomi Communications Co Ltd",
"rssi": -81.1875,
"mac": "a4:50:46:c6:58:ca"
},
{
"company": "Samsung Electronics Co.,Ltd",
"rssi": -88.0,
"mac": "6c:00:6b:f2:33:89"
},
{
"company": "Xiaomi Communications Co Ltd",
"rssi": -78.14285714285714,
"mac": "80:35:c1:54:00:d9"
},
{
"company": "Xiaomi Communications Co Ltd",
"rssi": -76.125,
"mac": "60:ab:67:ba:e9:00"
},
{
"company": "Samsung Electronics Co.,Ltd",
"rssi": -86.8,
"mac": "00:b5:d0:f5:e6:45"
}
]

Как изменить параметр False на True
Так как выделенные mac адреса точно рабочие
5c:77:76:c8:XX:XX TCT mobile ltd False
4c:4e:03:ce:XX:XX TCT mobile ltd False

В файле есть список компаний разрешенных на обработку
/home/pi/.local/lib/python3.7/site-packages/howmanypeoplearearound/__main__.py

cellphone = [
'Motorola Mobility LLC, a Lenovo Company',
'GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD',
'Huawei Symantec Technologies Co.,Ltd.',
'Microsoft',
'HTC Corporation',
'Samsung Electronics Co.,Ltd',
'SAMSUNG ELECTRO-MECHANICS(THAILAND)',
'BlackBerry RTS',
'LG ELECTRONICS INC',
'Apple, Inc.',
'LG Electronics',
'OnePlus Tech (Shenzhen) Ltd',
'TCT mobile ltd',
'Xiaomi Communications Co Ltd',
'LG Electronics (Mobile Communications)']

Мы добавили не достающую TCT mobile ltd
Правильность написания из файла
http://standards-oui.ieee.org/oui/oui.txt

Так же есть еще возможности по добавлению своих mac адресов
howmanypeoplearearound --targetmacs macs.txt
И macs.txt:
1A:DC:5C:8E:15:7B

Но на этом Мы не остановились, больно много интересного вокруг этой темы.
И так во первых как заставить работать данный скрипт постоянно и не выводить на экран никакой информации, да еще писать в указанное место.

nohup /usr/bin/python3 /home/pi/.local/bin/howmanypeoplearearound -o /home/pi/test.json -a mon0 --loop >/dev/null 2>/dev/null &

Но все равно чегото не хватает...

jq-for-parsing-json поможет нам в решении данной задачи.

http://www.compciv.org/recipes/cli/jq-for-parsing-json/
https://github.com/stedolan/jq.git

sudo apt-get install jq

или

wget https://github.com/stedolan/jq/releases/download/jq-1.5/jq-1.5.tar.gz
tar xfvz jq-1.5.tar.gz
cd jq-1.5
./configure && make && sudo make install

Данные запросы помогут нам получить данные в нужных форматах
Получим данные для записи в MySQL

cat test.json | jq -r '.cellphones[] | "\(.company)#\(.rssi)#\(.mac)"' | awk -F '#' '{printf "INSERT INTO db.table (mac, rssi, company) VALUES (%s, \"%s\", \"%s\");\n", $3, $2, $1}' > insert.sql

Или просто списком запишем в файл

cat test.json | jq -r '.cellphones[] | "\(.mac)"' > mac.txt

Ну и надо как-то забирать информацию

sudo pip install http
nohup /usr/bin/python3 -m http.server 8000 --directory /home/pi/ >/dev/null 2>/dev/null &

Удачи Всем, если придумали что то еще пишите нам на почту. Мы повесим как продолжение от вашего имени.