Mikrotik

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

akininav
Сообщения: 12
Зарегистрирован: Ср мар 06, 2019 7:55 pm
Благодарил (а): 2 раза
Поблагодарили: 4 раза

Re: Mikrotik

Сообщение akininav » Чт мар 07, 2019 8:31 pm

В общем сделал передачу подключенных WIFI клиентов с mikrotik в PHP скрипт. сразу скажу, что делалось все под CAPsMAN. с обычным WIFI работать не будет.
Разница с реализацией "Bagir" в том, что инициатором отправки выступает не mojerdomo а сам микрот.

скрипт для микрота. вставляется в system -> scheduler. запуск скрипта при загрузки системы
СпойлерПоказать
#переменные
:local url "http://192.168.10.1:8080/mikrot.php"; #вызываемый скрипт
:local delay 10; #период отправки данный в сек.

while (true) do={
:set $str "";
:local cltmp [/caps-man registration-table print count-only]; #Определяем кол-во подключеных клиентов
:local counts ($cltmp-1); #т.к. массив начинается с 0 то уменьшаем на 1.

:local li [:toarray ""];
:for x from=0 to= $counts do={ #вытаскиваем клиентов WIFI и формируем строку _POST
:local client [/caps-man registration-table get number=$x interface ];
:local macadd [/caps-man registration-table get number=$x mac-address ];
:local rx [/caps-man registration-table get number=$x rx-signal ];
if ($str = nil) do= {
:set $str "$client;$macadd;$rx";
} else={
:set $str "$str|$client;$macadd;$rx";
}
}

# отправка запроса на сервере.

:do {
/tool fetch mode=http url=$url keep-result=no http-method="post" http-data="wifi=$str" ;

} on-error={ log warning "Mojerdomo: Send to server Failed!" }
:delay $delay;

}
ну и сам скрипт в PHP
СпойлерПоказать
<?php

$ip = $_SERVER['REMOTE_ADDR'];
$array=$_POST['wifi'];

$tmp1 = explode('|', $array); //разбиваем по переданным элементы строки

foreach ($tmp1 as $i) {
list($interface, $mac ,$rx) = explode(";", $i); //вытаскиваем переменные
// echo ("if=$if <br/> mac=$mac <br/>rx=$rx <br/>");
if ($mac != ''){
$wificlienttmp['interface'] = $interface;
$wificlienttmp['mac'] = $mac;
$wificlienttmp['rx'] = $rx;
$wificlienttmp['ip'] = $ip;
$wificlient[] = $wificlienttmp;
}
}

// на выходе получаем массив $wificlient со всеми mac-адресами и к какой точки доступа подключен клиент. дальше пинайте куда надо.

Вообщем мой результат таков

Скрипт на микротике:
СпойлерПоказать
:local url "http://192.168.88.100/mikrot.php";
:set $str "";
:foreach i in=[/caps-man registration-table find] do={
:local mac [/caps-man registration-table get $i mac-address];
:local ip [/ip dhcp-server lease get [/ip dhcp-server lease find where mac-address="$mac"] address];
:local getcomment [/ip dhcp-server lease get [/ip dhcp-server lease find where address="$ip"] comment];
:local hostname [/ip dhcp-server lease get [/ip dhcp-server lease find where mac-address="$mac"] host-name];
:local capnumber [/caps-man registration-table get [/caps-man registration-table find where mac-address="$mac"] interface];
:local rxsignal [/caps-man registration-table get [/caps-man registration-table find where mac-address="$mac"] rx-signal];
:local uptime [/caps-man registration-table get [/caps-man registration-table find where mac-address="$mac"] uptime];
:set $str "$str|$getcomment;$hostname;$capnumber;$rxsignal;$ip;$mac;$uptime";
}
:do {
/tool fetch mode=http url=$url keep-result=yes dst-path="result.txt" http-method="post" http-data="wifi=$str";
} on-error={ log warning "Mojerdomo: Send to server Failed!" }
Скрипт PHP такой:
СпойлерПоказать
<?php

$ip = $_SERVER['REMOTE_ADDR'];
$array=$_POST['wifi'];
print_r($array);

$tmp1 = explode('|', $array); //разбиваем по переданным элементы строки

