MAG-250 от Ростелекома в качестве ip2rca на головной станции

img-20170415-wa0005-500x500Подкупая своей ценой (всего 1500-2000 рос.рублей/шт. здесь) такие маги, как выснилось, обладают некоторыми недостатками. Во-первых, в них отсутствует поддержка Dolby Digital, что вызовет необходимость фильтровать в потоке соответствующую дорожку. Во-вторых, в отличие от оригинальных «инфомировских», «ростелекомы» не способны корректно работать с файлом services.html для одного канала — событийные функции почему-то не работают 🙁
8621843Поковырявшись в носу вечерок с данной проблемой, пришлось соорудить свой вел. Решено было мониторить состояние сетевого интерфейса, а именно — входящий трафик. Если он упал до неприлично малого битрейта (а чаще это 0 kbps), то перезапускаем воспроизведение.

Итак. В маге от ростелекома с прошивкой от infomir необходимо перезаписать два файла:

/home/default/action.sh

!!! Если создаёте новый файл action.sh или копируете из винды, то не забудьте выставить права на исполнение 0755. А также помните, что многие windows-редакторы могут внести, помимо возврата коретки «\n», ещё и некорректный для bash-скриптов символ конца строки «\r». !!!


#!/bin/sh

if [ ! -f "/home/web/ifstat.txt" ]
then
    ln -s "$1" /home/web/ifstat.txt
fi

STAT=`ifconfig eth0 | grep bytes | cut -d':' -f2 | cut -d' ' -f1`

echo $(( $STAT / 1000000 )) > "$1"

/home/web/services.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html><head><meta http-equiv="Content-Type" content="text/html; charset=windows-1251"><title></title> 
<script src="ajax.js" type="text/javascript"></script>
<script type="text/javascript">
 // Copyleft by Unidiag (www.conture.by)
 var cout = 0;
 var sol = "ffrt"; // solution
 var url = "http://192.168.2.50:8080/534-domashniy-int";
 
	function init(){
		var stb;
		netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
		stb = gSTB;
		stb.InitPlayer();
		stb.SetStereoMode(1);
		stb.SetVolume(100);
		setInterval(function(){
			SendRequest("GET","ifstat.txt","",function(r){
				var b = parseInt(r.responseText);
				if((b-1)<cout){ stb.Play(sol+" "+url); }
                     cout=b;
                     stb.ExecAction("/tmp/ifstat.txt"); });
                  }, 10000);
        }
</script> </head>
<body onload="init()"></body></html>

Кроме того, для возможности чтения файла с данными о битрейте, надо добавить новый файл /home/web/ajax.js

function SendRequest(a,c,d,e){var b=CreateRequest();b&&(b.onreadystatechange=function(){4==b.readyState&&e(b)},"get"==a.toLowerCase()&&0<d.length&&(c+="?"+d),b.open(a,c,!0),"post"==a.toLowerCase()?(b.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=utf-8"),b.send(d)):b.send(null))}
function CreateRequest(){var a=!1;if(window.XMLHttpRequest)a=new XMLHttpRequest;else if(window.ActiveXObject)try{a=new ActiveXObject("Microsoft.XMLHTTP")}catch(c){a=new ActiveXObject("Msxml2.XMLHTTP")}a||alert("\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c XMLHttpRequest");return a};

Алгоритм работы. Каждые 10 секунд, скрипт action.sh делает запрос к ifconfig и парсингом выхлопа достаём значение RX bytes основного интерфейса eth0, которое сохраняется в файл в ОЗУ. Также action.sh проверяет существование симлинка в рабочей дирке на озу-ный файл /tmp/ifstat.txt . Значение из файла сравнивается со значением в глобальной переменной cout, присвоенное в предыдущем такте. Если оно не отличается (трафик не изменился) — вызывается stb.Play(); .

Ниже представлен расширенный файл services.html (в момент отсутствия потока выводится информационное сообщение). Кодировка файла UTF-8.

<!doctype html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
	<title>new MAG 200-250</title>

<script src="ajax.js" type="text/javascript"></script>
<script type="text/javascript">
 // Copyleft by Unidiag (www.conture.by)
 var cout =-1;
 var sol = "ffrt"; // solution
 var url = "http://192.168.2.50:8080/466-viasat-nature";
  
    function init(){
        var stb;
        netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
        stb = gSTB;
        stb.InitPlayer();
        stb.SetStereoMode(1);
        stb.SetVolume(100);
				stb.ExecAction("/tmp/ifstat.txt");
				stb.Play(sol+" "+url); 
        setInterval(function(){
            SendRequest("GET","ifstat.txt","",function(r){
								var t = "";
                var b = parseInt(r.responseText);
                if(b<=cout){
									t = "<div style='position:absolute;background-color:#aaa;color:#000;width:140px;height:25px;font:21px/1em sans-serif;top:250px;left:290px;text-align:center;padding-top:5px;'>Нет сигнала</div><div style='position:absolute; color:#a3a2a2; font:21px/1.1em sans-serif; width:100%; text-align:center; bottom:35px; cursor:none'>По вопросам вещания обращайтесь в дежурную службу:<br /><b>+375 (29) xxx-xx-xx мтс</b> [с 9-00 до 22-00 без выходных]<hr style='color:#011f82;border:1px solid #454444;' /><span style='font:18px/1em sans-serif;'>Отзывы о работе дежурной службы принимаются по эл.почте:</span><br />Email: <b>info@tv.by</b></div>"; 
									stb.Play(sol+" "+url);  
								}
								document.getElementById('loading').innerHTML = t;
								cout=b;
                stb.ExecAction("/tmp/ifstat.txt");
							}
						);
        }, 10000);
    }
</script> </head>
<body onload="init()"><div id="loading" style="width:100%; height:100%; background-color:#000822; position:absolute; top:0; left:0; z-index:2010; display:block; cursor:none"></div> 

</body></html>

<style>
b{color: #eee !important;}
</style>

P.S. также выснилось, что маги ростелекома после перепрошивки меняют mac-адрес (слава богу не на один и тот же 😉 )

Запись опубликована в рубрике Javascript (Jquery), Linux, Программирование. Добавьте в закладки постоянную ссылку.

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