Мониторинг доступности IP, портов и сайтов с помощью NodeJS и VizIoT

Ваш домашний сервер снова оффлайн? IP-камера перестала транслировать видео? Интернет пропал полностью или просто не открывается один сайт? Чтобы получать ответы на эти вопросы мгновенно, можно создать простую, но эффективную систему мониторинга.

В этой статье мы настроим скрипт, который будет регулярно проверять доступность любых интернет-ресурсов (IP-адресов, портов, сайтов) и отправлять время отклика на сервер VizIoT. Если ресурс недоступен, мы сразу это увидим на графике и получим уведомление в Telegram.

Конечный результат: Интерактивная панель и мгновенные уведомления

Прежде чем мы начнем, давайте посмотрим, что у нас получится.

1. Живой виджет мониторинга

Вы сможете создать наглядную панель, которая в реальном времени отображает состояние ключевых для вас сервисов.

Что можно отслеживать в такой конфигурации:

  • 🌐 Google.com — эталонный ресурс для проверки, есть ли у вас вообще доступ в интернет.
  • 🏠 Локальный IP-адрес — контроль доступности устройств внутри вашей сети (например, NAS или роутера).
  • 📹 RTSP-порт IP-камеры — проверка, работает ли видеотрансляция (стандартный порт 554).
  • 🌍 Внешние IP-адреса — контроль доступности филиалов и сервисов.

Как интерпретировать график:

  • Положительные значения — время отклика в миллисекундах (чем ниже, тем лучше).
  • Значение -500 — ресурс недоступен.
  • 📊 Резкие скачки — возможные проблемы с сетью или перегрузка сервера.

Такой подход позволяет мгновенно определить источник проблемы: ваша локальная сеть, интернет-провайдер или конкретный удалённый сервис.

2. Уведомления о сбоях в Telegram

Видеть проблему на графике — это хорошо, а получать мгновенное уведомление о ней — еще лучше. VizIoT позволяет настроить оповещения, которые придут вам в Telegram или на E-mail, как только один из ваших ресурсов станет недоступен, а также когда он вернется в онлайн.

pinger_test_notif

Заинтересовались? Давайте настроим такую систему шаг за шагом.


Что потребуется

Оборудование

  • Любой компьютер с Linux или Windows (который будет постоянно включен).

Необходимые программы и пакеты

  • NodeJS — среда выполнения JavaScript.
  • PM2 — менеджер процессов для надежного автозапуска скрипта.
  • tcp-ping — библиотека NodeJS для TCP-пинга.
  • viziot-mqtt-client-nodejs — модуль для передачи данных в VizIoT по MQTT.

Шаг 1: Настройка устройства в VizIoT

  1. Создайте новое устройство с именем VizIoTPinger.
  2. В разделе Основные настройки скопируйте Ключ доступа и Пароль доступа. Они понадобятся скрипту для авторизации.

Шаг 2: Установка NodeJS

Рекомендуется устанавливать NodeJS через NVM (Node Version Manager).

Linux (Ubuntu / Debian)

# Установка nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash

# Подключение без перезагрузки оболочки
\. "$HOME/.nvm/nvm.sh"

# Установка последней версии Node.js
nvm install 24

# Проверка версии
node -v
npm -v

Windows

Скачайте установщик с официального сайта: https://nodejs.org


Шаг 3: Создание программы мониторинга

Создаём директорию проекта и переходим в неё

mkdir ./VizIoTPinger
cd ./VizIoTPinger

Инициализируем NodeJS-проект

npm init -y

Устанавливаем зависимости

npm install tcp-ping --save
npm install viziot-mqtt-client-nodejs --save

Шаг 4: Создание скрипта

Создаём файл index.js:

nano ./index.js

Полный код скрипта

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

'use strict';

// Вставьте сюда ключ и пароль вашего устройства VizIoT
const keyDevice = '__________________';
const passDevice = '______________________';