foreach ($tmp1 as $i) {
list($getcomment, $hostname, $capnumber, $rxsignal, $ip, $mac, $uptime) = explode(";", $i); //вытаскиваем переменные

if ($mac != ''){
$wificlienttmp['getcomment'] = $getcomment;
$wificlienttmp['hostname'] = $hostname;
$wificlienttmp['capnumber'] = $capnumber;
$wificlienttmp['rxsignal'] = $rxsignal;
$wificlienttmp['ip'] = $ip;
$wificlienttmp['mac'] = $mac;
$wificlienttmp['uptime'] = $uptime;
$wificlient[] = $wificlienttmp;
}
}
В команде fetch я поставил получение результата и в полученном файле вижу только всю эту информацию в строчку (то есть массив не разбивает на части) хотя сначала это делал, что я задел так и не понял, голова кругом в поиске этой ошибке.
p.s. - утром на свежую голову разобрался print_r($wificlienttmp); :D

А вот как связать это с majordomo, совсем не знаю, так как с php не дружу, ну или он со мной))
Если кто подскажет, буду очень благодарен.
Аватара пользователя
Amarok
Сообщения: 1425
Зарегистрирован: Пт дек 14, 2012 12:24 pm
Откуда: Россия, Нижняя Тура
Благодарил (а): 460 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Mikrotik

Сообщение Amarok » Пт мар 08, 2019 1:23 pm

akininav писал(а):
Чт мар 07, 2019 10:23 am
В общем сделал передачу подключенных WIFI клиентов с mikrotik в PHP скрипт. сразу скажу, что делалось все под CAPsMAN. с обычным WIFI работать не будет.
А под wifi можно переделать?
Алиска живёт на Ubuntu Server 14.04.3 LTS
connect, группа в Telegram, Яндекс.Деньги для благодарностей за помощь: 41001355945165
akininav
Сообщения: 12
Зарегистрирован: Ср мар 06, 2019 7:55 pm
Благодарил (а): 2 раза
Поблагодарили: 4 раза

Re: Mikrotik

Сообщение akininav » Пт мар 08, 2019 5:04 pm

А под wifi можно переделать?
Конечно!
Там просто по сути немного меняется путь из которого данные вытягиваются и значения.

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

Код: Выделить всё

:foreach i in=[/interface wireless registration-table find] do={
:local mac [/interface wireless registration-table get $i mac-address]
:local ip [/ip dhcp-server lease get [/ip dhcp-server lease find where mac-address="$mac"] address]
:local getcomment [/ip dhcp-server lease get [/ip dhcp-server lease find where address="$ip"] comment]
:local hostname [/ip dhcp-server lease get [/ip dhcp-server lease find where mac-address="$mac"] host-name]
:local wlannumber [/interface wireless registration-table get [/interface wireless registration-table find where mac-address="$mac"] interface]
:local signalstr [/interface wireless registration-table get [/interface wireless registration-table find where mac-address="$mac"] signal-strength]
:local uptime [/interface wireless registration-table get [/interface wireless registration-table find where mac-address="$mac"] uptime]
:put "$getcomment"
:put "$hostname"
:put "$wlannumber"
:put "$signalstr"
:put "$ip"
:put "$mac"
:put "$uptime"
:put ""
}
Если заработает, то вот скрипт для планировщика
СпойлерПоказать

Код: Выделить всё

:local url "http://0.0.0.0/mikrot.php";
:set $str "";
:foreach i in=[/interface wireless registration-table find] do={
:local mac [/interface wireless registration-table get $i mac-address]
:local ip [/ip dhcp-server lease get [/ip dhcp-server lease find where mac-address="$mac"] address]
:local getcomment [/ip dhcp-server lease get [/ip dhcp-server lease find where address="$ip"] comment]
:local hostname [/ip dhcp-server lease get [/ip dhcp-server lease find where mac-address="$mac"] host-name]
:local wlannumber [/interface wireless registration-table get [/interface wireless registration-table find where mac-address="$mac"] interface]
:local signalstr [/interface wireless registration-table get [/interface wireless registration-table find where mac-address="$mac"] signal-strength]
:local uptime [/interface wireless registration-table get [/interface wireless registration-table find where mac-address="$mac"] uptime]
:set $str "$str|$getcomment;$hostname;$wlannumber;$signalstr;$ip;$mac;$uptime";
}
:do {
/tool fetch mode=http url=$url keep-result=no http-method="post" http-data="wifi=$str" ;
} on-error={ log warning "Mojerdomo: Send to server Failed!" }
Вот php (но с ним я думаю вы гораздо лучше меня знакомы)
СпойлерПоказать

Код: Выделить всё

<?php

$ip = $_SERVER['REMOTE_ADDR'];
$array=$_POST['wifi'];
print_r($array);

$tmp1 = explode('|', $array); //разбиваем по переданным элементы строки

