Mikrotik

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

Модератор: immortal

pdmitry2
Сообщения: 90
Зарегистрирован: Ср фев 06, 2013 1:12 pm
Откуда: Россия, Москва
Благодарил (а): 35 раз
Поблагодарили: 6 раз

Re: Mikrotik

Сообщение pdmitry2 » Ср май 03, 2017 2:13 pm

Всем привет! Пользуюсь этим скриптом и классом Bagir, довольно долго:
СпойлерПоказать

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

$ip = gg('Mikrotik_IP');
$login = gg('Mikrotik_login');
$password = gg('Mikrotik_password');


$API = new routeros_api();
if ($API->connect($ip, $login, $password)) {
 // Получить все объекты класса
 $objects = getObjectsByClass('WiFiDevice'); 


 // WIFI клиенты ведущей точки 
 $ARRAYm = $API->comm('/interface/wireless/registration-table/print');
 // WIFI клиенты ведомых точек
 $ARRAYc = $API->comm('/caps-man/registration-table/print');
 // Объединяем массивы
 $ARRAY = array_merge($ARRAYm,$ARRAYc);
 //print_r($ARRAY);
 
 // перебор объектов класса WiFiDevice
 foreach ($objects as $obj) {
  $obj=getObject($obj['TITLE']);
  $f=0;
  
  
  // перебор массива роутера 
  foreach ($ARRAY as $i => $arr) {
   if ($obj->getProperty('MAC') == $arr['mac-address']) {
    $obj->setProperty('lastActive' , date("Y-m-d H:i:s",time()));
    
    // Вызов метода Found
    if (!$obj->getProperty('online')) {
     $j=$obj->getProperty('holdCycles');
     if (!$j) { $j=1; }
     $obj->setProperty('online', $j); 
     $j=0; //свободна
     $obj->callMethod('Found');
    }

    // удаляем элемент массива
    unset($ARRAY[$i]);
    $f=1;
    // break; 
   }
  }
 
  // если MAC этого объекта в массиве роутера нет
  // Уменьшить свойство online. Когда достигнет нуля, вызвать метод Lost
  if (!$f) {
   $j=$obj->getProperty('online');
   if ($j) {
    $j=$j-1;
    $obj->setProperty('online', $j); 
    // Вызов метода Lost
    if (!$j) { $obj->callMethod('Lost'); }
   }
   $j=0; //свободна
  } 
 
 }

 
 // перебор оставщихся MAC адресов массива роутера
 foreach ($ARRAY as $arr) {
  // Создание нового объекта
  addClassObject('WiFiDevice', 'wifi_'.$arr['mac-address']);
  $obj=getObject('wifi_'.$arr['mac-address']);
  $obj->setProperty('MAC', $arr['mac-address']); 
  $obj->setProperty('name', 'Неизвестный девайс'); 
  $obj->setProperty('lastActive' , date("Y-m-d H:i:s",time()));
  $obj->setProperty('notify' , '20');
  $obj->setProperty('online', '1');
  $obj->setProperty('holdCycles', '2'); 
  $obj->callMethod('Found');
 } 
 

  /*
  // список выданных адресов 
   $ARRAY = $API->comm('/ip/dhcp-server/lease/print');
   print_r($ARRAY);
 
  // о системе
   $ARRAY = $API->comm('/system/resource/print');
   print_r($ARRAY);
  */
 
  $API->disconnect();
  // echo ('ok'); 

} else { echo 'error'; }


