Мониторинг скорости интернета 24/7: создаем систему на базе Ookla Speedtest и VizIoT

Вы когда-нибудь задумывались, насколько стабилен ваш интернет в течение суток? Скорость может падать вечером или пропадать на несколько минут. В этой статье мы создадим простую систему автоматического мониторинга. Мы будем использовать профессиональный инструмент Ookla Speedtest CLI, а данные визуализируем в удобных графиках через облачный сервис VizIoT.


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

Прежде чем писать код, подготовим «приёмник» для наших данных.

  1. Зайдите в свой аккаунт VizIoT.
  2. Создайте новое устройство с именем «SPEEDTEST».
  3. Добавьте в него следующие параметры (именно в них скрипт будет записывать данные):
    • download — Мегабит/с (Mbps)
    • upload — Мегабит/с (Mbps)
    • ping — Миллисекунды (ms)
    • packet_loss — Проценты (%)
    • jitter_download — Миллисекунды (ms)
    • jitter_upload — Миллисекунды (ms)
  4. Перейдите в «Основные настройки» устройства и обязательно сохраните Ключ доступа и Пароль доступа. Они понадобятся нам далее.

Шаг 2: Установка Node.js

Скрипт мониторинга написан на языке JavaScript и работает в среде Node.js.

Важно: Для установки на Ubuntu мы рекомендуем использовать менеджер версий NVM. Однако всегда стоит сверяться с официальной документацией Node.js, так как команды могут обновляться.

Для Ubuntu/Linux выполните в консоли:

# 1. Устанавливаем nvm (менеджер версий)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash

# 2. Активируем nvm в текущей сессии
. "$HOME/.nvm/nvm.sh"

# 3. Устанавливаем актуальную версию Node.js
nvm install 24

# 4. Проверяем, что всё поставилось (должны появиться номера версий)
node -v
npm -v

Шаг 3: Установка Ookla Speedtest CLI

Это официальная утилита от создателей сайта speedtest.net. В отличие от любительских версий, она работает стабильнее и точнее.

Варианты установки для разных систем:

  • Windows:

    1. Скачайте архив с официального сайта.
    2. Распакуйте архив и найдите файл speedtest.exe.
    3. Положите его в ту же папку, где будет лежать ваш будущий скрипт main.js.
  • macOS:

    brew tap teamookla/speedtest
    brew update
    brew install speedtest --force
  • Linux (Ubuntu/Debian):

    sudo apt-get install curl
    curl -s https://packagecloud.io/install/repositories/ookla/speedtest-cli/script.deb.sh | sudo bash
    sudo apt-get update
    sudo apt-get install speedtest-cli

⚠️ Обязательный первый запуск и принятие лицензии для Windows и macOS

Это критически важный момент. При самом первом запуске программа Speedtest остановится и будет ждать, пока вы вручную подтвердите согласие с условиями использования. Если это не сделать, ваш Node.js скрипт не сможет получить данные и будет выдавать ошибку «License not accepted».

Выберите инструкцию для вашей системы:

Для Windows:

  1. Откройте папку, в которую вы распаковали speedtest.exe.
  2. В адресной строке папки введите cmd и нажмите Enter (или откройте терминал и перейдите в эту папку).
  3. Введите команду:
    .\speedtest.exe
  4. Вы увидите текст лицензии. Вам нужно будет набрать слово YES и нажать Enter. Возможно, потребуется сделать это дважды (для самой лицензии и для политики конфиденциальности).

    Для macOS:

  5. Откройте Терминал.
  6. Введите команду:
    speedtest
  7. Прочитайте условия, введите YES и нажмите Enter.

Шаг 4: Подготовка проекта и написание скрипта

Теперь объединим всё воедино.

  1. Создайте папку для проекта:

    mkdir -p /var/viziot/speedtest
    cd /var/viziot/speedtest
  2. Инициализируйте проект и установите библиотеку для связи с облаком:

    npm init -y
    npm install viziot-mqtt-client-nodejs
  3. Создайте файл main.js:

    nano main.js

Скопируйте в него следующий код:

const os = require('os')
const { exec } = require('child_process')
const viziotMQTT = require('viziot-mqtt-client-nodejs')

