Вы когда-нибудь задумывались, насколько стабилен ваш интернет в течение суток? Скорость может падать вечером или пропадать на несколько минут. В этой статье мы создадим простую систему автоматического мониторинга. Мы будем использовать профессиональный инструмент Ookla Speedtest CLI, а данные визуализируем в удобных графиках через облачный сервис VizIoT.
Прежде чем писать код, подготовим «приёмник» для наших данных.
Скрипт написан на языке JavaScript и работает в среде Node.js. Выберите инструкцию для вашей операционной системы:
node -v и npm -v.Мы рекомендуем использовать менеджер версий NVM. Откройте терминал и выполните:
# 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
Теперь подготовим рабочую папку и скачаем необходимые инструменты.
Создайте папку для проекта:
mkdir -p /var/viziot/speedtest
cd /var/viziot/speedtest
Инициализируйте проект и установите библиотеку VizIoT:
npm init -y
npm install viziot-mqtt-client-nodejs
Скачайте клиент Speedtest CLI прямо в папку с проектом: Выберите команды для своей системы:
Windows (PowerShell):
Invoke-WebRequest -Uri "https://install.speedtest.net/app/cli/ookla-speedtest-1.2.0-win64.zip" -OutFile "speedtest.zip"
Expand-Archive -Path "speedtest.zip" -DestinationPath "." -Force
macOS (Терминал):
curl -o speedtest.tgz https://install.speedtest.net/app/cli/ookla-speedtest-1.2.0-macosx-universal.tgz
tar -xzf speedtest.tgz
Linux (Терминал):
wget https://install.speedtest.net/app/cli/ookla-speedtest-1.2.0-linux-x86_64.tgz
tar -xzf ookla-speedtest-1.2.0-linux-x86_64.tgz
Создайте файл main.js и вставьте в него код:
(Если вы на Linux, используйте nano main.js, на Windows — любой текстовый редактор)
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 = ''
const flags = '--format=json --accept-license --accept-gdpr'
switch (os.platform()) {
case 'win32':
command = `.\\speedtest.exe ${flags}`
break
case 'linux':
command = `./speedtest ${flags}`
break
case 'darwin':
command = `./speedtest ${flags}`
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()
Перед тем как оставить скрипт работать в фоне, нужно убедиться, что он работает корректно.
В терминале (в папке проекта) выполните команду:
node main.js
Что должно произойти:
Связь с сервером установлена!.Начинаю замер скорости... (это может занять 30-60 секунд).Данные успешно отправлены: и объект с вашими показателями скорости.Если всё так — поздравляем! Скрипт работает. Нажмите Ctrl + C, чтобы остановить его.
Чтобы мониторинг работал 24/7 даже после закрытия терминала или перезагрузки сервера, используем менеджер процессов PM2.
# 1. Установка PM2 глобально
npm install pm2 -g
# 2. Запуск вашего скрипта под управлением PM2
pm2 start main.js --name "viziot-speedtest"
# 3. Сохранение списка процессов (чтобы они запустились после перезагрузки)
pm2 save
# 4. Настройка автозапуска при старте системы
pm2 startup
# После этой команды PM2 выдаст строку, которую нужно скопировать и выполнить.
Теперь скрипт «живет» самостоятельно. Вы можете проверить его статус командой pm2 status.
Возвращайтесь VizIoT:
download).Повторите это для параметров upload и ping. Теперь вы наглядно увидите все просадки скорости в реальном времени!
Подробную инструкцию по настройке графиков вы можете найти в статье «Знакомство с VizIoT».
Мы создали надежную систему, которая автоматически проверяет качество интернета. С помощью официального клиента Ookla вы получаете точные данные, а VizIoT берет на себя хранение истории и отрисовку графиков. Больше никаких споров с провайдером «на словах» — у вас будут наглядные доказательства качества связи!