Слежения за регистрацией устройства в Wi-Fi сети c уведомлением на почту

Обсуждение ПО и его настройки
mcheev
Сообщения: 12
Зарегистрирован: 13 окт 2017, 10:47

Решения для слежения за появлением, отключением устройства от Wi-Fi сети c уведомлением на почту, например за уходом/приходом ребенка в/из школы.

Вариант №1 (изначальный)
1. MAK адрес устройства привязываем к IP
IP>DHCP Server>Leases, там находим нужное устройство, жмем правой кнопкой по нему и выбираем пункт "Make Static", теперь этот IP будет привязан к этому устройству
2. В Netwatch указал слежение за этим IP
Tools>Netwatch, нажимаем плюсик и в появившемся окне указываем в поле Host нужный нам IP адрес устройства
Во вкладке Up
/tool e-mail send to=xxxxx@xxxxx.xxx subject="Объект вернулся в периметр" body="Объект вернулся в периметр";
Во вкладке Down
/tool e-mail send to=xxxxx@xxxxx.xxx subject="Объект покинул периметр" body="Объект покину периметр";
P.S. Предварительно необходимо настроить отправку почты

Но так как, например iPhone перестает отвечать на ping, почти сразу как гаснет его экран и начинает сразу как берешь в руку, поэтому средствами Netwatch следить за устройством бессмысленно - Mikrotik завалит сообщениями.
Благодаря kt72ru был рожден второй вариант, который должен решить задачу.

Вариант №2
Для его реализации открываем Scheduler (System>Scheduler) и нажимаем плюсик.
В поле Name указываем "Out", в поле Start Time выбираем startup, в Interval указываем 1 минуту и берем следующий скрипт:
:local MAC XX:XX:XX:XX:XX:XX;
:local time [/system clock get time];
:local hour [: pick [/system clock get time] 0 2];
:if ($hour >= 8 and $hour <= 21) do={:local MACdetect [interface wireless registration-table find mac-address=$MAC];
:if ([:len $MACdetect]=0) do={/tool e-mail send to=xxxxx@xxxxx.xx subject="Объект покинул периметр" body="Объект покинул периметр";
:delay 30;
/system scheduler enable "In";
/system scheduler disable "Out";}}

Описание скрипта:
:local MAC XX:XX:XX:XX:XX:XX; - указываем нужный нам MAC
:if ($hour >= 8 and $hour <= 21) - указываем время, с которого по какое проверять наличие MAC в сети, в данном случае с 8:00 до 21:00.
:delay 30; - ждем 30 секунд, чтобы почта успела уйти
/system scheduler enable "In"; - включаем второе задание
/system scheduler disable "Out"; - отключаем текущее задание, чтобы не приходили сообщения при каждой проверке

Проделываем тоже самое, но только в поле Name указываем "In".
:local MAC XX:XX:XX:XX:XX:XX;
:local time [/system clock get time];
:local hour [: pick [/system clock get time] 0 2];
:if ($hour >= 8 and $hour <= 21) do={:local MACdetect [interface wireless registration-table find mac-address=$MAC];
:if ([:len $MACdetect]>0) do={/tool e-mail send to=xxxxx@xxxxx.xx subject="Объект вернулся в периметр" body="Объект вернулся в периметр";
:delay 30;
/system scheduler enable "Out";
/system scheduler disable "In";}}

Имена заданий можно изменить, они указываются в строках:
/system scheduler enable
/system scheduler disable

От себя, огромное человеческое спасибо kt72ru за проделанную работу и помощь в решении задачи, без него ничего не получилось.
Последний раз редактировалось mcheev 17 окт 2017, 18:36, всего редактировалось 4 раза.


kt72ru
Сообщения: 141
Зарегистрирован: 23 июн 2017, 07:55

:if ($hour >= 8 and $hour <= 21) do={:local MACdetect [interface wireless registration-table find mac-address=$MAC];
:if ([:len $MACdetect]<=0) do={/tool e-mail send to=xxxxx@xxxxx.xx subject="Объект покинул периметр" body="Объект покину периметр";}}
если объекта наблюдения нет в периметре, то он будет посылать сообщения при каждой проверке.


mcheev
Сообщения: 12
Зарегистрирован: 13 окт 2017, 10:47

kt72ru писал(а)::if ($hour >= 8 and $hour <= 21) do={:local MACdetect [interface wireless registration-table find mac-address=$MAC];
:if ([:len $MACdetect]<=0) do={/tool e-mail send to=xxxxx@xxxxx.xx subject="Объект покинул периметр" body="Объект покину периметр";}}
если объекта наблюдения нет в периметре, то он будет посылать сообщения при каждой проверке.


Чтобы не отправлял при каждой проверке нужно как я понимаю второй скрипт отключающий задачу? Если так, то я вроде такой нашел.

Огромное спасибо за помощь, строку - tool e-mail send to=xxxxx@xxxxx.xx subject="Объект покинул периметр" body="Объект покину периметр"; я добавлял уже сам, из другого скрипта, в оригинале должна играть мелодия, но оповещение все равно не приходит, при этом если запустить скрипт - /tool e-mail send to=xxxxx@xxxxx.xx subject="Объект покинул периметр" body="Объект покину периметр"; то письмо уходит.

В данный момент вижу регистрацию устройства в сети, возможно для того чтобы скрипт заработал нужно произвести еще какие-то настройки в Mikrotik? Как вы понимаете настройки по умолчанию (Quick Set), плюс дополнительная настройка по рекомендациям найденным в сети.

Если не сложно, то подскажите пожалуйста, правильно я понимаю, что RunCount (Scheduler) это число срабатываний (т.е. он находит МАК в списке) или это просто число запусков проверок?


