Отечественная компания «Лайт Коммуникейшн» выпускает достаточно интересные устройства, позволяющие осуществлять удалённый мониторинг температуры и поддерживающее до восьми датчиков - NetPing TS v2. Далее будет показано как автоматизировать процедуру сбора данных с устройства с помощью несложных скриптов на perl.
Для начала кратко опишем возможности устройства, декларируемые производителем:
- Управление по сети через удобный интерфейс,
- Поддержка SNMP trap,
- Поддержка syslog.
К сожалению все эти возможности имеют неприятные оговорки, которые были обнаружены уже после покупки устройства, а именно:
- Последняя на момент написания статьи стабильная прошивка (версия 50.4.5.B-8) имеет только telnet-интерфейс. Есть более новые прошивки, имеющие уже и веб-интерфейс, но они отмечены разработчиком как тестовые и как показала практика на самом деле содержат массу проблем.
- Автору этой статьи так и не удалось заставить устройство нормально отдавать температуру через SNMP trap. Соответствующие опции в конфигурации есть, но в какой-то момент устройство просто переставало отдавать температуру вплоть до перезагрузки по питанию.
- С поддержкой syslog проблем не было, однако выяснилось что в syslog устройство отсылает только информацию об изменении собственных настроек, но никак не информацию о температуре. Впринципе в телефонном разговоре разработчик выразил готовность выпустить версию прошивки с таким функционалом, но при условии покупки достаточно большой партии таких устройств.
Все эти оговорки оказались достаточно неприятной неожиданностью, но устройство уже было куплено, да и в конечном итоге оно умело делать то что нужно - опрашивать подключенные датчики и показывать информацию с них в консоли управления. Остался вопрос только автоматизации процесса сбора информации с устройства.
Итак, для того, чтобы получить информацию о температуре на одном из датчиков нужно зайти telnet'ом на IP-адрес устройства, ввести логин и пароль (по умолчанию - visor/ping), выбрать в меню пункт "Termo sensor settings" (нажать цифру 5) и выбрать нужный датчик (набрать "2 <номер_датчика>"), и два раза нажать ENTER. После этого в строке "Current temp" можно увидеть текущую температуру на выбранном датчике.
Впринципе ничего сложного. Теперь можно написать функцию на perl, которая будет проделывать всё это за нас и возвращать нам температуру. Будем предполагать что машина, на которой будет запускаться скрипт, работает под управлением Debian/Ubuntu. Perl скорее всего на ней есть и остаётся только поставить пакет libnet-telnet-perl, который позволит использовать в скриптах функции telnet:
apt-get install libnet-telnet-perl
Ниже приведён пример скрипта, который просто выводит на стандартный вывод температуру на одном из датчиков:
#!/usr/bin/perl # Подключаем библиотеку для работы с telnet use Net::Telnet; # IP-адрес устройства $netping_host = "10.246.5.130"; # Логин на устройстве $netping_user = 'visor'; # Пароль на устройстве $netping_pass = 'ping'; # Функция получения температуры. Имеет один параметр - номер датчика. sub get_temperature { my $number = shift; # Создаём новый объект $t = new Net::Telnet (Timeout => 10); # Подключаемся к устройству $t->open($netping_host); # Дожидаемся приглашения и вводим логин $t->waitfor("/Login\:/"); $t->print($netping_user); # Дожидаемся приглашения и вводим пароль $t->waitfor("/Password\:/"); $t->print($netping_pass); # Дожидаемся приглашения и переходим на страницу управления датчиками $t->waitfor('/\\\\\\>/'); $t->print("5"); # Выбираем датчик $t->waitfor('/\\\\\\>/'); $t->print("2 ".$number); $t->waitfor('/\\\\\\>/'); $t->print(""); # Читаем информацию о датчике ($lines) = $t->waitfor('/\\\\\\>/'); # Достаём информацию о температуре и возвращаем результат @list = grep /Current/, (split /\n/,$lines); @rslt = split "\\.",(substr($list[0], -10)); return $rslt[scalar(@rslt)-1]; } # Печатаем информацию о температуре на первом датчике print get_temperature(1)."\n";
Какие приложения могут быть у этой функции? Ну например отображение таблицы текущих температур на какой-нибудь веб-странице. Для этого надо заменить строку:
print get_temperature(1)."\n";
На следующий код:
use CGI qw(:standard); print header; my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time); $syear = sprintf("%04d",$year+1900); $smon = sprintf("%02d",$mon+1); $sday = sprintf("%02d",$mday); $reportdate=$syear.".".$smon.".".$sday; $report=""; $report.="<HTML>\n<HEAD>\n<META http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">\n<TITLE>Daily report (".$reportdate.")</TITLE>\n</HEAD>\n<BODY>\n"; $report.="<p>Report date: ".$reportdate."</p>"; $report.="<TABLE border=1 cellspacing=0 cellpadding=5>\n"; $report.="<TR><TH>Sensor name</TH><TH>Value</TH></TR>\n"; $report.="<TR><TD>Room 1</TD><TD>".get_temperature(1)."</TD></TR>\n"; $report.="<TR><TD>Room 2</TD><TD>".get_temperature(2)."</TD></TR>\n"; $report.="<TR><TD>Room 3</TD><TD>".get_temperature(3)."</TD></TR>\n"; $report.="</TABLE>\n</BODY>\n</HTML>\n"; print $report;
И сохранить скрипт под именем termdata.pl в DocmentRoot вашего веб-сервера. В этом случае при открытии страницы http://<ваш_сервер>/termadata.pl вы увидите примерно такую табличку:
Report date: 2008.09.24
|
Можно так же сделать чтобы страничка автоматически обновлялась через определённое время. В этом случае уже получается мониторинг температуры в реальном времени. Желающие могут дописать скрипт так, чтобы он записывал значения температуры в базу данных, а так же веб-интерфейс, позволяющий эту самую базу данных просматривать.
Вобщем несмотря на недостатки устройство достаточно интересное и в руках творческого человека полезное и многофункциональное.
Приятной работы!