setTimeOut('getWiFiclientsTimer',"runScript('getWiFiclients');",10);
Но несколько месяцев назад, в дебаге стали появляться ошибки. Скрипт стал выполняться долго и подвешивать систему. При этом wi fi клиенты, определяются и всё работает. Помогите поправить. Система дебиан. Использую альфу.
СпойлерПоказать
14:04:41 0.13498400 Error executing job WiFiclientsTimer (11343877): (/var/www/***/lib/common.class.php)
14:04:41 0.13466100 Geturl to 192.168.1.3:80/objects/?job=11343877 (source runScheduledJobs) finished with error:
Operation timed out after 60001 milliseconds with 0 bytes received
{"url":"HTTP:\/\/192.168.1.3:80\/objects\/?job=11343877","content_type":null,"http_code":0,"header_size":0,"request_size":166,"filetime":-1,"ssl_verify_result":0,"redirect_count":0,"total_time":59.055497,"namelookup_time":5.4e-5,"connect_time":0.000215,"pretransfer_time":0.000316,"size_upload":0,"size_download":0,"speed_download":0,"speed_upload":0,"download_content_length":-1,"upload_content_length":-1,"starttransfer_time":0,"redirect_time":0,"redirect_url":"","primary_ip":"192.168.1.3","certinfo":[],"primary_port":80,"local_ip":"192.168.1.3","local_port":60613}
14:04:15 0.72500800 Closing socket.
14:03:46 0.92444200 Closing socket.
14:03:38 0.11998000 Error executing job WiFiclientsTimer (11343805): (/var/www/***/lib/common.class.php)
14:03:38 0.11968800 Geturl to 192.168.1.3:80/objects/?job=11343805 (source runScheduledJobs) finished with error:
Operation timed out after 60001 milliseconds with 0 bytes received
{"url":"HTTP:\/\/192.168.1.3:80\/objects\/?job=11343805","content_type":null,"http_code":0,"header_size":0,"request_size":166,"filetime":-1,"ssl_verify_result":0,"redirect_count":0,"total_time":59.051764,"namelookup_time":6.1e-5,"connect_time":0.000202,"pretransfer_time":0.000303,"size_upload":0,"size_download":0,"speed_download":0,"speed_upload":0,"download_content_length":-1,"upload_content_length":-1,"starttransfer_time":0,"redirect_time":0,"redirect_url":"","primary_ip":"192.168.1.3","certinfo":[],"primary_port":80,"local_ip":"192.168.1.3","local_port":60587}
192.168.1.3 это адрес сервера, в локальной сети.
Аватара пользователя
Bagir
Сообщения: 1613
Зарегистрирован: Вт сен 17, 2013 6:46 pm
Откуда: Ярославская область город Углич
Благодарил (а): 212 раз
Поблагодарили: 374 раза

Re: Mikrotik

Сообщение Bagir » Ср май 03, 2017 4:28 pm

Наврятли кто то сможет точно назвать причину. Мало данных. Но можно попробовать её поискать. Я бы попробовал засунуть какой нибудь простой код в этот скрипт. Пускай он что нибудь делает. Например говорит нам "Привет". А код из скрипта засунуть например в метод объекта и просто самому вызывать его несколько раз, контролируя что происходит. Ну а по результатам будет думать. Если всё же глючит код, то можно попробовать для теста выпотрошить его как можно больше. А потом искать, где именно начинаются проблемы.
Я гоняю этот код уже очень давно. Работает как часы. Запуск каждые 5 секунд. Что тут сказать, микротик рулит. Забираю инфу о WiFi клиентах. Так я дополнительно определяю кто из людей пришел, а кто ушел. Работает даже совместно с бесшовным роумингом CAPsMAN. У меня сейчас три микротика так в сеть объединены. Можно даже получать на каком именно микротике сейчас клиент. Пока что я не придумал, для чего мне это может быть полезно, кроме как просто для забавы :)
Windows 10, HTTP, MegaD, Z-Wave, 1-Wire, CONNECT
pdmitry2
Сообщения: 90
Зарегистрирован: Ср фев 06, 2013 1:12 pm
Откуда: Россия, Москва
Благодарил (а): 35 раз
Поблагодарили: 6 раз

Re: Mikrotik

Сообщение pdmitry2 » Ср май 03, 2017 4:44 pm

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

Re: Mikrotik

Сообщение Amarok » Ср май 03, 2017 8:46 pm

