Используем старый Mikrotik как сигнализацию

от автора

В качестве введения

Коммуникационное оборудование достаточно быстро устаревает.  Еще совсем недавно Mikrotik hAP RB951Ui-2nD был вполне приличным роутером,  но по сегодняшним меркам 100м порты, однодиапозонный Wi-Fi, и заслуженный процессор Qualcomm Atheros QCA9531 — слабовато даже для дачи.

Но устройство собрано добротно (спасибо ребятам из Риги за хорошее качество), отлично работает с Router OS 7, имеет USB порт и PoE — жалко от него избавляться.

Пришла в голову идея – с  минимальными доработками использовать его в качестве основного блока сигнализации на удаленном объекте.

Минимально необходимые компоненты и оборудование:

1.Любой роутер Mikrotik с блоком питания. У меня — hAP RB951Ui-2nD

2.Доступ в интернет. Если на объекте нет интернета, используем USB модем, у меня оказался не нужный  – Huawei E3372h-153 с симкой МТС.

3.Какой-нибудь извещатель – так эти устройства называются у охранников. Это может быть ИК датчик присутствия, разбития стекла, или просто геркон на дверь. Извещатели должны быть с «сухими контактами». Для тех, кто не в курсе это просто нормально разомкнутые контакты реле не связанные по питанию с датчиком.

Дополнительные компоненты – по желанию.

4.IP камера. У меня HiWatch IPC-T020(C) – самая простая. Можно прицепить несколько по проводу и(или) Wi-Fi по необходимости.

5.Резервное питание. Я использовал батарею из четырех литий-железо-фосфатных (LiFePO4) аккумуляторов (контроллер заряда Lisolec 4S BMS LiFePO4 12V) + дополнительный БП на 14 вольт для зарядки батареи и питания камеры.

Как это работает

Как известно стандартный 10/100м Ethernet порт использует четыре сигнальные линии: Tx+(б/оранж), Tx-(оранж), Rx+(б/зел), Rx-(зел). MDI(TIA/EIA-568B). При стандартном подключении к порту сетевой платы (например) линии TX соединяются с линиями RX и линк поднимается.

Уберем сетевую плату. Соединим напрямую в патче Rx с Tx. Порт поднимется, но при этом получим так называемую петлю (loop). Ситуация очень не приятная в Ethernet,  ее обычно отлавливают с помощью технологии защиты от петель (loop protect у Mikrotik). Но у нас роутер! Не включаем нужный порт в любые бриджи, отключаем loop protect на  нем, и ура, порт горит, а широковещательный шторм – отсутствует. Разъединяем одну линию, линк падает – счетчик “Link Downs” на порту прибавляется. Восстанавливаем линию,  порт поднимается.

Но не все так просто… При соединении проводников порт не всегда переходит в состояние “Up”. Видимо, это особенность RouterOS.  Чтобы гарантированно установить статус порта нужно ненадолго включить “Cable Test” на этом порту, остальные манипуляции не помогают. Но у чипсета есть особенность,  что при включении “Cable Test” на одном порту, иногда, все остальные порты switch chip кратковременно уходят в “Down”, что очень неприятно,  когда у вас на них что-то подключено, например камера или интернет.

Хорошо, что в роутере много Ethernet портов! Используем два порта. Исключаем их из всех бриджей, отключаем loop protect, соединяем между собой Tx и Rx. Контактами извещателя прерываем одну из линий линка и … все, получили блок сигнализации. Эта схема работает отлично, и не требует дергать “Cable Test”.

Осталось в Scheduler запустить скрипт, который регулярно проверяет “Link Downs” на нужном  порту,  и шлет оповещение хозяину.

Реализация

Настраиваем  микрот для доступа в интернет.

Кратко прокомментирую конфиг, он достаточно стандартен для выхода в интернет через USB модем.

  • Настраиваем Ethernet интерфейсы: E1 – приходит резервное питание; E2 – подключена Ip камера; E3 – в бридже для настройки роутера; E4 и E5 используются для сигнализации.

  • Wi-Fi интерфейс на ваш вкус

  • LTE стандартно для USB модема в режиме PPP (Stik)

  • В бридж добавляем все порты,  кроме E4-E5

  • Делаем локальную сеть 192.168.5.0/24, создаем DHCP сервер, камере даем фиксированный ip.

  • ip firewall filter и ip firewall nat все стандартно