// Список ресурсов для мониторинга
// key     — название параметра, которое будет в VizIoT
// address — домен или IP-адрес
// port    — порт (необязательно, по умолчанию 80)
const pingList = [
  {
    key: "microsoft_ping",
    address: 'microsoft.com',
    port: 80
  },
  {
    key: "google_ping",
    address: 'google.com'
  },
  {
    key: "ipCamera_ping",
    address: '192.168.0.158',
    port: 554 // Стандартный порт для RTSP-потока
  }
];

const tcpp = require('tcp-ping');
const viziotMQTT = require('viziot-mqtt-client-nodejs');

const viziotMQTTClient = new viziotMQTT(keyDevice, passDevice);

// Функция: пинг по IP/порту
function pingIpAndPortAddress(item, callback) {
  const pingItem = {
    address: item.address,
    port: item.port || 80,
    attempts: 3,
    timeout: 5000
  };

  tcpp.ping(pingItem, function (err, data) {
    if (data.avg >= 0) {
      callback(item, +data.avg.toFixed(2));
    } else {
      callback(item, -500); // Отправляем -500, если ресурс недоступен
    }
  });
}

// Формирование данных и отправка в VizIoT
function getPacketAndSendToServer() {
  let countResults = 0;
  const packet = { date: Math.floor(Date.now() / 1000) };

  for (let i = 0; i < pingList.length; i++) {
    pingIpAndPortAddress(pingList[i], function (item, timeout) {
      packet[item.key] = timeout;
      console.log(`Pinging ${item.address}:${item.port || 80} -> ${timeout} ms`);

      countResults++;

      if (countResults === pingList.length) {
        viziotMQTTClient.sendDataToVizIoT(packet, function (err) {
          if (err) {
            console.log("Publish error:", err);
          } else {
            console.log("Packet sent successfully!");
          }
        });
      }
    });
  }
}

// Интервал проверки (60 секунд)
const intervalTime = 60000;

// Первичное подключение и запуск
viziotMQTTClient.connect(function () {
  console.log("Connected to VizIoT MQTT broker.");
  getPacketAndSendToServer(); // Первый запуск сразу после подключения
  setInterval(getPacketAndSendToServer, intervalTime);
});

Шаг 5: Автозапуск скрипта через PM2

PM2 — это продвинутый менеджер процессов для Node.js, который обеспечит автоматический перезапуск скрипта при сбоях и удобное управление.

Установка PM2

npm install pm2 -g

Запуск скрипта

pm2 start index.js --name "VizIoTPinger"

Настройка автозапуска при старте системы

  1. Сохраняем текущий список процессов:
    pm2 save
  2. Генерируем скрипт автозапуска. PM2 сам определит вашу систему:
    pm2 startup

    Эта команда выведет на экран другую команду (обычно с sudo), которую нужно скопировать и выполнить.

Полезные команды PM2

pm2 list          # Показать список запущенных процессов
pm2 logs VizIoTPinger # Показать логи в реальном времени
pm2 restart VizIoTPinger# Перезапустить процесс
pm2 stop VizIoTPinger   # Остановить процесс

Шаг 6: Настройка виджетов и уведомлений в VizIoT

Теперь, когда данные поступают, осталось настроить интерфейс.

Добавление виджетов

  1. Создайте панель, например «Доступность интернет-сервисов».
  2. Добавьте виджет «Время пинга».
    • Тип: График с областями суммирующий
    • Устройство: VizIoTPinger
    • Параметры: microsoft_ping, google_ping, ipCamera_ping

Настройка уведомлений

  1. Перейдите в раздел Уведомления и нажмите Добавить уведомление.
  2. Устройство: VizIoTPinger.
  3. Параметр: Выберите тот, который хотите отслеживать (например, ipCamera_ping).
  4. Условие: Тип меньше (<), значение 0.
  5. Включите опцию «Уведомлять при возвращении в диапазон».
  6. Выберите способ доставки (Telegram, E-mail) и сохраните.

Подробную инструкцию по настройке уведомлений можно найти в этой статье.


Готово!

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