[DD-WRT роутер] Узнаём кто дома
Недавно наткнулся на видео-презентацию, в которой некий парень показывал возможности Tasker… При вводе голосовых команд он узнавал, кто в данный момент находиться в пределах его точки доступа Wi-Fi. Но он не стал сообщать, как он это сделал, мол пока это всё как проба пера.
Мне захотелось сделать что-то похожее, только более глобально. Всё, что нам нужно – роутер и Linux-машинка (в принципе, всё это можно при желании сделать и на Windows… но с придумыванием велосипедов)
Собственно, как оказалось, реализовать это достаточно просто, особенно если на роутере используется прошивка DD-WRT. Например, чтобы узнать, кто в данный момент «сидит» на роутере посредством wi-fi, достаточно через консоль (ssh, telnet) ввести следующую команду:
wl assoclist
В ответ мы получим что-то вроде этого:
assoclist 70:15:56:3A:91:8E assoclist D9:D5:BE:8A:68:41 assoclist 02:65:11:BD:58:17 assoclist 73:40:0A:88:43:46
Это список всех MAC-адресов устройств, которые в данный момент подключены к роутеру. Теперь дело за малым, убрать лишнее и научиться определять нужные «маки». Легко!
Первым делом перенаправим вывод команды в утилиту awk
, чтобы оставить только второй столбец, в котором содержится перечень аппаратных адресов. Ну и всё что у нас получится запишем в текстовый файл:
wl assoclist | awk '{print $2}' > who_online.txt
После этого выполним проверку, чтобы найти в только что созданном файле нужный нам адрес и, при необходимости, выполнить какую-либо команду при успешном результате поиска:
grep -q '70:15:56:3A:91:8E' who_online.txt && echo "Устройство с этим адресов в сети!"
Вот в общем-то и всё. Ниже я приведу листинг своего готового скрипта, который выполняет сразу несколько условий1):
- Подключаемся к роутеру по ssh 2) и получаем список подключенных устройств. Сразу «чистим» его и пишем в файл;
- Теперь выполняются два условия, при успешном выполнении любого из них, создаётся временный файл, который существует до тех пор, пока не станет успешным альтернативное условие:
- В первом ищем мак моего телефона, если его нет, отправляем пуш-сообщение, что меня нет дома;
- Во втором снова ищем мак моего телефона, только теперь условием должно стать успешное его нахождение. И снова отправляем пуш-сообщение, только теперь с другим текстом.
Вот собственно как-то так. Скрипт помещаем в cron и выполняем с необходимым интервалом. Как я уже написал выше, как только одно из условий выполняется, создаётся временный файл и данное условие в дальнейшем будет игнорироваться, до тех пор, пока альтернативное условие не станет «true» и не удалит временный файл своего «противника». Пример скрипта pushbullet прикладываю, он отправляет пуши посредством одноименного сервиса (подробно, извиняйте, описывать не буду, он тут скорее как пример…).
- example.sh
#!/bin/sh # variables FILE0=/tmp/who_online.txt FILE1=/tmp/philip_left.tmp FILE2=/tmp/philip_home.tmp ACT1=/home/user/pushbullet ACT2=/home/user/pushbullet MACADR='70:15:56:3A:91:8E' # connect to router ssh root@192.168.1.1 -i /home/user/.ssh/cert wl assoclist | awk '{print $2}' > $FILE0 # left home if [ ! -e $FILE1 ] then grep -q $MACADR $FILE0 || ($ACT1 "Philip left home" "Trigger one";echo "Philip left home">$FILE1;rm $FILE2) fi # came home if [ ! -e $FILE2 ] then grep -q $MACADR $FILE0 && ($ACT2 "Philip came home" "Trigger two";echo "Philip came home">$FILE2;rm $FILE1) fi # end file
- pushbullet.sh
#!/bin/bash apikey=ваш_API_ключ iden=ID_устройства_на_которое_нужно_отправить_сообщение curl https://api.pushbullet.com/v2/pushes \ -u $apikey \ -d device_iden=$iden \ -d type=note \ -d title="$1" \ -d body="$2" \ -X POST
P.S. Не претендую на оригинальность, может кто-то уже придумал такой или более красивый вариант… Но мне пофиг!
-i /home/user/.ssh/cert
– файл ключа для подключения… специфика настройки моего роутера, у вас, возможно, будет комбинация логин+пароль