# 2026-06-24 10:11:15 by RouterOS 7.23.1## model = RB951Ui-2nD/interface ethernetset [ find default-name=ether1 ] name=E1-Power12set [ find default-name=ether2 ] name=E2-Cameraset [ find default-name=ether3 ] name=E3set [ find default-name=ether4 ] advertise=10M-baseT-half,10M-baseT-full arp=disabled loop-protect=off name=E4-Alarmset [ find default-name=ether5 ] advertise=10M-baseT-half,10M-baseT-full arp=disabled loop-protect=off name=E5-AlarmP poe-out=off/interface wirelessset [ find default-name=wlan1 ] band=2ghz-onlyn country=russia3 frequency=\    auto max-station-count=10 mode=ap-bridge multicast-buffering=disabled \    multicast-helper=disabled name=WiFi2.4 ssid=<SSID> wireless-protocol=\    802.11 wps-mode=disabled/interface wireless security-profilesset [ find default=yes ] authentication-types=wpa2-psk group-key-update=1h \    mode=dynamic-keys supplicant-identity=MikroTik/interface lteset [ find default-name=lte1 ] allow-roaming=yes disabled=yes name=MTS-LTE /ppp profileset *0 use-ipv6=no use-mpls=no use-upnp=noadd name=MTS-LTE use-compression=no use-encryption=no use-ipv6=default \    use-mpls=no use-upnp=no/interface bridgeadd name=Bridge protocol-mode=none/interface bridge portadd bridge=Bridge interface=E1-Power12add bridge=Bridge interface=E3add bridge=Bridge interface=E2-Cameraadd bridge=Bridge interface=WiFi2.4/ip addressadd address=192.168.5.1/24 interface=Bridge network=192.168.5.0/ip pooladd name=Pool ranges=192.168.5.10-192.168.5.200/ip dhcp-serveradd address-pool=Pool interface=Bridge lease-time=1d name=DHCP/ip dhcp-server networkadd address=192.168.5.0/24 dns-server=192.168.5.1 gateway=192.168.5.1 netmask=24/ip dhcp-server leaseadd address=192.168.5.2 client-id=1:XX:XX:XX:XX:XX:XX comment=Camera \    mac-address=XX:XX:XX:XX:XX:XX server=DHCP/ip dnsset allow-remote-requests=yes cache-max-ttl=1d servers=1.1.1.1,77.88.8.8/ip firewall filteradd action=drop chain=input dst-port=22,23,53,80,443,8291 in-interface=MTS protocol=tcpadd action=drop chain=input dst-port=53 in-interface=MTS protocol=udp/ip firewall natadd action=masquerade chain=srcnat out-interface=MTS src-address=192.168.5.0/24/system clockset time-zone-autodetect=no time-zone-name=Europe/Moscow/system ntp clientset enabled=yes/system ntp client serversadd address=217.91.44.17

При включении питания, бывают случаи, что USB модем сразу не работает,  поэтому с задержкой 40с после включения проверяем интерфейс MTC, если не готов перегружаем USB по питанию. Заодно инициализируем глобальную переменную E4linkDown – число срабатываний;

/system scheduleradd name=RebootUSB1\on-event=":global E4linkDown -1;\    \r\ndelay 40; \r\n :if ( [/interface get [find name=\"MTS\"] run] = false ) \    do={/system routerboard usb power-reset duration=10s};"\  policy=read,write,policy,test start-time=startup

И основная процедура проверки срабатывания сигнализации,  отправки уведомлений и проверки кто присутствует на объекте.

