====== Ночной мониторинг сайтов ====== {{ :projects:hostmonitor:hostmonitor_overvew.jpg?direct&700 |}} * Платформы: BeagleBone Black * Языки программирования: JavaScript (BoneScript) * Тэги: Мониторинг сайтов, время отклика, ping, смайлик ===== Что это? ===== Практически каждый пользователь сталкивается с тем, что не может зайти на определенный сайт, хотя он ещё 5 минут назад работал. Но администратор такого сайта даже может и не подозревать, что он у него не работает. А что, если администратор этого сайта — вы? Практически любой сайт рано или поздно перестает работать. Причины могут быть разными. Вопрос только в том, как быстро вы об этом узнаете? Вариант первый — постоянно и вручную проверять жив ли сайт. Но это как-то не целесообразно тратить время и нервы. Мы вам предлагаем способ решения проблемы с помощью автоматического устройства. ===== Что нам понадобится? ===== {{ :projects:hostmonitor:hostmonitor_parts.jpg?direct&700 |}} - [[amp>product/beaglebone-black?utm_source=proj&utm_campaign=hostmonitor&utm_medium=wiki | BeagleBone Black]] - [[amp>product/breadboard-mini?utm_source=proj&utm_campaign=hostmonitor&utm_medium=wiki | Breadboard Mini]] - [[amp>product/troyka-led-module?utm_source=proj&utm_campaign=hostmonitor&utm_medium=wiki | Светодиод «Пиранья» Белый (Troyka-модуль)]] - [[amp>product/servo-fs90?utm_source=proj&utm_campaign=hostmonitor&utm_medium=wiki | Микросервопривод FS90]] - [[amp>product/wall-plug-1a?utm_source=proj&utm_campaign=hostmonitor&utm_medium=wiki | Импульсный блок питания]] - [[amp>product/21mm-screw-jack?utm_source=proj&utm_campaign=hostmonitor&utm_medium=wiki | Штекер питания 2,1 мм с клеммником]] - [[amp>product/patch-cord?utm_source=proj&utm_campaign=hostmonitor&utm_medium=wiki | Патч-корд витой пары]] - [[amp>product/wire-mm?utm_source=proj&utm_campaign=hostmonitor&utm_medium=wiki | Соединительные провода «папа-папа»]] - [[amp>product/jumper-wires?utm_source=proj&utm_campaign=hostmonitor&utm_medium=wiki | Набор перемычек]] - [[amp>product/pin-headers?utm_source=proj&utm_campaign=hostmonitor&utm_medium=wiki | Штырьковые соединители (1×40)]] - Пустой коробок. Мы использовали коробок из набора [[amp>product/matryoshka-z | «Матрёшка»]] - Лист картона и файлик для документов ===== Как собрать? ===== - Установите Светодиод «Пиранья» (Troyka-модуль) на Breadboard Mini. Между контактами ''S'' и ''V'' поставьте перемычку, для того чтобы светодиод всегда светил. Возьмите два провода «папа-папа» и подключите их в Breadboard Mini. По ним будет идти питание от источника напряжения к макетной плате. Красный потом подключим к плюсу, а зеленый к минусу. Этим мы сделали рельсы питания и земли. {{ :projects:hostmonitor:hostmonitor_build1.jpg?direct&700 |}} - Соедините двумя проводами «папа-папа» светодиод с питанием. Подключите сервопривод к Breadboard Mini через штырьковые соединители, так чтобы красный провод оказался на рельсе питания, а коричневый на рельсе земли.{{ :projects:hostmonitor:hostmonitor_build2.jpg?direct700 |}} - Соедините штекер питания 2,1 мм с клемником в BeagleBone. В клемник разъёма подключите импульсный источник питания на 5 вольт и от него же проведите питание для рельс макетной платы. Управляющий пин от сервопривода через макетную плату подключите к BeagleBone пину ''14'' разъёма ''P9''.{{ :projects:hostmonitor:hostmonitor_build3.jpg?direct&700 |}} - Теперь надо изготовить барабан с нашими смайликами. Варианты могут быть разными. Мы использовали картон и прозрачную плёнку. Вырежьте круг из картона. Микросервопривод FS90 обладает углом поворота 180°, т.е. может быть установлен в любое положение в пределах полуокружности. Значит смайлики должны находиться тоже в пределах полуокружности. Вырежьте 4 отверстия в полуокружности и на всю площадь большого круга приклейте прозрачную плёнку. На приклеенной плёнке в отверстиях круга нарисуйте 4 варианта смайлика.{{ :projects:hostmonitor:hostmonitor_build4.jpg?direct&700 |}} - После этого используя пустой коробок (мы взяли от набора «Матрёшка») и ножницы, вырежьте необходимые отверстия для сервопривода, вывода света и проводов к BeagleBone. Закрепите сервопривод с наружной стороны корпуса, затем прикрутите к валу сервопривода изготовленный барабан со смайликами. Всю остальную электронику, собранную ранее, также монтируйте в корпус. Заметьте светодиод должен быть направлен прямо на отверстие в корпусе для вывода изображения.{{ :projects:hostmonitor:hostmonitor_build5.jpg?direct&700 |}} ===== Алгоритм ===== Запоминая текущее время, делаем запрос к сайту. Если код ответа страницы в диапазоне 200–400, вычисляем время задержки за которое ответил сервер и показываем смайл соответствующий этой задержки: *меньше 1 секунды — «весёлый смайл»; *меньше 5 секунд — «нейтральный смайл»; *меньше 10 секунд — «грустный смайл»; *больше 10 секунд — «мёртвый смайл». Если код ответа страницы в другом диапазоне (отличен от 200–400) или сайт вообще не отвечает, показываем «мёртвый смайл». Далее проделываем такой запрос каждые 60 секунд. ===== Исходный код ===== //Загружаем модуль BoneScript, к которому в коде мы будем обращаться с именем b var b = require('bonescript'); var SERVO = 'P9_14'; // пин с серво var url = 'http://ya.ru'; var SMILE_DUTIES = { ':)': 0.03, ':|': 0.06, ':(': 0.09, 'XS': 0.126 }; var currentSmile = ':)'; //Задаём SERVO направление <выход> b.pinMode(SERVO, b.OUTPUT); var http = require('http'); // Функция, которая показывает смайл, соответствующий задержке `time` function showSmile(time) { // Выбираем вид смайла var smile = null; if (time < 1000) { smile = ':)'; } else if (time < 5000) { smile = ':|'; } else if (time < 10000) { smile = ':('; } else { smile = 'XS'; } console.log(smile); // Поворачиваем барабан до смайла, если он ещё не там if (currentSmile !== smile) { b.analogWrite(SERVO, SMILE_DUTIES[smile], 50); currentSmile = smile; } } //Определяем новую функцию update, которая состоит из кода между фигурными скобками function update() { // Запоминаем момент начала запроса var startTime = new Date(); console.log("Start time " + startTime); // Делаем сам запрос к сайту http.get(url, function (response) { // Эта функция будет вызвана, как только мы получим ответ // Выводим HTTP-статус ответа console.log(response.statusCode); if (response.statusCode >= 200 && response.statusCode < 400) { // Если код ответа страницы 2хх — это ОК, 3хх — это редирект // будем считать оба сценария нормальными console.log("OK"); // Узнаём время получения ответа var endTime = new Date(); console.log("End Time " + endTime); // Вычисляем задержку, с которой мы получили ответ var time = endTime - startTime; console.log("time = " + time + " ms"); // показываем смайл соответствующий задержке showSmile(time); } else { // Мы получили в ответ какой-то странных, плохой HTTP-код. // Будем считать это ошибкой console.log("Error Time"); // показываем мёртвый смайл showSmile(10000); } // «Потребляем» тело ответа, чтобы высвободить HTTP-подключение response.on('data', function() {}); }).on('error', function (e) { // Эта функция будет вызвана если сайт вообще не доступен // Например, если пропало сетевое подключение или сервер... console.log(e.message); // показываем мёртвый смайл showSmile(10000); }); } // Вызываем функцию update при старте и затем каждые 60 секунд update(); setInterval(update, 60000); ===== Демонстрация работы устройства ===== {{youtube>AgkLX5_WygI?large}} ===== Что дальше? ===== На основе этого проекта вы можете также собрать девайс, который будет вам показывать прогноз погоды (ясно, пасмурно, дождь, снег), загруженность дорог с Яндекс.Пробок, да и вообще любые другие показатели, которые можно получить через какой-либо API.