Мониторинг скорости интернет-соединения с помощью Speedtest и отправка данных в VizIoT

В этом примере мы создадим систему автоматического мониторинга скорости интернет-канала (Download, Upload и Latency) с помощью Speedtest CLI, а затем настроим отправку данных в VizIoT для построения графиков и анализа качества интернет-соединения.


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

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

  • Любой компьютер с Linux (пример — Debian/Ubuntu).

Необходимое ПО

  • Nano — консольный редактор.
  • cURL — работа с HTTP.
  • cron — периодический запуск задач.
  • NodeJS — среда выполнения JavaScript.
  • Speedtest CLI — утилита для измерения скорости соединения.

Добавление и настройка устройства в VizIoT

  1. Создайте новое устройство с именем «SPEEDTEST».

  2. Добавьте параметры:

    • latency — Миллисекунды (ms)
    • download — Мегабайт (MB)
    • upload — Мегабайт (MB)
  3. В разделе «Основные настройки» скопируйте Ключ доступа и Пароль доступа — они понадобятся в скрипте.


Установка NodeJS

Подробная документация: https://nodejs.org

Установка через NVM (рекомендуется)

# Установка 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

Установка Speedtest CLI

Документация: https://www.speedtest.net/apps/cli

Для Debian/Ubuntu:

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-cli

Пример вывода:

Hosted by PrJSC VF Ukraine (Kyiv) [442.25 km]: 12.652 ms
Download: 851.78 Mbit/s
Upload: 667.39 Mbit/s

Создание программы на NodeJS

Программа будет запускать Speedtest CLI, получать JSON-результат и отправлять данные на сервер VizIoT через MQTT.

Создадим рабочие директории

mkdir -p /var/viziot/speedtest
cd /var/viziot/speedtest

Инициализация проекта

npm init -y

Установка библиотеки VizIoT MQTT

npm install viziot-mqtt-client-nodejs

Создание скрипта

Создаём файл:

nano index.js

Содержание файла index.js

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

// Ключ и пароль доступа VizIoT
let keyDevice = "__________________";
let passDevice = "______________________";

let viziotMQTTClient = new viziotMQTT(keyDevice, passDevice);

function main() {
  viziotMQTTClient.connect(() => {});

  let intervalTime = 60 * 60 * 1000; // 1 час
  getPacketAndSendToServer();

  setInterval(() => {
    getPacketAndSendToServer();
  }, intervalTime);
}

main();

function getPacketAndSendToServer() {
  speedTest("29493").then((result) => {
    if (result.success && result.data) {
      const packet = {
        date: Math.floor(Date.now() / 1000),
        latency: result.data.latency,
        download: result.data.download,
        upload: result.data.upload
      };

      viziotMQTTClient.sendDataToVizIoT(packet, (err) => {
        if (err) console.log("publish error:", err);
      });
    }
  });
}

function speedTest(idServer) {
  return new Promise((resolve) => {
    let command = 'speedtest-cli --json';

    if (idServer && !isNaN(idServer)) {
      command += ` --server ${idServer}`;
    }

    exec(command, (error, stdout, stderr) => {
      if (error || stderr) {
        console.log("Speedtest error:", error || stderr);
        return resolve({ success: false });
      }

      try {
        const json = JSON.parse(stdout);

        if (
          json.download &&
          json.upload &&
          json.ping &&
          typeof json.download === "number" &&
          typeof json.upload === "number" &&
          typeof json.ping === "number"
        ) {
          resolve({
            success: true,
            data: {
              latency: json.ping,
              download: json.download / 1024 / 1024,
              upload: json.upload / 1024 / 1024
            }
          });
        } else {
          console.log("Unexpected JSON format:", json);
          resolve({ success: false });
        }
      } catch (err) {
        console.log("JSON parse error:", err);
        resolve({ success: false });
      }
    });
  });
}

Автоматический запуск через cron

Откройте crontab:

crontab -e

Добавьте строку:

@reboot node /var/viziot/speedtest/index.js > /var/viziot/speedtest/output.txt &

Теперь скрипт будет запускаться при старте системы.


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

  1. Создайте новую панель «SPEEDTEST».

  2. Добавьте виджет типа «График».

  3. Выберите устройство SPEEDTEST.

  4. Выберите параметры:

    • latency
    • download
    • upload

После этого данные автоматически начнут отображаться на графике.


Готово!

Теперь ваш сервер автоматически измеряет скорость интернет-канала и отправляет данные на VizIoT.