Автоматизация слежения за температурой с помощью устройств NetPing TS v2

()

Отечественная компания «Лайт Коммуникейшн» выпускает достаточно интересные устройства, позволяющие осуществлять удалённый мониторинг температуры и поддерживающее до восьми датчиков - NetPing TS v2. Далее будет показано как автоматизировать процедуру сбора данных с устройства с помощью несложных скриптов на perl.

Для начала кратко опишем возможности устройства, декларируемые производителем:

  1. Управление по сети через удобный интерфейс,
  2. Поддержка SNMP trap,
  3. Поддержка syslog.

К сожалению все эти возможности имеют неприятные оговорки, которые были обнаружены уже после покупки устройства, а именно:

  1. Последняя на момент написания статьи стабильная прошивка (версия 50.4.5.B-8) имеет только telnet-интерфейс. Есть более новые прошивки, имеющие уже и веб-интерфейс, но они отмечены разработчиком как тестовые и как показала практика на самом деле содержат массу проблем.
  2. Автору этой статьи так и не удалось заставить устройство нормально отдавать температуру через SNMP trap. Соответствующие опции в конфигурации есть, но в какой-то момент устройство просто переставало отдавать температуру вплоть до перезагрузки по питанию.
  3. С поддержкой 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

Sensor nameValue
Room 125
Room 223
Room 324

Можно так же сделать чтобы страничка автоматически обновлялась через определённое время. В этом случае уже получается мониторинг температуры в реальном времени. Желающие могут дописать скрипт так, чтобы он записывал значения температуры в базу данных, а так же веб-интерфейс, позволяющий эту самую базу данных просматривать.

Вобщем несмотря на недостатки устройство достаточно интересное и в руках творческого человека полезное и многофункциональное.

Приятной работы!

Ключевые слова: netping, мониторинг, perl, web-интерфейс.

Комментарии:

Новый комментарий



© 2006-2016 Вадим Калинников aka MooSE