Bagir, а как вывести не только МАК, но и ИП найденного устройства? пример бы =)
Алиска живёт на Ubuntu Server 14.04.3 LTS
connect, группа в Telegram, Яндекс.Деньги для благодарностей за помощь: 41001355945165
Аватара пользователя
igorewa
Сообщения: 515
Зарегистрирован: Ср дек 21, 2016 11:54 pm
Откуда: Киев
Благодарил (а): 12 раз
Поблагодарили: 43 раза

Re: Mikrotik

Сообщение igorewa » Ср май 03, 2017 9:41 pm

Подскажите пожалуйста куда вносить IP микротика, логин и пароль? Указывать эти данные прямо в скрипте не хочется тк через CONNECT все увидят эти данные. Я так понимаю что нужно указывать в свойствах какого то объекта, можно тут подробнее ? Спасибо
ASUS H110T, I5 7500, DDR4-16Gb, SSD256 . WIN10 64 (LTSB)
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Mikrotik

Сообщение sergejey » Чт май 04, 2017 11:59 am

igorewa писал(а):Подскажите пожалуйста куда вносить IP микротика, логин и пароль? Указывать эти данные прямо в скрипте не хочется тк через CONNECT все увидят эти данные. Я так понимаю что нужно указывать в свойствах какого то объекта, можно тут подробнее ? Спасибо
Вы можете в том же объекте ThisComputer добавить вручную свойства и внести данные, чтобы использовать их в своём скрипте.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Аватара пользователя
igorewa
Сообщения: 515
Зарегистрирован: Ср дек 21, 2016 11:54 pm
Откуда: Киев
Благодарил (а): 12 раз
Поблагодарили: 43 раза

Re: Mikrotik

Сообщение igorewa » Чт май 04, 2017 1:22 pm

А можно как то сделать что если появилось неизвестное устройство , что бы оповещений было несколько, или что бы оповещало постоянно с периодичностью в 10 минут, пока не опознаешь это устройство. Или что бы отправлялось сообщение в телеграмм. Вдруг меня нет дома, кто то кто знает пароль от WiFi подключился к моей сети, и я об этом узнаю только если посмотрю сам.
ASUS H110T, I5 7500, DDR4-16Gb, SSD256 . WIN10 64 (LTSB)
krashn056
Сообщения: 35
Зарегистрирован: Пн янв 20, 2014 9:28 pm
Благодарил (а): 4 раза
Поблагодарили: 1 раз

Re: Mikrotik

Сообщение krashn056 » Ср апр 04, 2018 10:39 pm

