NodeJS -> Мониторинг интернет канала

Рассмотрим пример мониторинга скорости канала интернет соединения при помощи интернет ресурса speedtest.net и ПК с операционной системой Linux.

Что нам потребуется:

  • Компьютер: Любой компьютер с операционной системой Linux, в данном случае Debian
  • Программы:
    • Nano — консольный текстовый редактор
    • cURL — программа командной строки, для работы с HTTP
    • cron —демон, использующийся для периодического выполнения заданий.
    • NodeJS — это серверная платформа для работы с JavaScript через движок V8.
    • SPEEDTEST — сервис который измеряет скорость передачи данных между вашим устройством и тестовым сервером при помощи Интернет-соединения вашего устройства.

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

  1. 1. Добавим новое устройство в VizIoT с именем «SPEEDTEST»
  2. 2. Настроим параметры устройства. Добавьте три параметра:
    1. Ключ latency с типом «Миллисекунды, ms»
    2. Ключ download с типом «Мегабайт, MB»
    3. Ключ upload с типом «Мегабайт, MB»
  3. 3. В «Основных настройках» устройства скопируем Ключ доступа и Пароль доступа.

Установка NodeJS:

Смотрите в «документацию NodeJS». Стандартная установка для Ubuntu или Debian:

# Using Ubuntu
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt-get install -y nodejs
# Using Debian, as root
curl -fsSL https://deb.nodesource.com/setup_lts.x | bash -
apt-get install -y nodejs

Установка SPEEDTEST:

Смотрите в «документацию SPEEDTEST». Стандартная установка для Ubuntu или Debian:

sudo apt-get install gnupg1 apt-transport-https dirmngr
export INSTALL_KEY=379CE192D401AB61
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys $INSTALL_KEY
echo "deb https://ookla.bintray.com/debian generic main" | sudo tee  /etc/apt/sources.list.d/speedtest.list
sudo apt-get update
# Other non-official binaries will conflict with Speedtest CLI
# Example how to remove using apt-get
# sudo apt-get remove speedtest-cli
sudo apt-get install speedtest

Утилита SPEEDTEST выполняет замер скорости вашего интернет канала и выводит в консоль скорость загрузки, скорость отдачи и время задержки. Протестируем SPEEDTEST в консоли. Для этого наберите в командной строке:

speedtest

В ответ получите примерно такой текст:

Speedtest by Ookla

Server: Kyivstar - Kiev (id = 23493)
ISP: Private Joint-stock Company farlep-invest
Latency:    22.72 ms   (0.11 ms jitter)
Download:    89.86 Mbps (data used: 63.2 MB)
Upload:    93.63 Mbps (data used: 101.5 MB)
Packet Loss: Not available.
Result URL: https://www.speedtest.net/result/c/cc8fd3b0-9087-4961-aa78-1a3e91f24465

Создания программы на NodeJS. Программа будет выполнять команду speedtest, получать текстовый результат выполнения команды и доставать из него нужные нам данные, а именно время задержки, скорость загрузки и скорость отдачи:

Создадим директорию:

mkdir /var/viziot/
mkdir /var/viziot/speedtest

перейдем в директорию:

cd /var/viziot/speedtest

Создадим NodeJS проект:

npm init

Установим вспомогательные модуль viziot-mqtt-client-nodejs - модуль позволяет быстро и легко отправлять данные на сервер VizIoT по протоколу MQTT:

npm install viziot-mqtt-client-nodejs –s

Создадим файл скрипта:

nano ./index.js

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

'use strict';

//#ключ и пароль доступа VizIoT
let keyDevice = ___________________;
let passDevice = ____________________________;

let viziotMQTT = require('viziot-mqtt-client-nodejs');
let viziotMQTTClient = new viziotMQTT(keyDevice, passDevice);
viziotMQTTClient.connect(function () {});

function getPacketAndSendToServer() {
	speedTest("*", function (result) {
		console.log(result);
		if(result.type == "ok"){
			let packet = {
				'date': parseInt(new Date().getTime()/1000),
				"latency":result.latency, 
				"download":result.download, 
				"upload":result.upload 
			};
			viziotMQTTClient.sendDataToVizIoT(packet, function (err) {
				if (err) {
					console.log("publish", err);
				}
			});
		}
	});
}



function speedTest(idServer, callBack){
	const { exec } = require("child_process");
	var command = "speedtest"; 
	if(idServer != undefined && idServer != "*" && !isNaN(idServer) && idServer > 0){
		command = "speedtest -s " + idServer;
	}
	console.log("Выполнение команды", command);
	exec(command, (error, stdout, stderr) => {
		if (error) {
			console.log(`error: ${error.message}`);
			callBack({type: "error message"});
			return;
		}
		if (stderr) {
			console.log(`stderr: ${stderr}`);
			callBack({type: "error stderr"});
			return;
		}
		console.log(`stdout: ${stdout}`);
		var arrayString = stdout.replace(new RegExp("\r",'g'), "").split("\n");
		var latency = getValue(arrayString, "Latency", "ms");
		var download = getValue(arrayString, "Download", "Mbps");
		var upload = getValue(arrayString, "Upload", "Mbps");
		if(!isNaN(latency) && !isNaN(download) && !isNaN(upload)){
			callBack({
				"type": "ok", 
				"latency":latency, 
				"download":download, 
				"upload":upload 
			});
			return;
		}else{
			callBack({"type": "error parse","latency":latency, 
				"download":download, 
				"upload":upload });
			return;
		}
	});
}	
function getValue(arrayString, nameParametr, typeMeasure) {
	for (var ii = 0; ii < arrayString.length; ii++) {
		if(arrayString[ii].indexOf(nameParametr + ":") !== -1) {
			return parseFloat(arrayString[ii].replace(new RegExp("^.*" + nameParametr + ": *"), "").replace(new RegExp(" "+ typeMeasure + ".*$"), ""));
		}
	}
	return NaN;
}

getPacketAndSendToServer();
let intervalTime = 1000 * 60 * 5;
setInterval(function () {
	getPacketAndSendToServer();
}, intervalTime);

Данный скрипт будем запускать при старте системы. Для этого добавим запись в cron. Запустим редактор cron:

> crontab -e

И в самый конец добавим строку, которая будет запускать скрипт «/var/viziot/speedtest/index.js»:

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

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

  1. Создадим новую панель с именем «SPEEDTEST»
  2. Добавим виджет «SPEEDTEST»
    1. тип: «График»;
    2. устройство: «SPEEDTEST;
    3. параметры: latency, download, upload;
  3. Теперь вы все настроили и осталось дождаться отправки данных на сервер.