Поразбирался и я немного.
Мне нужно было получать информацию о том какой сейчас используется вход - источник видео сигнала (антена, HDMI, PC и т.п.). Дело в том что MD работает на XBMCbuntu и с помощью Arduino перехватываются нажатие некоторых кнопок пульта от ТВ для управления самой XBMC. В обычном режиме при просмотре ТВ-каналов на пульте стрелки и кнопка ОК не используются, но если их нажимать просто так то в фоне с сервером происходит непредсказуемое, можно нечаянно его выключить или перезагрузить, запустить фильм и так далее. Поэтому требовалось както определять что сейчас на экране ТВ и если это не меню XBMC (вход HDMI2), то на пульт не реагировать никак.
Текущее состояние и некоторое управление телевизором доступно на 52235 порту через SOAP action обычным GEt/POST-запросом в xml формате.
В моем случае нужно послать сервису MainTVAgent2 команду GetCurrentExternalSource таким пакетом:
Код: Выделить всё
POST /MainTVServer2/control/MainTVAgent2 HTTP/1.0
Host: 192.168.1.15:52235
Content-Type: text/xml; charset='utf-8'
Content-Length: 298
SOAPACTION: "urn:samsung.com:service:MainTVAgent2:1#GetCurrentExternalSource"
Connection: close
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<u:GetCurrentExternalSource xmlns:u="urn:samsung.com:service:MainTVAgent2:1">
</u:GetCurrentExternalSource>
</s:Body>
</s:Envelope>
На php это выглядит следующим образом:
Код: Выделить всё
<?
$tvip = "192.168.1.15";
$command = "GetCurrentExternalSource";
$Body='<?xml version="1.0" encoding="utf-8"?><s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><u:'.$command.' xmlns:u="urn:samsung.com:service:MainTVAgent2:1"></u:'.$command.'></s:Body></s:Envelope>';
$Clen=strlen($Body);
$out ="POST /MainTVServer2/control/MainTVAgent2 HTTP/1.0\r\nHost: ".$tvip.":52235\r\nContent-Type: text/xml; charset='utf-8'\r\nContent-Length: ".$Clen."\r\n".'SOAPACTION: "urn:samsung.com:service:MainTVAgent2:1#'.$command.'"'."\r\nConnection: close\r\n\r\n";
$fp = fsockopen($tvip, 52235,$errno,$errstr,15);
$result='';
if ($fp) {
$out .= $Body."\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp)) {
$result .= fgets($fp, 1024);
}
fclose($fp);
}
//выведет содержимое ответного пакета:
//echo $result;
//распарсим для более человеческого вида:
preg_match("/<ID>(.*?)<\/ID>/is",$result,$idCurrentExternalSource);
preg_match("/<CurrentExternalSource>(.*?)<\/CurrentExternalSource>/is",$result,$CurrentExternalSource);
echo 'Source='.$CurrentExternalSource[1].'<br>';
echo 'id='.$idCurrentExternalSource[1].'<br>';
?>
Если использовать команды требующих входных данных, то они задаются между <u></u>
Доступный конкретному ТВ action list выдаст по ссылке:
http://192.168.1.15:52235/MainTVServer2 ... Agent2.xml
Помимо сервиса MainTVAgent2 также есть еще один сервис называется RenderingControl1, его action list доступен тут:
http://192.168.1.15:52235/dmr/RenderingControl1.xml
Через этот сервис например можно узнать текущую громкость, для этого нужно послать ему GetVolume аналогичным способом (обратите внимание с параметрами):
Код: Выделить всё
POST /smp_4_ HTTP/1.1
Host: 192.168.1.15:52235
Content-Type: text/xml; charset=UTF-8
Content-Length: 339
SOAPACTION: "SoapAction:urn:schemas-upnp-org:service:RenderingControl:1#GetVolume"
Connection: close
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<ns0:GetVolume xmlns:ns0="urn:schemas-upnp-org:service:RenderingControl:1">
<InstanceID>0</InstanceID>
<Channel>Master</Channel>
</ns0:GetVolume>
</s:Body>
</s:Envelope>
Напоследок ссылки, на которые отвечает мой ТВ:
http://192.168.1.15:52235/MainTVServer2 ... r2Desc.xml - информация о ТВ
http://192.168.1.15:52235/rcr/RemoteControlReceiver.xml - тоже информация о ТВ
http://192.168.1.15:52235/MainTVServer2 ... Agent2.xml - action list сервиса MainTVAgent2
http://192.168.1.15:52235/rcr/TestRCRService.xml
http://192.168.1.15:52235/dmr/AVTransport1.xml
http://192.168.1.15:52235/dmr/ConnectionManager1.xml - action list сервиса ConnectionManager1
http://192.168.1.15:52235/dmr/RenderingControl1.xml - action list сервиса RenderingControl1
http://192.168.1.15:52235/dmr/SamsungMRDesc.xml
Иконки:
http://192.168.1.15:52235/dmr/icon_LRG.jpg
http://192.168.1.15:52235/dmr/icon_LRG.png
http://192.168.1.15:52235/dmr/icon_SML.jpg
http://192.168.1.15:52235/dmr/icon_SML.png
http://192.168.1.15:9090/liveStream/1 - стрим с экрана в mpeg4, запускается только после команды StartCloneView сервиса MainTVServer2