:local MacA {   "Admin1"="XX:XX:XX:XX:XX:XX";   "Admin2"="XX:XX:XX:XX:XX:XX" };:local Text "";:local DT ("-=".[/system clock get date]."=".[/system clock get time]."=-");:local linkD [/interface get [find name="E4-Alarm"] link-downs]:if ($linkD != $E4linkDown) do={    :foreach ind,mac in=$MacA do={        :if ([:len [/interface/wireless registration-table find mac-address=$mac]]>0) do={set $Text "$Text $ind,"};     };    :local LenText ([:len $Text]-1);    :set $Text ([:pick $Text 0 $LenText]);    :if ([:len $Text] = 0) do={         :do {              /tool fetch url="https://api.telegram.org\               /botXXXXXXXX:XXXXXXXXXXXX/sendMessage\?chat_id=XXXXXXXXXX\              &text=--Mikrot-->%0A$DT%0AAlarm$linkD!" keep-result=no;                 } \              on-error={                        /log info "Error Telegram, send SMS, eMail";                       do { /tool sms send port=usb1 phone-number="+7XXXXXXX" message="Mikrot->\n$DT\n\                                 Alarm:$linkD!";                               /tool e-mail send to="XXXXX@XXXX.ru" sub="Mikrot" body="Mikrot-                               >\n$DT\nAlarm:$linkD!";                              }\                             on-error={/log info "Error send SMS or eMail";}                               }; # on-error   }; # if ([ len...    :global E4linkDown $linkD;  }; # if ($linkD.../log info "TestAlarm: $DT; $Text; $E4linkDown; $linkD";

Описание по тексту скрипта:

:local MacA – массив с именами пользователей и их mac адресами Wi-Fi. Используется для идентификации пользователей. Человек приходит на объект, его телефон присоединяется к Wi-Fi роутера и сигнализация выключает режим охраны. Естественно, на телефоне должно быть настроено автоматическое подключение к этому ssid и включена опция “использовать МАС адрес устройства”. Кстати, на телефон будет раздаваться интернет с роутера J.

:local DT Текущие дата и время устройства

:local linkD читаем сколько выключений интерфейса на момент запуска скрипта.

:global E4linkDown сколько выключений интерфейса было до момента запуска скрипта.

Логика работы: Проверяем, были ли срабатывания сигнализации с момента последнего запуска скрипта? Если нет, пишем в лог, обновляем E4linkDown и выходим – сработок не было. Если были, проверяем есть ли маки из таблицы MacA в регистрации Wi-Fi? Если есть пишем в лог, обновляем E4linkDown и выходим – сигналка выключена – хозяева на объекте. Если никого нет,  тревога – срабатывание без хозяев – шлем оповещение в телеграмм, если не получилось, дублируем на sms и email.

Скрипт нужно запускать регулярно (у меня 1 раз в минуту) с помощью scheduler

/system scheduleradd interval=1m name=TestAlarm on-event="/system script run TestAlarm\r\    \n" policy=read,write,policy,test start-time=startup

Использование камеры

Изображения с камер можно использовать по разному. Самый простой вариант сохранить в нужный момент в память микрота и переслать по email.

:local DT ("-=".[/system clock get date]."=".[/system clock get time]."=-");/tool fetch url="http://192.168.5.2/ISAPI/Streaming/channels/101/picture" user="admin" password="XXXX" http-auth-scheme=digest dst-path="Obj.jpg":delay 3s/tool e-mail send to="xxxx@xxx.ru" subject="Foto obj" body="$DT" file="Obj.jpg":delay 5s/file remove "Obj.jpg" 

Но памяти на этой модели не много, да и при интенсивном использовании появляются битые сектора, поэтому вариант не очень хороший. Можно подключить по USB кардридер с внешним питанием, и писать картинки на флешку.

Я делаю по-другому. У меня есть сервер умного дома, и сигнализация подключена к его внутренней сети. Сигнал тревоги вместе с оповещением поступает на сервер, а уже сервер обращается к камере и забирает картинку. Для упрощения конфига эта часть в нем не показана.

Что можно доделать

  1. В один шлейф можно подключить много датчиков (извещателей) последовательно, или параллельно, если контакты нормально разомкнуты.

  2. Так как у нас есть еще три свободных  порта, то можно организовать еще один независимый  шлейф сигнализации и оповещать, какой контур сработал.

  3. У нас есть PoEout порт, на него можно включить звуковое/световое оповещение.

  4. На свободные порты можно повесить секретную кнопку вкл/выкл сигнализации,  или не секретную – вызов охраны.

Скрытый текст
Mikrotik + HiWatch

Mikrotik + HiWatch
Блок резервного питания

Блок резервного питания

ссылка на оригинал статьи https://habr.com/ru/articles/1055610/