foreach ($tmp1 as $i) { 
list($getcomment, $hostname ,$wlannumber, $signalstr , $ip, $mac, $uptime) = explode(";", $i); //вытаскиваем переменные 

echo ("getcomment=$getcomment");

if ($mac != '')
{
$wificlienttmp['getcomment'] = $getcomment;
$wificlienttmp['hostname'] = $hostname;
$wificlienttmp['wlannumber'] = $wlannumber;
$wificlienttmp['signalstr '] = $signalstr ;
$wificlienttmp['ip'] = $ip;
$wificlienttmp['mac'] = $mac;
$wificlienttmp['uptime'] = $uptime;
$wificlient[] = $wificlienttmp;
}
}
P.S. Работает, проверил на свободном роутере)

Надеюсь у Вас все получится и подскажете мне как эти отправленные данные запихивать в majordomo :)
Maxtor
Сообщения: 13
Зарегистрирован: Сб мар 31, 2018 3:02 pm
Благодарил (а): 10 раз
Поблагодарили: 1 раз

Re: Mikrotik

Сообщение Maxtor » Сб мар 09, 2019 12:10 pm

Доброго времени суток ! Народ а по подробний можете расписать куда что выписывать на тике в маджор домо? У меня тик настроен в капсмане
Plug
Сообщения: 106
Зарегистрирован: Сб янв 20, 2018 12:33 am
Благодарил (а): 42 раза
Поблагодарили: 7 раз

Re: Mikrotik

Сообщение Plug » Вт июл 09, 2019 2:12 pm

В обновлении Mikrotik после 6.43 изменился метод аутоидентификации. Кто-нибудь уже разобрался, а то я в этом не силен?

P.S. Нашел исправленный RouterOS PHP API class v1.6.1. С ним работает новый метод аутоидентификации. Просто замените старый на новый.
Внимание это только для версий Микротик после 6.43!!!
routeros_api.class.txt
Соответственно изменить расширение файла с txt на php
(14.14 КБ) 385 скачиваний
Аватара пользователя
Amarok
Сообщения: 1425
Зарегистрирован: Пт дек 14, 2012 12:24 pm
Откуда: Россия, Нижняя Тура
Благодарил (а): 460 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Mikrotik

Сообщение Amarok » Чт июл 25, 2019 8:11 am

Plug писал(а):
Вт июл 09, 2019 2:12 pm
В обновлении Mikrotik после 6.43 изменился метод аутоидентификации. Кто-нибудь уже разобрался, а то я в этом не силен?

P.S. Нашел исправленный RouterOS PHP API class v1.6.1. С ним работает новый метод аутоидентификации. Просто замените старый на новый.
Внимание это только для версий Микротик после 6.43!!!
routeros_api.class.txt
В конце файла нет Допишите и всё заработает
Алиска живёт на Ubuntu Server 14.04.3 LTS
connect, группа в Telegram, Яндекс.Деньги для благодарностей за помощь: 41001355945165
Аватара пользователя
igorewa
Сообщения: 515
Зарегистрирован: Ср дек 21, 2016 11:54 pm
Откуда: Киев
Благодарил (а): 12 раз
Поблагодарили: 43 раза

Re: Mikrotik

Сообщение igorewa » Чт июл 25, 2019 10:23 am

Я файл заменил, в конце дописал ?>, но все равно не работает и получаю вот такие ошибки
СпойлерПоказать

Код: Выделить всё

Fatal error: Uncaught Error: Class 'routeros_api' not found in C:\_majordomo\htdocs\modules\scripts\scripts.class.php(151) : eval()'d code:5 Stack trace: #0 
C:\_majordomo\htdocs\modules\scripts\scripts.class.php(151): eval() #1 
C:\_majordomo\htdocs\modules\scripts\scripts.class.php(201): scripts->runScript('80') #2 C:\_majordomo\htdocs\modules\scripts\scripts.class.php(104): scripts->admin(Array) #3 C:\_majordomo\htdocs\lib\jTemplate.class.php(713) : eval()'d code(8): scripts->run() #4 C:\_majordomo\htdocs\lib\jTemplate.class.php(713): eval() #5 
C:\_majordomo\htdocs\lib\jTemplate.class.php(195): jTemplate->parseModules('...', Array, './templates/') #6 C:\_majordomo\htdocs\lib\jTemplate.class.php(109): jTemplate->parse('...', Array, './templates/') #7 C:\_majordomo\htdocs\lib\parser.class.php(93): jTemplate->__construct('./templates/pan...', Array, Object(panel)) #8 C:\_majordomo\htdocs\lib\parser.class.php(63): parser->jtemplate_parse('./templates/pan...', Array) #9 
C:\_majordomo\htdocs\modul in C:\_majordomo\htdocs\modules\scripts\scripts.class.php(151) : eval()'d code on line 5
Прошивка на микротике RouterOS v6.45.1
ASUS H110T, I5 7500, DDR4-16Gb, SSD256 . WIN10 64 (LTSB)
Аватара пользователя
igorewa
Сообщения: 515
Зарегистрирован: Ср дек 21, 2016 11:54 pm
Откуда: Киев
Благодарил (а): 12 раз
Поблагодарили: 43 раза

