Извиняюсь за небольшой оффтоп, но так как это мой первый пост, хочу сказать следующее:
Присоединился к Вашему проекту)
Третий день ковыряю МД и просто в восторге...
Система стоит на Ubuntu 12.04 (Без бубна не обошлось), много чего заточил под себя, но то было "основное".
Со звуком пока не разбирался, да и физически сервак от меня за пару десятков километров) (работаю в сфере провайдинга)
Итак приступим...
Я "фанат" бытовой техники Samsung и телевизор у меня с поддержкой Smart TV, я иногда пользовался приложениями для IOS устройств для управления ТВ и сегодня решил прикрутить пульт от телевизора в систему МД.
Посидев на форуме http://forum.samygo.tv я понял, что Смарт ТВ работает по TCP порту 55000 телнетом.
Дело в том, что телнет "волшебный", а именно с 64-х битным шифрованием, да ешё и в 3 этапа...
Но нам это по большому счёту фиолетово, поэтому нам нужно всего два файла:
1. samsungremote.php
Код: Выделить всё
<?
//error_reporting(E_ALL);
$tvip = "192.168.1.96"; //ЗАМЕНИТЬ!!!
$myip = "192.168.1.200"; //ЗАМЕНИТЬ!!!
$mymac = "00-0c-29-3e-b1-4f"; // Я менял, думаю надо.
$appstring = "iphone..iapp.samsung"; //Оставляем
$tvappstring = "iphone.LE46F6400.iapp.samsung"; //Я вставил свою модель
$remotename = "Perl Samsung Remote"; //Оставляем
echo "Content-type: text/html\n\n";
$sock = socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp'));
$result = socket_connect($sock, $tvip, '55000');
if( $result === false)
die ("Could not create socket: \n");
//Normal remote keys
//KEY_0
//KEY_1
//KEY_2
//KEY_3
//KEY_4
//KEY_5
//KEY_6
//KEY_7
//KEY_8
//KEY_9
//KEY_UP
//KEY_DOWN
//KEY_LEFT
//KEY_RIGHT
//KEY_MENU
//KEY_PRECH
//KEY_GUIDE
//KEY_INFO
//KEY_RETURN
//KEY_CH_LIST
//KEY_EXIT
//KEY_ENTER
//KEY_SOURCE
//KEY_AD
//KEY_PLAY
//KEY_PAUSE
//KEY_MUTE
//KEY_PICTURE_SIZE
//KEY_VOLUP
//KEY_VOLDOWN
//KEY_TOOLS
//KEY_POWEROFF
//KEY_CHUP
//KEY_CHDOWN
//KEY_CONTENTS
//KEY_W_LINK //Media P
//KEY_RSS //Internet
//KEY_MTS //Dual
//KEY_CAPTION //Subt
//KEY_REWIND
//KEY_FF
//KEY_REC
//KEY_STOP
//Bonus buttons not on the normal remote:
//KEY_TV
//Don't work/wrong codes:
//KEY_CONTENT
//KEY_INTERNET
//KEY_PC
//KEY_HDMI1
//KEY_OFF
//KEY_POWER
//KEY_STANDBY
//KEY_DUAL
//KEY_SUBT
//KEY_CHANUP
//KEY_CHAN_UP
//KEY_PROGUP
//KEY_PROG_UP
$ipencoded = base64_encode($myip);
$macencoded = base64_encode($mymac);
$messagepart1 = chr(0x64) . chr(0x00) . chr(strlen($ipencoded)) . chr(0x00) . $ipencoded . chr(strlen($macencoded)) . chr(0x00) . $macencoded .
chr(strlen(base64_encode($remotename))) . chr(0x00) . base64_encode($remotename);
$part1 = chr(0x00) . chr(strlen($appstring)) . chr(0x00) . $appstring . chr(strlen($messagepart1)) . chr(0x00) . $messagepart1;
socket_write($sock, $part1, strlen($part1));
echo $part1;
echo "\n";
$messagepart2 = chr(0xc8) . chr(0x00);
$part2 = chr(0x00) . chr(strlen($appstring)) . chr(0x00) . $appstring . chr(strlen($messagepart2)) . chr(0x00) . $messagepart2;
socket_write($sock, $part2, strlen($part2));
echo $part2;
echo "\n";
//Preceding sections all first time only
if (isset($_REQUEST["key"])) {
//Send remote key
$key = "KEY_" . $_REQUEST["key"];
$messagepart3 = chr(0x00) . chr(0x00) . chr(0x00) . chr(strlen(base64_encode($key))) . chr(0x00) . base64_encode($key);
$part3 = chr(0x00) . chr(strlen($tvappstring)) . chr(0x00) . $tvappstring . chr(strlen($messagepart3)) . chr(0x00) . $messagepart3;
socket_write($sock,$part3,strlen($part3));
echo $part3;
echo "\n";
} else if (isset($_REQUEST["text"])) {
//Send text, e.g. in YouTube app's search, N.B. NOT BBC iPlayer app.
$text = $_REQUEST["text"];
$messagepart3 = chr(0x01) . chr(0x00) . chr(strlen(base64_encode($text, ""))) . chr(0x00) . base64_encode($text, "");
$part3 = chr(0x01) . chr(strlen($appstring)) . chr(0x00) . $appstring . chr(strlen($messagepart3)) . chr(0x00) . $messagepart3;
socket_write($sock,$part3,strlen($part3));
echo $part3;
echo "\n";
}
socket_close($sock);
echo "\n\n";
?>
Код: Выделить всё
<html>
<head>
<meta name = "viewport" content = "initial-scale = 1.0">
<title>Samsung Remote</title>
</head>
<body>
<script type="text/javascript" language="javascript">
//AJAX source from http://www.captain.at/howto-ajax-form-post-get.php
var http_request = false;
function makeRequest(url, parameters) {
http_request = false;
if (window.XMLHttpRequest) { // Mozilla, Safari,...
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) {
// set type accordingly to anticipated content type
http_request.overrideMimeType('text/html');
}
} else if (window.ActiveXObject) { // IE
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
http_request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
}
}
if (!http_request) {
alert('Cannot create XMLHTTP instance');
return false;
}
http_request.onreadystatechange = alertContents;
http_request.open('GET', url + parameters, true);
http_request.send(null);
}
function alertContents() {
if (http_request.readyState == 4) {
if (http_request.status == 200) {
result = http_request.responseText;
} else {
alert('There was a problem with the request.');
}
}
}
</script>
<h1>Samsung Remote</h1>
<h3>Currently in Beta!</h3>
<br>
<table border="0" cellpadding="0" cellspacing="1" style="text-align: center;">
<tr>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=POWEROFF');">Power</a></td>
<td> </td>
<td>Backlight</td>
</tr>
<tr>
<td> </td>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=SOURCE');">Source</a></td>
<td> </td>
</tr>
<tr>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=1');">1</a></td>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=2');">2</a></td>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=3');">3</a></td>
</tr>
<tr>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=4');">4</a></td>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=5');">5</a></td>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=6');">6</a></td>
</tr>
<tr>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=7');">7</a></td>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=8');">8</a></td>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=9');">9</a></td>
</tr>
<tr>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=TTX_MIX');">TTX/Mix</a></td>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=0');">0</a></td>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=PRECH');">Pre-Ch</a></td>
</tr>
<tr>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=VOLUP');">Vol +</a></td>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=MUTE');">Mute</a></td>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=CHUP');">Prog +</a></td>
</tr>
<tr>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=VOLDOWN');">Vol -</a></td>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=CH_LIST');">Ch List</a></td>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=CHDOWN');">Prog -</a></td>
</tr>
<tr>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=CONTENTS');">Content</a></td>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=MENU');">Menu</a></td>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=GUIDE');">Guide</a></td>
</tr>
<tr>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=TOOLS');">Tools<a/></td>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=UP');">Up</a></td>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=INFO');">Info</a></td>
</tr>
<tr>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=LEFT');">Left</a></td>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=ENTER');">Enter</a></td>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=RIGHT');">Right</a></td>
</tr>
<tr>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=RETURN');">Return</a></td>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=DOWN');">Down</a></td>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=EXIT');">Exit</a></td>
</tr>
<tr>
<td colspan=3>
<table width="100%" style="text-align: center;">
<td bgcolor="red"><a href="#" style="color: white;" onclick="javascript:makeRequest('samsungremote.php', '?key=RED');">A</a></td>
<td bgcolor="green"><a href="#" style="color: white;" onclick="javascript:makeRequest('samsungremote.php', '?key=GREEN');">B</a></td>
<td bgcolor="gold"><a href="#" style="color: white;" onclick="javascript:makeRequest('samsungremote.php', '?key=YELLOW');">C</a></td>
<td bgcolor="darkblue"><a href="#" style="color: white;" onclick="javascript:makeRequest('samsungremote.php', '?key=CYAN');">D</a></td>
</table>
</td>
</tr>
<tr>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=W_LINK');">Media P</a></td>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=RSS');">Internet</a></td>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=MTS');">Dual</a></td>
</tr>
<tr>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=AD');">AD<a/></td>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=PICTURE_SIZE');">P Size</a></td>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=CAPTION');">Subt</a></td>
</tr>
<tr>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=REWIND');">Rew</a></td>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=PAUSE');">Pause<a/></td>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=FF');">FF</a></td>
</tr>
<tr>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=REC');">Rec</a></td>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=PLAY');">Play</a></td>
<td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=STOP');">Stop</a></td>
</tr>
</table>
<br />
<input type="text" name="string" id="string" onKeyUp="javascript:makeRequest('samsungremote.php', '?text=' + encodeURIComponent(document.getElementById('string').value));" /> <a href="#" onclick="javascript:makeRequest('samsungremote.php', '?text=' + encodeURIComponent(document.getElementById('string').value));">Send</a><br />
<a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=TV');">Switch to TV</a>
</body></html>
При первом обращении к ТВ (ТВ Включен!!!), он выдаст на экран сообщение, что некое устройство пытается завладеть системой...соглашаемся.
Дальше, нажимая кнопки на странице тестим и радуемся...
Скрин пульта с IOS устройства выложу позже, или может даже допилю до нормального внешнего вида, и выложу готовый пульт архивом...
З.Ы. Для тех кто спросит - "Зачем?"....на вкус и цвет фломастеры разные, а вот то, что система МД будет знать команды управления ТВ это жирный плюс.
З.Ы.Ы. Например у меня дома, только IPTV, alice при виде меня ВКЛЮЧАЕТ ТВ с ик передатчика (Wake on LAN пока на Смарт ТВ нет, увы), дальше скриптом отправляет последовательность команд (их порядка 4-5), и заходя домой у меня работает ну скажем "Discovery")))