// --- НАСТРОЙКИ ---
//Вставьте сюда ключ и пароль вашего устройства VizIoT
let keyDevice = 'ВАШ_КЛЮЧ_ДОСТУПА'
let passDevice = 'ВАШ_ПАРОЛЬ_ДОСТУПА'
const speedTestIntervalMinutes = 60 // Как часто делать замер (в минутах)
// -----------------

let viziotMQTTClient = new viziotMQTT(keyDevice, passDevice)
let idIntervalSpeedTest = null

function main() {
    console.log('Запуск... Подключение к VizIoT')
    viziotMQTTClient.connect(() => {
        console.log('Связь с сервером установлена!')
        runSpeedTest()

        // Запуск по расписанию
        clearInterval(idIntervalSpeedTest)
        idIntervalSpeedTest = setInterval(runSpeedTest, speedTestIntervalMinutes * 60 * 1000)
    })
}

function runSpeedTest() {
    let command = ''

    // Определяем команду запуска в зависимости от вашей системы
    switch (os.platform()) {
        case 'win32':
            command = '.\\speedtest.exe --format=json'
            break
        case 'linux':
            command = 'speedtest-cli --json'
            break
        case 'darwin':
            command = 'speedtest --format=json'
            break
    }

    console.log('Начинаю замер скорости...')

    exec(command, (error, stdout) => {
        if (error) {
            console.log('Ошибка запуска теста. Проверьте, установлен ли speedtest и принято ли лицензионное соглашение.')
            const packet = {
                upload: -500,
                download: -500,
                ping: -500,
                packet_loss: -500,
                jitter_upload: -500,
                jitter_download: -500,
            }
            viziotMQTTClient.sendDataToVizIoT(packet, (err) => {
                if (err) console.log('Ошибка отправки:', err)
                else console.log('Данные успешно отправлены:', packet)
            })
            return
        }

        try {
            const json = JSON.parse(stdout)

            // Собираем данные. Значения переводятся в Мегабиты для удобства.
            const packet = {
                upload: ((json.upload.bandwidth * 8) / 1000000).toFixed(2), // Преобразование из байт/с в мегабиты/с
                download: ((json.download.bandwidth * 8) / 1000000).toFixed(2), // Преобразование из байт/с в мегабиты/с
                ping: json.ping.latency.toFixed(2),
                packet_loss: json.packetLoss ? json.packetLoss.toFixed(2) : 0,
                jitter_upload: json.upload.latency.jitter.toFixed(2),
                jitter_download: json.download.latency.jitter.toFixed(2),
            }

            viziotMQTTClient.sendDataToVizIoT(packet, (err) => {
                if (err) console.log('Ошибка отправки в VizIoT:', err)
                else console.log('Данные успешно отправлены:', packet)
            })
        } catch (err) {
            console.log('Ошибка обработки JSON:', err)
        }
    })
}

main()

Шаг 5: Постоянная работа скрипта (PM2)

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

# Установка PM2
npm install pm2 -g

# Запуск скрипта
pm2 start main.js --name "speedtest-monitor"

# Настройка автозапуска при перезагрузке сервера
pm2 startup
pm2 save

Теперь ваш мониторинг работает в фоновом режиме 24/7.


Шаг 6: Визуализация (Красивые графики)

Возвращайтесь VizIoT:

  1. Создайте новую панель управления (Dashboard).
  2. Добавьте виджет типа «График».
  3. В параметрах виджета свяжите ваше устройство SPEEDTEST с виджетом и выберите нужный параметр (например, download).
  4. Настройте период отображения (например, последние 24 часа).

Повторите это для параметров upload и ping. Теперь вы наглядно увидите все просадки скорости в реальном времени!

Подробную инструкцию по настройке графиков вы можете найти в статье «Знакомство с VizIoT».


Итог

Мы создали надежную систему, которая автоматически проверяет качество интернета. С помощью официального клиента Ookla вы получаете точные данные, а VizIoT берет на себя хранение истории и отрисовку графиков. Больше никаких споров с провайдером «на словах» — у вас будут наглядные доказательства качества связи!