Re: Mikrotik

Сообщение igorewa » Чт июл 25, 2019 10:31 am

igorewa писал(а):
Чт июл 25, 2019 10:23 am
Я файл заменил, в конце дописал ?>, но все равно не работает и получаю вот такие ошибки
СпойлерПоказать

Код: Выделить всё

Fatal error: Uncaught Error: Class 'routeros_api' not found in C:\_majordomo\htdocs\modules\scripts\scripts.class.php(151) : eval()'d code:5 Stack trace: #0 
C:\_majordomo\htdocs\modules\scripts\scripts.class.php(151): eval() #1 
C:\_majordomo\htdocs\modules\scripts\scripts.class.php(201): scripts->runScript('80') #2 C:\_majordomo\htdocs\modules\scripts\scripts.class.php(104): scripts->admin(Array) #3 C:\_majordomo\htdocs\lib\jTemplate.class.php(713) : eval()'d code(8): scripts->run() #4 C:\_majordomo\htdocs\lib\jTemplate.class.php(713): eval() #5 
C:\_majordomo\htdocs\lib\jTemplate.class.php(195): jTemplate->parseModules('...', Array, './templates/') #6 C:\_majordomo\htdocs\lib\jTemplate.class.php(109): jTemplate->parse('...', Array, './templates/') #7 C:\_majordomo\htdocs\lib\parser.class.php(93): jTemplate->__construct('./templates/pan...', Array, Object(panel)) #8 C:\_majordomo\htdocs\lib\parser.class.php(63): parser->jtemplate_parse('./templates/pan...', Array) #9 
C:\_majordomo\htdocs\modul in C:\_majordomo\htdocs\modules\scripts\scripts.class.php(151) : eval()'d code on line 5
Прошивка на микротике RouterOS v6.45.1
С этим разобрался, нужно заменить

Код: Выделить всё

class RouterosAPI
на

Код: Выделить всё

class routeros_api
За это сообщение автора igorewa поблагодарил:
Amarok (Чт июл 25, 2019 2:02 pm)
Рейтинг: 1.16%
ASUS H110T, I5 7500, DDR4-16Gb, SSD256 . WIN10 64 (LTSB)
Plug
Сообщения: 106
Зарегистрирован: Сб янв 20, 2018 12:33 am
Благодарил (а): 42 раза
Поблагодарили: 7 раз

Re: Mikrotik

Сообщение Plug » Чт июл 25, 2019 6:30 pm

igorewa писал(а):
Чт июл 25, 2019 10:31 am
С этим разобрался, нужно заменить
КОД: ВЫДЕЛИТЬ ВСЁ

class RouterosAPI
на
КОД: ВЫДЕЛИТЬ ВСЁ

class routeros_api
Про это писали примерно в середине темы. По хорошему надо чтобы кто-то шапку нормальную сделал (собрать бы туда все наработки, а то все по теме разбросано).
За это сообщение автора Plug поблагодарил:
Maxtor (Сб июн 13, 2020 2:49 pm)
Рейтинг: 1.16%
Аватара пользователя
Bagir
Сообщения: 1613
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 374 раза

Re: Mikrotik

Сообщение Bagir » Пн авг 05, 2019 1:41 am

Тоже в один момент обнаружил, что больше не могу подключиться к роутеру. Причем вся система стала сильно тормозить. Оно и понятно, при выполнении скрипт каждый раз ожидал подключения 3 секунды.

В итоге после замены класса на
* RouterOS PHP API class v1.6
* Author: Denis Basta
удалось подключиться к микротику с прошивкой 6.45.2

Сейчас уже доступна 6.45.3 Обратите внимание на описание в прошивке!
Important note!!!
Due to removal of compatibility with old version passwords in this version, downgrading to any version prior to v6.43 (v6.42.12 and older) will clear all user passwords and allow password-less authentication. Please secure your router after downgrading.
Old API authentication method will also no longer work, see documentation for new login procedure:
https://wiki.mikrotik.com/wiki/Manual:API#Initial_login
после обновления понадобится новый класс RouterOS

Так же стоит проверить, сразу ли вы подключайтесь к роутеру. Дело в том, что в классе v1.6 есть уже два способа. Если первый не срабатывает, то используется второй. Но при этом вы, и вся система, ждете лишнее время.
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
Ответить