Samsung Smart TV

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

Xseon
Сообщения: 51
Зарегистрирован: Ср сен 18, 2013 12:21 am
Благодарил (а): 9 раз
Поблагодарили: 7 раз

Samsung Smart TV

Сообщение Xseon » Ср сен 18, 2013 11:02 pm

Всем привет!
Извиняюсь за небольшой оффтоп, но так как это мой первый пост, хочу сказать следующее:
Присоединился к Вашему проекту)
Третий день ковыряю МД и просто в восторге...
Система стоит на 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";
?>
2. Вызываемый файл(*.html, *.php)

Код: Выделить всё

    <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>&nbsp;</td>
          <td>Backlight</td>
       </tr>
       <tr>
          <td>&nbsp;</td>
          <td><a href="#" onclick="javascript:makeRequest('samsungremote.php', '?key=SOURCE');">Source</a></td>
          <td>&nbsp;</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));" />&nbsp;<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")))
За это сообщение автора Xseon поблагодарили (всего 4):
krasnov (Пт апр 22, 2016 2:01 pm) • Shaitan (Ср апр 05, 2017 7:35 am) • UksusoFF (Вс апр 16, 2017 8:38 pm) • directman66 (Пт мар 16, 2018 11:38 am)
Рейтинг: 4.65%
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Samsung Smart TV

Сообщение sergejey » Чт сен 19, 2013 10:42 am

Отличный пример! На самом деле можно из php-скрипта сделать объект в системе с соответствующим методом, чтобы "красивее" использовать в сценариях. типа callMethod("MyTV.remoteKey",array('key'=>'5')); или даже callMethod('MyTV.turnOff');
Но, в принципе, и так тоже неплохо. Отмечу себе на будущее :)

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Urbas81
Сообщения: 289
Зарегистрирован: Вс сен 16, 2012 9:39 am
Благодарил (а): 0
Поблагодарили: 1 раз

Re: Samsung Smart TV

Сообщение Urbas81 » Чт сен 19, 2013 10:51 am

Вопрос: $mymac = "00-0c-29-3e-b1-4f"; // Я менял, думаю надо -это мас ТВ или компьютера где установлен MDM?
$tvappstring = "iphone.LE46F6400.iapp.samsung"; //Я вставил свою модель -на сколько критична эта строка, вчера на скорую руку не завелось, хотя помню качал приложение для андроида и на одном из двух точно работало, плохо что у меня не SMART, и нужно программу отвечающую за прием запускать вручную.
aleksey_z
Сообщения: 21
Зарегистрирован: Пн май 06, 2013 3:32 pm
Откуда: Запорожье
Благодарил (а): 0
Поблагодарили: 0

Re: Samsung Smart TV

Сообщение aleksey_z » Чт сен 19, 2013 4:47 pm

Добрый день, интересная тема. Недавно поднял подобную, об управлении АВ оборудованием по IP.
Xseon писал(а): а вот то, что система МД будет знать команды управления ТВ это жирный плюс.
Или не только ТВ. Есть коды IP команд различных АВ устройств. Можно внедрить в проект что-то типа баз.
Xseon писал(а): alice при виде меня ВКЛЮЧАЕТ ТВ с ик передатчика
Какова реализация передачи IR команды?
Xseon писал(а):(Wake on LAN пока на Смарт ТВ нет, увы)
На SONY тоже нет, и тоже решается ик передатчиком команды Вкл., а дальше можно по IP. У них есть своя утилита управления ТВ с смартфонов SONY, как-то вытягивают из неё коды IP команд.
Xseon писал(а): дальше скриптом отправляет последовательность команд (их порядка 4-5), и заходя домой у меня работает ну скажем "Discovery")))
Как выглядит такой макрос?
Xseon
Сообщения: 51
Зарегистрирован: Ср сен 18, 2013 12:21 am
Благодарил (а): 9 раз
Поблагодарили: 7 раз

Re: Samsung Smart TV

Сообщение Xseon » Чт сен 19, 2013 6:59 pm

Рад, что не безразлична ветка)
По поводу изменений в конфиге.
Я менял IP назначения (ТВ), IP отправителя и MAC отправителя запроса на мак и ИП сервера МД.
В строке с моделью ТВ, менял типа было "ES32D650" стало "LE46F6400"
Какова реализация передачи IR команды?
На данный момент у меня просто нет ИК приёмо-передатчика, но я на 100% уверен, что делается очень просто при его наличии (LARC или LIRC в помошь)
Я уже обучал ранее компьютер, но то было односторонней связью (кнопку нажал, включил монитор, повысил/понизил громкость)
Но то было под Win, мне более linux интересен, вернее ПО под неё.
Как выглядит такой макрос?
Как писал Сергей, просто вчера было много мыслей и эмоций и я упустил этот момент))
А именно callMethod("MyTV.remoteKey",array('key'=>'5')); или даже callMethod('MyTV.turnOff');
А на первых парах можно использовать и в виде ссылки: http://ИПСЕРВЕРА/samsungremote.php?key=ЛЮБОЙКЛЮЧ (если файл samsungremote.php в корне системы)
to Urbas81
Смотри на поведение ТВ, обычно они выдают запрос на "разрешение управления из вне", и если с андройда работало, 100% можно интегрировать...
dmw
Сообщения: 469
Зарегистрирован: Вт мар 12, 2013 1:22 am
Благодарил (а): 41 раз
Поблагодарили: 81 раз

