Для начала пара слов о том, что такое MikroTik. Это латвийский производитель сетевого оборудования, которое отличается невысокой ценой и широкой функциональностью. Основой для продуктов MikroTik является Router OS — сетевая операционная система на базе Linux. Эта ОС существует также в виде x86-дистрибутива, так что любой желающий может собрать мощный роутер на базе обычного ПК за скромную цену. Она же в различных своих вариантах устанавливается на RouterBOARD — линейку аппаратных решений MikroTik, которая включает в себя как чисто операторское оборудование, так и SOHO-решения.
Роутеры MikroTik могут быть оборудованы резервными WAN-каналами, например, кроме проводного интернета может быть и GSM-модем. В таком случае есть возможность запускать скрипты на MikroTik через SMS. Это позволяет управлять устройствами NetPing, у которых нет встроенного GSM-модема. Также данная функция может быть актуальна при недоступности web-интерфейса устройств NetPing через основную сеть Ethernet либо в случае зависания модема у устройства NetPing.
Как известно, Роутер ОС (Router OS) обладает колоссальным функционалом, в том числе возможностью управления различными функциями через скрипт-программирование. В частности, можно получить доступ непосредственно из роутера к функциям устройств NetPing компании ООО «Алентис Электроникс».
Описанные ниже настройки и параметры применимы для всех моделей устройств NetPing.
Такую возможность предоставляет команда ROS fetch, синтаксис которой подробно описан в https://wiki.mikrotik.com/wiki/Manual:Tools/Fetch.
Если нам в рамках нашей задачи требуется переключить встроенное реле устройства NetPing, достаточно следующей записи:
/tool fetch url=»http://adress:port/relay.cgi\?rN=X« mode=http user=visor password=ping dst-path=»NPanswer.txt»;
Где:
adress:port – адрес и порт устройства NetPing, например, 192.168.0.100. Если порт стандартный 80, то можно не указывать;
N – номер реле, число реле зависит от модели устройства (от 1 до 8-ми);
X – совершаемое действие над реле, где 1-включить, 0-выключить;
User, password – логин и пароль администратора NetPing, указаны по умолчанию;
dst-path – файл, в который будет записан ответ от устройства.
Ответ записывается в указанный файл в следующем виде:
relay_result(‘ok‘) – в случае успешного выполнения;
relay_result(‘error‘) – при невыполнении команды, например, при несоответствии переданных параметров.
Итак, приступим.
Создадим несколько «самодельных» функций, демонструющих возможности по управлению устройством NetPing из роутера MikroTik:
- NPstart – установка переменных для NetPing;
- FuncNPSetrele – установка реле (включение/выключение/изменение канала управления);
- FuncNPGetrele – получение статуса состояния реле;
- FuncNPTermo – функция опроса датчика температуры;
- FuncNPHamidity – функция опроса датчика влажности и температуры
Чтобы не повторять в скриптах одни и те же параметры, создадим глобальные переменные, видимые всем скриптам в роутере:
################ NPStart #####################
# установка переменных
#############################################
:global NPuser «visor»; # login пользователя NetPing
:global NPpass «ping»; # пароль пользователя
:global NPadr «192.168.0.100»; # адрес устройства NetPing
Дальше пишем наши функции:
################ FuncNPSetrele ###############
# Функция установки реле для устройств PDU NetPing
# by Sergej Serkov 25.09.2017
#############################################
# Входящие параметры:# Nrele – номер реле
# Rstatus – действие над реле (1-включить, 0-выключить)
# Пример обращения к функции:
# [$FuncNPSetrele Nrele=»2″ Rstatus=»1″]
# результат исполнения функции возвращается в переменной $NPanawer
# Определяем саму функцию установки реле:
:global FuncNPSetrele do={:global NPuser; :global NPpass; : global NPadr; :local StrFetchRele; :set StrFetchRele («http://».»$NPadr».»/relay.cgi\?r».»$Nrele».»=».»$Rstatus»); [/tool fetch url=$StrFetchRele mode=http user=$NPuser password=$NPpass dst-path=»NPanswer.txt»;];
:delay 2s;
:local NPanswer [/file get NPanswer.txt contents];
/file remove NPanswer.txt;
:return $NPanswer}
Теперь, если исполнить функцию с присвоением результата переменной, действие над реле будет исполнено, и можно будет прочитать ответ устройства.
Пример вызова функции FuncNPSetrele:
:global FuncNPSetrele; # объявляем функцию при вызове;
:local NPanswer [$FuncNPSetrele Nrele=»2″ Rstatus=»1″]; # реле №2 будет включено, ответ устройства передан в переменную $NPanswer.
:log info $NPanswer; # который можно прочитать, например в логе роутера MikroTik:
Пользуясь функцией FuncNPSetrele через параметр Rstatus, можно также устанавливать канал управления реле согласно документации на устройство. Значения каналов расшифрованы в следующей функции.
############## FuncNPGetrele ###############
# Функция опроса состояния реле PDU NetPing
# by Sergej Serkov 22.09.2017
###########################################
# Входной параметр – номер реле Nrele
# Пример вызова функции:
# [$FuncNPGetrele Nrele=»2″]
# Ответ возвращается в переменной $NPanswer
# Функция устанавливает также следующие глобальные переменные:
# ——————————————————————————
# $relechannel – источник управления реле, согласно документации NetPing:
# 0 — выключено вручную
# 1 — включено вручную
# 2 – работает от канала «Сторож»
# 3 — источник управления «Расписание»
# 4 — Сторож + Расписание
# 5 – управляется модулем «Логика»
# 6 – Логика + Расписание
# relestatus – текущее состояние реле:
# 0 — выключено
# 1 — включено
# Определяем функцию:
:global FuncNPGetrele do={:global NPuser; :global NPpass; global NPadr; :local StrFetchRele; :set StrFetchRele («http://».»$NPadr».»/relay.cgi\?r».»$Nrele»); [/tool fetch url=$StrFetchRele mode=http user=$NPuser password=$NPpass dst-path=»NPanswer.txt»;];
:delay 2s;
:local NPanswer [/file get NPanswer.txt contents];
/file remove NPanswer.txt;
:local endLoc;
:set $endLoc [:find $NPanswer «,»];
:global relechannel [:pick $NPanswer ($endLoc+2) ($endLoc+3)]; # Канал управления;
:global relestatus [:pick $NPanswer ($endLoc+5) ($endLoc+6)]; # Текущее состояние;
:return $NPanswer}
Вызов функции FuncNPGetrele может выглядеть так (если хотим опросить первое реле):
:global FuncNPGetrele; # не забываем объявлять при вызове саму функцию
:global relechannel; # и ее рабочие переменные
:global relestatus;
:local NPanswer [$FuncNPGetrele Nrele=»1″]; # функция будет выполнена и ответ устройства передан в переменную $NPanswer.
:log info $NPanswer; # которую можно также прочитать, например, в логе роутера.
Мы выдадим в лог удобную для понимания информацию о настройках и состоянии реле:
:local R 1
:log info «»;
:log info «——————————«;
:log warning («Реле».»$R»)
:log info («Источник управления: «. «$relechannel»);
:if ($relestatus=0) do={:log info «Реле выключено»} else={:log info «Реле включено»}
:log info «——————————«;
:log info «»;
Вот что увидим в логе роутера:
Каналы управления тоже, естественно, можно «расшифровать». В данном случае «3» — первое реле управляется через расписание.
################ FuncNPTermo ###############
# Функция опроса датчика температуры PDU NetPing
# by Sergej Serkov 25.09.2017
#############################################
# Для работы функции в NPtr необходимо передать номер опрашиваемого датчика# Ответ стандартно возвращается в переменной $NPanswer
# Пример применения c опросом второго датчика:
# [$FuncNPTermo NPtr=»2″]
# Сама функция опроса датчика температуры:
:global FuncNPTermo do={:global NPuser; :global NPpass; :local StrFetchTermo; :global NPadr; :set StrFetchTermo («http://».»$NPadr».»/thermo.cgi?t».»$NPtr»); [/tool fetch url=$StrFetchTermo mode=http user=$NPuser password=$NPpass dst-path=»NPanswer.txt»;];
:delay 2s;
:local NPanswer [/file get NPanswer.txt contents];
/file remove NPanswer.txt;
:return $NPanswer}
Вызываем нашу функцию, получаем значение температуры:
:global FuncNPTermo;
:local NPanswer [$FuncNPtermo NPtr=»2″];
:log info $NPanswer; # выводим ответ в лог:
То есть значение температуры на втором датчике 17 градусов.
Из заявленных планов остается функция опроса комбинированного датчика влажности и температуры. При этом у меня почему-то для корректной работы пришлось объявить номер датчика влажности «0» (к моему устройству NetPing 4/PWR-220 v3/SMS было подключено четыре 1-wire датчика температуры и один комбинированный датчик температуры и влажности).
################ FuncNPhumidity ###############
# Функции опроса датчика влажности и температуры PDU NetPing
# by Sergej Serkov 25.09.2017
##############################################
# Входной параметр Nhd «0»; # при вызове функции эта переменная должна содержать номер датчика влажности;# Вызов функций соответственно: [$FuncNPHtr Nhd=»0″] и [$FuncNPHhd Nhd=»0″]
# Возвращаемые данные в переменных:
# $NPhd – влажность;
# $NPtr – температура;
# Определяем функцию опроса температуры с датчика:
:global FuncNPHtr do={:global NPuser; :global NPpass; :global NPadr; :local StrFetchTR; :set StrFetchTR («http://».»$NPadr».»/relhum.cgi?t».»$Nhd»); [/tool fetch url=$StrFetchTR mode=http user=$NPuser password=$NPpass dst-path=»NPanswer.txt»;];
:delay 2s;
:local NPtr [/file get NPanswer.txt contents];
/file remove NPanswer.txt;
:return $NPtr}
# Функция влажности:
:global FuncNPHhd do={:global NPuser; :global NPpass; :global NPadr; :local StrFetchHD; :set StrFetchHD («http://».»$NPadr».»/relhum.cgi?h».»$Nhd»); [/tool fetch url=$StrFetchHD mode=http user=$NPuser password=$NPpass dst-path=»NPanswer.txt»;];
:delay 2s;
:local NPhd [/file get NPanswer.txt contents];
/file remove NPanswer.txt;
:return $NPhd}
Вызов наших функций:
:global FuncNPHtr;
:global FuncNPHhd;
:local NPtr [$FuncNPHtr Nhd=»0″];
:delay 5s;
:local NPhd [$FuncNPHhd Nhd=»0″];
:log info $NPtr;
:log info $NPhd;
В логе роутера видим отправку двух запросов к нашему датчику и два ответа. Первый – температура 13 градусов, второй – влажность 91%.
Таким образом, поставленные задачи решены. Мы можем управлять реле устройства NetPing непосредственно из скриптов роутера и получать значения его датчиков.
Некоторые полезные замечания
Следует помнить, что в Роутере ОС есть служебные символы. Если вы используете эти символы в пароле или имени устройства, то в скрипте их нужно экранировать. Например, если пароль представлен строкой $ergey, то, чтобы его правильно передать, в скрипте нужно экранировать первый символ знаком «\». То есть в нашем случае NPpass=»\$ergey».
Перед вызовом функций NetPing стоит проверить, доступно ли само устройство NetPing в сети на настоящий момент путём проверки на пинг. В роутере ОС это делается, например так, (скрипт найден на просторах Интернета, проверен):
:local PingCount 3; # количество пингов;
:local PingAdr $NPadr; # адрес устройства NetPing получим из NPadr
:local Iface «ether-2master»; # Имя интерфейса Вашей внутренней сети;
:local Result [/ping $PingAdr count=$PingCount interface=$Iface];
:local MainIfInetOk false;
:set MainIfInetOk ((3*$Result) >= (2 * $PingCount))
:put «MainIfInetOk=$MainIfInetOk»
if (!$MainIfInetOk) do={
/log error «Устройство NetPing не доступно в сети»
}
if ($MainIfInetOk) do={
/log warning «NP Connect OK»
/system script run NPstart;
… здесь вызываем нужные функции
}
Применение наших функций может быть самым разным:
- Например, если завести питание вашего MikroTik через реле NetPing, то роутер через скрипт-функцию FuncNPSetrele может сам себя выключать при наступлении заданных критических событий. Скрипт с проверкой таких событий нужно поместить в Планировщик роутера:
Пример выключения роутера, получающего питание с реле 1 устройства NetPing, при превышении температуры на плате роутера:
:if ([/system health get temperature] >50) do { global Nrele «1»; $FuncNPSetrele}
Роутер выключится при превышении температуры на плате выше 50 градусов. В примере сравнение дано условно, т.к. полученное из /system health строковое значение температуры на плате роутера сначала нужно преобразовать в число.
- Также можно включать какое-либо устройство в сети, например, файловый сервер, после подключения VPN-клиента к роутеру из внешней сети. После завершения VPN-сеанса пользователя файловый сервер можно также отключать нашей функцией. Это усилит защиту важных данных, т.к. файловый сервер будет физически выключен, пока клиент VPN не установил связь с сервером.
- При отсутствии в конкретной модели устройства NetPing GSM-модема, можно пользоваться USB-модемом роутера, подключив его к MikroTik для отправки ответов устройства NetPing через SMS.
Можно реализовать функции для других возможностей устройств NetPing, в том числе для управления IO-линиями. Функции целесообразно объединить в единую библиотеку (в один скрипт) и определять сразу при загрузке роутера, а вызывать по мере необходимости.
Блок функций для управления линиями ввода/вывода NetPing
Блок содержит всё, что поддерживают URL-команды по работе с линиями ввода/вывода устройств NetPing, а именно:
- настройка режима линии (вход/выход/выход логики);
- установка линии (лог 0, 1, инверсия линии);
- инверсия линии на заданное время в секундах;
- опрос состояния линии
################ Functions NetPing Library ###############
# Библиотека функций для работы с линиями
# ввода/вывода IOv2 NetPing
# версия 1.0
# by Sergej Serkov 01.12.2017
####################################################### FuncNPmodeIO — устанавливает режим работы линии ввода/вывода
# FuncNPSetIO — включает/выключает/инвертирует линию в режиме выхода
# FuncNPinvtimeIO — инвертирует линию на IOtime секунд в режиме выхода
# FuncNPGetIO — запрашивает состояние линии# общие переменные для всех функций NetPing
# доступ к устройству:global NPuser «visor»; # администратор NetPing-устройства
:global NPpass «ping»; # пароль доступа к устройству
:global NPadr «192.168.0.100»; # адрес устройства NetPing;################ FuncNPmodeIO #################
# Функция настройки I/O линии PDU NetPing
# by Sergej Serkov 01.12.2017
###############################################
# Применение:
# В качестве параметров функции в Nio нужно передавать номер линии ввода/вывода
# в IOmode — устанавливаемый режим линии (0-вход; 1-выход; 2-выход логики)
# Вызов функции
# [$FuncNPmodeIO Nio=»2″ IOmode=»1″]
# ответ исполнения возвращается в $NPanswer# определяем функцию, устанавливающую линию NetPing
:global FuncNPmodeIO do={:global NPuser; :global NPpass; : global NPadr; :local StrFetchIO;
:set StrFetchIO («http://».»$NPadr».»/io.cgi\?io».»$Nio».»&mode=».»$IOmode»); [/tool fetch url=$StrFetchIO mode=http user=$NPuser password=$NPpass dst-path=»NPanswer.txt»;];
:delay 2s;
:local NPanswer [/file get NPanswer.txt contents];
/file remove NPanswer.txt;
:return $NPanswer}################ FuncNPSetIO ###############
# Функция установки состояния I/O линии PDU NetPing
# by Sergej Serkov 01.12.2017
############################################## устанавливаемая линия должна быть сконфигурирована на вывод !
# обычно в устройствах NetPing применяется инвертированная логика линий:
# при логическом 0 на линии — нагрузка включается
# при логической 1 на линии — выключается
# для таких устройств нужно раскомментировать закомментированные строки
# этой функции — см. ниже# Применение:
# В качестве параметров функции в Nio нужно передавать номер линии ввода/вывода
# в IOstatus — совершаемое действие (0-выключить; 1-включить; f-инвертировать)
# Вызов функции
# [$FuncNPSetIO Nio=»2″ IOstatus=»1″]
# ответ исполнения возвращается в $NPanswer# определяем функцию, устанавливающую линию NetPing
:global FuncNPSetIO do={:global NPuser; :global NPpass; : global NPadr; :local StrFetchIO;# инвертирование статуса линии (для устройств NetPing с обратной логикой);
#:if ($IOstatus=0) do={:set $IOstatus 1} else={:set $IOstatus 0}:set StrFetchIO («http://».»$NPadr».»/io.cgi\?io».»$Nio».»=».»$IOstatus»); [/tool fetch url=$StrFetchIO mode=http user=$NPuser password=$NPpass dst-path=»NPanswer.txt»;];
:delay 2s;
:local NPanswer [/file get NPanswer.txt contents];
/file remove NPanswer.txt;
:return $NPanswer}################ FuncNPinvtimeIO ###################################
# Функция инвертирования состояния I/O линии PDU NetPing на время
# (выдача импульса)
# by Sergej Serkov 01.12.2017
################################################################### устанавливаемая линия должна быть сконфигурирована на вывод !
# обычно в устройствах NetPing применяется инвертированная логика линий:
# при логическом 0 на линии — нагрузка включается
# при логической 1 на линии — выключается
# для таких устройств нужно раскомментировать закомментированные строки
# этой функции — см. ниже# Применение:
# В качестве параметра функции в Nio нужно передавать номер линии ввода/вывода
# в IOtime — время инвертирования в секундах
# Вызов функции
# [$FuncNPSetIO Nio=»2″ IOtime=»5″]
# ответ исполнения возвращается в $NPanswer# определяем функцию, устанавливающую линию NetPing
:global FuncNPinvtimeIO do={:global NPuser; :global NPpass; : global NPadr; :local StrFetchIO;
:set StrFetchIO («http://».»$NPadr».»/io.cgi\?io».»$Nio».»=f,».»$IOtime»); [/tool fetch url=$StrFetchIO mode=http user=$NPuser password=$NPpass dst-path=»NPanswer.txt»;];
:delay 2s;
:local NPanswer [/file get NPanswer.txt contents];
/file remove NPanswer.txt;
:return $NPanswer}############## FuncNPGetIO ###############
# Функия опроса состояния I/O линии PDU NetPing
# by Sergej Serkov 01.12.2017
############################################ обычно в устройствах NetPing применяется инвертированная логика линий:
# при логическом 0 на линии — нагрузка включается
# при логической 1 на линии — выключается
# для таких устройств нужно раскомментировать закомментированные строки
# этой функции — см. ниже# Применение:
# В качестве параметра функции Nio нужно передавать номер линии ввода/вывода
# Например опрашиваем вторую линию :
# [$FuncNPGetIO Nio=»2″]# возвращает ответ NetPing в $NPanswer
# также возвращает в глобальной переменной:
# ——————————————————————————# IOstatus — состояние линии
# 0 — выключено;
# 1 — включено;# определяем функцию, возвращающую ответ от линии I/O NetPing
:global FuncNPGetIO do={:global NPuser; :global NPpass; global NPadr; :local StrFetchIO; :set StrFetchIO («http://».»$NPadr».»/io.cgi\?io».»$Nio»); [/tool fetch url=$StrFetchIO mode=http user=$NPuser password=$NPpass dst-path=»NPanswer.txt»;];
:delay 2s;
:local NPanswer [/file get NPanswer.txt contents];
/file remove NPanswer.txt;
:local endLoc;
:set $endLoc [:find $NPanswer «,»];
:global IOstatus [:tonum [:pick $NPanswer ($endLoc+6) ($endLoc+7)]]; # состояние линии;# инвертирование статуса линии (для устройств NetPing с обратной логикой);
# :if ($IOstatus=0) do={:set $IOstatus 1} else={:set $IOstatus 0}:return $NPanswer
}
Готовые файлы скриптов
Здесь можно скачать готовый файл скриптов с библиотекой функций NetPing для роутера MikroTik.
Для переноса их в роутер нужно мышкой перетащить файл funcNetPing.rsc в файлы роутера в популярной утилите для роутера MikroTik WINBOX (либо переслать его туда по FTP).
Затем в терминале роутера набрать команду:
/import file=filename.rsc
- Func_NP_libIO.rsc — содержит библиотеку функций для работы и линиями ввода-вывода в одном скрипте и каждую функцию отдельно, а также примеры их вызовов в скриптах. Рекомендуется использовать с устройством NetPing IO v 2
- Func_NP_library.rsc — библиотека всех функций (включая те, что были написаны ранее — работу с реле, датчиками температуры, влажности и новые — работы с I/O линиями также в одном скрипте в виде библиотеки и каждую функцию в отдельных скриптах, плюс примеры вызовов).
Функции в виде отдельных скриптов, всей библиотеки одним скриптом и примеры их вызовов будут импортированы в репозиторий скриптов роутера Микротик.
Свежие версии функций управления устройствами NetPing при помощи роутеров MikroTik доступны по ссылке http://apimikrotik.blogspot.ru/.
Автор: Серков Сергей Владимирович