Приветствую, подскажите плиз, при выполнение сценария getWiFiclients пишет error, на роутере запросов не каких!!??(
TheForum
Сообщения: 146
Зарегистрирован: Сб авг 06, 2016 2:11 am
Откуда: Рига
Благодарил (а): 13 раз
Поблагодарили: 18 раз

Re: Mikrotik

Сообщение TheForum » Чт апр 05, 2018 12:14 am

А вы указали IP рутера, его логин и пароль в переменных? У меня уже пару лет скрипт работает...
По шагам (У меня win7 64bit):
1. В папку C:\_majordomo\htdocs\lib добавляете файл routeros_api.class.php;
2. Создаете у объекта ThisComputer 3 новых свойства и вводите свои данные:
ThisComputer.Mikrotik_IP
192.168.0.3 (введите свои данные)
ThisComputer.Mikrotik_login
admin
ThisComputer.Mikrotik_password
pass
3. Скрипт который я использую (называем его getWiFiclients):

$ip = gg('Mikrotik_IP');
$login = gg('Mikrotik_login');
$password = gg('Mikrotik_password');


$API = new routeros_api();
if ($API->connect($ip, $login, $password)) {
// Получить все объекты класса
$objects = getObjectsByClass('WiFiDevice');


// WIFI клиенты ведущей точки
$ARRAYm = $API->comm('/interface/wireless/registration-table/print');
// WIFI клиенты ведомых точек
$ARRAYc = $API->comm('/caps-man/registration-table/print');
// Объединяем массивы
$ARRAY = array_merge($ARRAYm,$ARRAYc);
//print_r($ARRAY);

// перебор объектов класса WiFiDevice
foreach ($objects as $obj) {
$obj=getObject($obj['TITLE']);
$f=0;


// перебор массива роутера
foreach ($ARRAY as $i => $arr) {
if ($obj->getProperty('MAC') == $arr['mac-address']) {
$obj->setProperty('lastActive' , date("Y-m-d H:i:s",time()));

// Вызов метода Found
if (!$obj->getProperty('online')) {
$j=$obj->getProperty('holdCycles');
if (!$j) { $j=1; }
$obj->setProperty('online', $j);
$j=0; //свободна
$obj->callMethod('Found');
}

// удаляем элемент массива
unset($ARRAY[$i]);
$f=1;
// break;
}
}

// если MAC этого объекта в массиве роутера нет
// Уменьшить свойство online. Когда достигнет нуля, вызвать метод Lost
if (!$f) {
$j=$obj->getProperty('online');
if ($j) {
$j=$j-1;
$obj->setProperty('online', $j);
// Вызов метода Lost
if (!$j) { $obj->callMethod('Lost'); }
}
$j=0; //свободна
}

}


// перебор оставщихся MAC адресов массива роутера
foreach ($ARRAY as $arr) {
// Создание нового объекта
addClassObject('WiFiDevice', 'wifi_'.$arr['mac-address']);
$obj=getObject('wifi_'.$arr['mac-address']);
$obj->setProperty('MAC', $arr['mac-address']);
$obj->setProperty('name', 'Неизвестный девайс');
$obj->setProperty('lastActive' , date("Y-m-d H:i:s",time()));
$obj->setProperty('notify' , '20');
$obj->setProperty('online', '1');
$obj->setProperty('holdCycles', '2');
$obj->callMethod('Found');
}

/*

// список выданных адресов
$ARRAY = $API->comm('/ip/dhcp-server/lease/print');
print_r($ARRAY);

// о системе
$ARRAY = $API->comm('/system/resource/print');
print_r($ARRAY);
*/

$API->disconnect();
// echo ('ok');

} else { echo 'error'; }


setTimeOut('getWiFiclientsTimer',"runScript('getWiFiclients');",10);

4. в OnNewMinute добавляем:
// Обновляем данные с Mikrotik
if (!($m%20)) {
runScript('getWiFiclients');
}
5. Если все запустилось, то в объектах появится класс WiFiDevice (Слежение за WiFi устройствами)
там появятся MAC адреса найденных устройств типа:
wifi_08:08:C2:F7:D5:F5
нажимаете и добавпяете описание. В свойствах вместо "Неизвестный девайс" вводите название.
6. Пользуетесь :)
7. Разбираетесь дальше :)
Немного желания, терпения и времени - и все получится :)
Plug
Сообщения: 106
Зарегистрирован: Сб янв 20, 2018 12:33 am
Благодарил (а): 42 раза
Поблагодарили: 7 раз

Re: Mikrotik

Сообщение Plug » Чт апр 05, 2018 2:02 pm

Не получается. При запуске скрипта выдает ошибку:
Fatal error: Uncaught Error: Class 'routeros_api' not found in C:\_majordomo\htdocs\modules\scripts\scripts.class.php(150) : eval()'d code:6 Stack trace: #0 C:\_majordomo\htdocs\modules\scripts\scripts.class.php(150): eval() #1 C:\_majordomo\htdocs\modules\scripts\scripts.class.php(192): scripts->runScript('45') #2 C:\_majordomo\htdocs\modules\scripts\scripts.class.php(104): scripts->admin(Array) #3 C:\_majordomo\htdocs\lib\jTemplate.class.php(712) : eval()'d code(8): scripts->run() #4 C:\_majordomo\htdocs\lib\jTemplate.class.php(712): 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(150) : eval()'d code on line 6
Ответить