Philip Wiki

Персональный wiki-сайт

Инструменты пользователя

Инструменты сайта


docs:blog:ddwrt_whohome

[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):

  1. Подключаемся к роутеру по ssh 2) и получаем список подключенных устройств. Сразу «чистим» его и пишем в файл;
  2. Теперь выполняются два условия, при успешном выполнении любого из них, создаётся временный файл, который существует до тех пор, пока не станет успешным альтернативное условие:
    1. В первом ищем мак моего телефона, если его нет, отправляем пуш-сообщение, что меня нет дома;
    2. Во втором снова ищем мак моего телефона, только теперь условием должно стать успешное его нахождение. И снова отправляем пуш-сообщение, только теперь с другим текстом. :-)

Вот собственно как-то так. Скрипт помещаем в cron и выполняем с необходимым интервалом. Как я уже написал выше, как только одно из условий выполняется, создаётся временный файл и данное условие в дальнейшем будет игнорироваться, до тех пор, пока альтернативное условие не станет «true» и не удалит временный файл своего «противника». :-D Пример скрипта 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. Не претендую на оригинальность, может кто-то уже придумал такой или более красивый вариант… Но мне пофиг! :-)

1)
Все пользовательские данные я вынес в переменные в начале файла
2)
Здесь -i /home/user/.ssh/cert – файл ключа для подключения… специфика настройки моего роутера, у вас, возможно, будет комбинация логин+пароль

Обсуждение

Ваш комментарий. Вики-синтаксис разрешён:
F E F Q F
 
docs/blog/ddwrt_whohome.txt · Последнее изменение: 11.01.2015 15:40 — philip