Берём данные мониторинга с сервера Астры через сокеты

Задача: вытянуть на веб страницу данные по текущему битрейту каналов на карте с мониторинга на сервере астры.

Удачно сложилось, что сам «штатный» мониторинг сервера обменивается между своим ядром и веб страницей через соединение websocets. Это можно использовать, написав свой сервис «цепляющийся» к астре и получающий данные.

<!doctype html>
<html lang="en" xmlns:ng="http://angularjs.org">
<head>
	<meta charset="utf-8">
	<title>WebSocket Test</title>
</head>

<body>
	<table border="1" width="100%">
		<thead>
			<tr>
				<th width="50%">Name</th>
				<th width="50%">Bitrate</th>
			</tr>
		</thead>
		<tbody id="stream-list">

		</tbody>
	</table>

	<script type="text/javascript">
//

var host = "127.0.0.1:8000";
var token; // = "login:password";

//

var ws;
var base = document.getElementById("stream-list");
var node_list = {};

var config;

// Функция для отправки POST-запросов
// Используется кросс-доменная передача, требуется 5.62-rc10 или более новые
function post(data, callback_ok, callback_er) {
	var m = "POST";
	var u = "http://" + host + "/control/";
	var x = new XMLHttpRequest();
	if("withCredentials" in x) {
		x.open(m, u, true);
	} else if(XDomainRequest) {
		x = new XDomainRequest();
		x.open(m, u);
	} else {
		throw new Error("CORS not supported");
	}
	x.onload = function() { if(callback_ok) callback_ok(x.responseText) };
	x.onerror = function() { if(callback_er) callback_er() };
	if(token) x.setRequestHeader("Authorization", "Basic " + btoa(token))
	x.setRequestHeader("Content-Type", "application/json");
	x.send(JSON.stringify(data));
}

// Получение имени канала из конфигурации
function get_stream_name(id) {
	var node = node_list[id];
	if(!node || !config || !config.make_stream) return;
	for(var i = 0; i < config.make_stream.length; ++i) {
		var s = config.make_stream[i];
		if(s.id == id) {
			node.name.innerHTML = s.name;
			return;
		}
	}
}

// Добавление канала в список node_list и таблицу
function create_stream(id, name) {
	var node = {};
	node.name = document.createElement("td");
	node.bitrate = document.createElement("td");
	node_list[id] = node;

	node.bitrate.innerHTML = "0";

	var r = document.createElement("tr");
	r.setAttribute("id", id);
	r.appendChild(node.name);
	r.appendChild(node.bitrate);
	base.appendChild(r);

	if(name)
		node.name.innerHTML = name;
	else
		get_stream_name(id);

	return node;
}

// Удаление канала
function delete_stream(id) {
	delete(node_list[id]);
	var r = document.getElementById(id);
	if(r) base.removeChild(r);
}

// Веб-сокет
function websocket_init() {
	ws = new WebSocket("ws://" + host + "/control/event/");
	// При подключении необходимо отправить данные для авторизации
	ws.onopen = function(evt) {
		ws.send(JSON.stringify({ scope: "auth", auth: token }));
	};
	// Обработка сообщения
	ws.onmessage = function(evt) {
		var data = JSON.parse(evt.data);
		switch(data.scope) {
			case "stream_event": {
				// Статистика
				var node = node_list[data.channel_id];
				if(!node) node = create_stream(data.channel_id);
				node.bitrate.innerHTML = data.bitrate;
				break;
			}
			case "set-stream": {
				// Изменения в канале
				if(data.stream.remove)
					delete_stream(data.stream.id);
				else
					create_stream(data.stream.id, data.stream.name);
				break;
			}
		}
	};
	// Завершение подключения
	ws.onclose = function(evt) {
		alert("Connection closed");
	};
	// Ошибка подключения
	ws.onerror = function(evt) {
		alert("WebSocket Error");
		console.log("WebSocket Error: ", evt);
	};
}

// Загрузка конфигурации
function load_config() {
	post({
		"cmd": "load"
	}, function(data) {
		config = JSON.parse(data);
		websocket_init();
	}, function() {
		websocket_init();
	})
}

load_config();
	</script>
</body>
</html>

P.S. Код предоставлен Андреем Дульдиным


Комментарии:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.