kt72ru
Сообщения: 141
Зарегистрирован: 23 июн 2017, 07:55

чтобы не было постоянных срабатываний, надо при проявление объекта выставлять переменную, например в адресс-листе, а при последующих запусках скрипта ее проверять. При уходе удалять переменную и генерить сообщение. Все можно делать в одном скрипте


mcheev
Сообщения: 12
Зарегистрирован: 13 окт 2017, 10:47

kt72ru писал(а):чтобы не было постоянных срабатываний, надо при проявление объекта выставлять переменную, например в адресс-листе, а при последующих запусках скрипта ее проверять. При уходе удалять переменную и генерить сообщение. Все можно делать в одном скрипте

Прошу прощения за свою тупость, с языками программирования не знаком, но чувствую благодаря Mikrotik буду в свободное время изучать, есть идея по включению гостевой сети по сценарию - с 5G переключится на 2,4G и в течении 10 секунд вернуться на 5G, то должна включиться гостевая сеть, вот буду грызть.

В общем идея сделать два задания:
1 Out
:local MAC B0:48:1A:A3:A6:0D;
:local time [/system clock get time];
:local hour [: pick [/system clock get time] 0 2];
:if ($hour >= 8 and $hour <= 21) do={:local MACdetect [interface wireless registration-table find mac-address=$MAC];
:if ([:len $MACdetect]=<0) do={/tool e-mail send to=xxxxx@xxxxx.xx subject="Объект покинул периметр" body="Объект покинул периметр";
:delay 30;
/system scheduler enable In;
/system scheduler disable Out;}}

2 In
:local MAC B0:48:1A:A3:A6:0D;
:local time [/system clock get time];
:local hour [: pick [/system clock get time] 0 2];
:if ($hour >= 8 and $hour <= 21) do={:local MACdetect [interface wireless registration-table find mac-address=$MAC];
:if ([:len $MACdetect]>0) do={/tool e-mail send to=xxxxx@xxxxx.xx subject="Объект вернулся в периметр" body="Объект вернулся в периметр";
:delay 30;
/system scheduler enable Out;
/system scheduler disable In;}}

Как считаете правильное решение?
Вроде сработало, спасибо Вам kt72ru!!!


kt72ru
Сообщения: 141
Зарегистрирован: 23 июн 2017, 07:55

накидал на скорую руку, по идее должен работать.

:local MAC B0:48:1A:A3:A6:0D;
:local time [/system clock get time];
:local hour [: pick [/system clock get time] 0 2];

:if ($hour >= 8 and $hour <= 21) do={ :local MACdetect [/interface wireless registration-table find mac-address=$MAC];

:if ([:len $MACdetect]<=0) do={
:do { :local childSPY [/ip firewall address-list get value-name=list [find address=1.1.1.1]]; } on-error {}
:do { /ip firewall address-list remove [find where address=1.1.1.1];
/tool e-mail send to=xxxxx@xxxxx.xx subject="Объект покинул периметр" body="Объект покинул периметр"; }}


:if ([:len $MACdetect]>0) do={
:do { :local childSPY [/ip firewall address-list get value-name=list [find address=1.1.1.1]]; } on-error { /ip firewall address-list add address=1.1.1.1 list=child-spy;
/tool e-mail send to=xxxxx@xxxxx.xx subject="Объект в периметре" body="Объект в периметре"; }}}
Последний раз редактировалось kt72ru 13 окт 2017, 14:16, всего редактировалось 1 раз.


kt72ru
Сообщения: 141
Зарегистрирован: 23 июн 2017, 07:55

mcheev писал(а):Как считаете правильное решение?

тоже вариант.


mcheev
Сообщения: 12
Зарегистрирован: 13 окт 2017, 10:47

kt72ru писал(а):
mcheev писал(а):Как считаете правильное решение?

тоже вариант.

Простите, как писал ранее совсем тупой в этом деле, но есть огромное желание разобраться.

Вы писали ранее, про то, что нужно создать переменную.
В Вашем скрипте это делает команда :local childSPY?
А find address=1.1.1.1 тут соответственно нужно указать реальный IP устройства?
Но я совсем не понял на что влияет и зачем нужно list=child-spy, если есть время, то можете вкратце объяснить для общего развития.


kt72ru
Сообщения: 141
Зарегистрирован: 23 июн 2017, 07:55

Я неправильно выразился, правильно звучит так, "необходимо выставить флаг сигнализирующий о наличии объекта в периметре". Это можно сделать разными способами. Можно через глобальную переменную, но она удалится при перезагрузке, или создать какой либо объект. Я сделал выставление флага через создание записи в address-list.

Создается запись командой.
/ip firewall address-list add address=1.1.1.1 list=child-spy

address любой, это просто ключ. list=child-spy - это название листа.

:local childSPY [/ip firewall address-list get value-name=list [find address=1.1.1.1]]; - это поиск по ключу в address-list.


mcheev
Сообщения: 12
Зарегистрирован: 13 окт 2017, 10:47

kt72ru писал(а):Я неправильно выразился, правильно звучит так, "необходимо выставить флаг сигнализирующий о наличии объекта в периметре". Это можно сделать разными способами. Можно через глобальную переменную, но она удалится при перезагрузке, или создать какой либо объект. Я сделал выставление флага через создание записи в address-list.

Создается запись командой.
/ip firewall address-list add address=1.1.1.1 list=child-spy

address любой, это просто ключ. list=child-spy - это название листа.

:local childSPY [/ip firewall address-list get value-name=list [find address=1.1.1.1]]; - это поиск по ключу в address-list.


Огромное спасибо за помощь, Ваше терпение, моё обучение.
Думаю это пригодится не только мне, поэтому собрал все воедино и разместил в первом сообщении.


Ответить