Вы когда-нибудь задумывались, насколько стабилен ваш интернет в течение суток? Скорость может падать вечером или пропадать на несколько минут. В этой статье мы создадим простую систему автоматического мониторинга. Мы будем использовать профессиональный инструмент Ookla Speedtest CLI, а данные визуализируем в удобных графиках через облачный сервис VizIoT.
Прежде чем писать код, подготовим «приёмник» для наших данных.
Скрипт мониторинга написан на языке 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
Это официальная утилита от создателей сайта speedtest.net. В отличие от любительских версий, она работает стабильнее и точнее.
Windows:
speedtest.exe.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
Это критически важный момент. При самом первом запуске программа Speedtest остановится и будет ждать, пока вы вручную подтвердите согласие с условиями использования. Если это не сделать, ваш Node.js скрипт не сможет получить данные и будет выдавать ошибку «License not accepted».
Выберите инструкцию для вашей системы:
speedtest.exe.cmd и нажмите Enter (или откройте терминал и перейдите в эту папку)..\speedtest.exe
speedtest
Теперь объединим всё воедино.
Создайте папку для проекта:
mkdir -p /var/viziot/speedtest
cd /var/viziot/speedtest
Инициализируйте проект и установите библиотеку для связи с облаком:
npm init -y
npm install viziot-mqtt-client-nodejs
Создайте файл 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()
Чтобы скрипт не закрылся после того, как вы выключите компьютер или закроете терминал, используем менеджер процессов PM2.
# Установка PM2
npm install pm2 -g
# Запуск скрипта
pm2 start main.js --name "speedtest-monitor"
# Настройка автозапуска при перезагрузке сервера
pm2 startup
pm2 save
Теперь ваш мониторинг работает в фоновом режиме 24/7.
Возвращайтесь VizIoT:
download).Повторите это для параметров upload и ping. Теперь вы наглядно увидите все просадки скорости в реальном времени!
Подробную инструкцию по настройке графиков вы можете найти в статье «Знакомство с VizIoT».
Мы создали надежную систему, которая автоматически проверяет качество интернета. С помощью официального клиента Ookla вы получаете точные данные, а VizIoT берет на себя хранение истории и отрисовку графиков. Больше никаких споров с провайдером «на словах» — у вас будут наглядные доказательства качества связи!