Маленькая статья для тех, кто использует на удаленных объектах, к которым затруднен доступ, оборудование, которое в силу своих свойств или в силу внешних факторов периодически зависать вешать канал и т.д. Данные неприятности чаще всего лечатся банальной перезагрузкой устройства, но иногда, чтоб добраться до узла приходится ехать до него полдня, чтоб просто отключить и включить заново. Вот именно для таких случаев и подойдет эта статья.
Что мы имеем.
- Dlink роутер прошитый для работы с YOTA например.
- Системный блок с FreeBSD на борту.
- Микроконтроллер Arduino NANO.
- Блок реле.
Идея работы простая.
Через определенные промежутки времени скрипт на сервере с FreeBSD пингует какой либо узел или узлы. Если пинг не проходит, сервер через Serial порт подает команду на микроконтроллер для перезагрузки нужного устройства. Микроконтроллер в свою очередь переключает на несколько секунд соответствующее реле для снятия питания с устройства и последующим его включением.
Итак, начнем.
Разворачиваем ОС FreeBSD. Все приведенные здесь примеры были опробованы на FreeBSD 9.0 RC3
- Устанавливаем из портов Python
- cd /usr/ports/lang/python
- make install clean
- Устанавливаем модуль Python’a для работы с Serial портом.
- cd /usr/ports/comms/py-serial
- make install clean
- Устанавливаем мост для USB->COM для Arduino
- cd /usr/ports/comms/uarduno
- make install clean
На этом подготовка сервера к мониторингу сети закончена. Займемся аппаратной частью.
Имеем Arduino Nano стоимостью 500 руб и блок реле http://www.ebay.com/itm/8-Channels-5V-Relay-Module-Arduino-ARM-PIC-AVR-DSP-/170667758574?pt=LH_DefaultDomain_0&hash=item27bc9753ee стоимостью 400 руб. Скачав с сайта http://arduino.cc/en/Main/Software приложения для программирования Arduino зальем в неё примитивную программу для управления релюшкой через команду пришедшую с COM порта.
«Прошивка для Arduino» смотри в приложенных файлах.
Суть работы программы просто в бесконечном цикле ждем получения команды на Serial порт. Если получаем команду «1» то переключаем на 10 секунд реле в другое состояние, далее опять возвращаемся в исходное состояние.
Описание прошики.
Цифровой выход №2 #define RELE 2 используем для управления реле. Для моего блока реле управляющий сигнал должен быть подтянут к 0. Поэтому переключаем режим работы порта pinMode(RELE, OUTPUT);
В рабочем состоянии блока реле подаем на выход высокий уровень сигнала digitalWrite(RELE, HIGH);
Для срабатывания реле подаем низкий уровень сигнала digitalWrite(RELE, LOW); по условию, если через порт придет «1» if (command==1)
13 порт работает в инверсивной индикации через светодиод. При срабатывании реле просто зажигает светодиод.
Для управления микроконтроллером есть скрипт
«Python скрипт» смотри в приложенных файлах.
написанный на Phyton. Скрипт располагаем его в директории /usr/local/script/ и даем ему права на запуск.
Описание скрипта.
ser = serial.Serial(
port=’/dev/cuaU0′,
baudrate=19200,
timeout=10,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS
)
Описываем наш виртуальный COM порт, здесь основное это имя порта ищем в /dev/cua* и скорость обмена и здесь и в прошивке микроконтроллера я поставил 19200.
hosts = [«ya.ru»]
перечень узлов которые будем пинговать.
В случае проблем с доступностью устройства через COM порт отсылается уведомление на почту.
в /var/cron/tabs/root
создаем запись для вызова скрипта по расписанию
gw# cat root
SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
#minute hour mday month wday who command
#
*/30 * * * * /usr/local/script/reset.py
В принципе все очень просто. Если всетаки не понятно расписал напишите в комментариях постараюсь поправить и дополнить графическими схемами.
тема arduino гораздо шире… можно сделать целый «умный дом».. осталось только научиться паять… хотя и без пайки, чуть дороже можно сделать много хороших решений.. СКУД, например. Я, лично, пока балуюсь (на работе) тем, что вентилятор сам включается утром выключается вечером (ну и батники нужные ссылками висят в нужном месте с нужными иконками)