Берём данные мониторинга с сервера Астры через сокеты
Задача: вытянуть на веб страницу данные по текущему битрейту каналов на карте с мониторинга на сервере астры.
Удачно сложилось, что сам «штатный» мониторинг сервера обменивается между своим ядром и веб страницей через соединение websocets. Это можно использовать, написав свой сервис «цепляющийся» к астре и получающий данные.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 |
<!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. Код предоставлен Андреем Дульдиным