Re: Samsung Smart TV

Сообщение dmw » Пт сен 20, 2013 7:27 pm

Xseon, отличная тема. Поставил, работает.
Насчет включения, samsung рекламировал свои приложения для Android с функцией Bluetooth PowerOn - возможностью включения ТВ через встроенный модуль bluetooth (3D очки через него сопрягаются с ТВ). Не изучали вопрос в данном направлении?
Максимум что у меня выходит (ubuntu), это найти его, команда hcitool scan выдает его:

Код: Выделить всё

D0:66:7B:26:30:FF       DTVBluetooth
далее по найденному маку hcitool info D0:66:7B:26:30:FF выдает следующее:

Код: Выделить всё

Requesting information ...
        BD Address:  D0:66:7B:26:30:FF
        Device Name: DTVBluetooth
        LMP Version: 2.1 (0x4) LMP Subversion: 0x42b9
        Manufacturer: Broadcom Corporation (15)
        Features: 0xbf 0xfe 0xcf 0xfe 0x9b 0xf9 0x00 0x00
                <3-slot packets> <5-slot packets> <encryption> <slot offset>
                <timing accuracy> <role switch> <sniff mode> <RSSI>
                <channel quality> <SCO link> <HV2 packets> <HV3 packets>
                <u-law log> <A-law log> <CVSD> <paging scheme> <power control>
                <transparent SCO> <broadcast encrypt> <EDR ACL 2 Mbps>
                <EDR ACL 3 Mbps> <enhanced iscan> <interlaced iscan>
                <interlaced pscan> <inquiry with RSSI> <extended SCO>
                <EV4 packets> <EV5 packets> <AFH cap. slave>
                <AFH class. slave> <3-slot EDR ACL> <5-slot EDR ACL>
                <AFH cap. master> <AFH class. master> <EDR eSCO 2 Mbps>
                <EDR eSCO 3 Mbps> <3-slot EDR eSCO>
Пытаюсь подключиться sudo hcitool cc D0:66:7B:26:30:FF && sudo hcitool con && sudo hcitool auth D0:66:7B:26:30:FF, результат:

Код: Выделить всё

Connections:
        < ACL D0:66:7B:26:30:FF handle 1 state 1 lm MASTER
HCI authentication request failed: Input/output error
Чего дальше не знаю.
Xseon
Сообщения: 51
Зарегистрирован: Ср сен 18, 2013 12:21 am
Благодарил (а): 9 раз
Поблагодарили: 7 раз

Re: Samsung Smart TV

Сообщение Xseon » Пт сен 20, 2013 10:08 pm

Даже в голову не приходило, блютус)))
Если андройд может, сможем и мы, вопрос времени...
Вот начинаю внедрять графику... думаю сергей поддержит и поможет внедрить его в виде модуля системы, чтоб каждый мог подключить и пользоваться не заморачиваясь.
image.jpeg
image.jpeg (229.36 КБ) 31608 просмотров
Xseon
Сообщения: 51
Зарегистрирован: Ср сен 18, 2013 12:21 am
Благодарил (а): 9 раз
Поблагодарили: 7 раз

Re: Samsung Smart TV

Сообщение Xseon » Пт сен 20, 2013 10:56 pm

Полазил по форуму, где народ чё только не вытворяет с телевизорами Samsung
http://forum.samygo.tv/viewtopic.php?f=13&t=2076
Из поиска по форуму по данной теме, я понял, что эта фича работает на самсунг галакси с3 и походу только с восьмой серией ТВ Самсунг.
А для очков используются ZigBee protocol и bluetooth 3.0
Так что думаю самый простой способ по ИК.
dmw
Сообщения: 469
Зарегистрирован: Вт мар 12, 2013 1:22 am
Благодарил (а): 41 раз
Поблагодарили: 81 раз

Re: Samsung Smart TV

Сообщение dmw » Пт сен 20, 2013 11:42 pm

Bluetooth версии 2.1, см выше привел вывод info по маку:

Код: Выделить всё

LMP Version: 2.1
и потом у меня какраз 8 серия ТВ.
Xseon
Сообщения: 51
Зарегистрирован: Ср сен 18, 2013 12:21 am
Благодарил (а): 9 раз
Поблагодарили: 7 раз

Re: Samsung Smart TV

Сообщение Xseon » Пт сен 20, 2013 11:49 pm

Я просто не написал, там и 3.0 (общение с очками) и 2.1 есть... второй как раз отвечает за обмен данными между устройствами (клавы, мыши и тд.). Но увы мне не на чем потестить...
Да и конкретных кодов не нашёл на том форуме... все говорят мол можно, но не пишут как...
Ответить