UPNP functions - Skript aller A/V UPNP Befehle - Tester gesucht

Hallo Gemeinde,

für mich ein Meilenstein: ich habe jetzt endlich alle relevanten UPNP-Befehle in einem functions-Skript zusammengefasst und suche noch Tester :slight_smile:

Alle Befehle zum Steuern und Rückgaben als Statusvariablen sind nach den Schemata:

urn:schemas-upnp-org:service:AVTransport:1
urn:schemas-upnp-org:service:RenderingControl:1
urn:schemas-sony-com:service:Party:1

ausgelesen und implementiert. Besonders glücklich bin ich auf ein funktionierendes Party-Streaming (!) meiner Sony Lautsprecher.

<?

//------------------------------------------------------------------------------
//UPNP_Functions_V1.7.ips.php--------------------------2013 von André Liebmann--
//------------------------------------------------------------------------------
//Skript aller HTTP-Post´s zur Steuerung von UPNP-Geräten:----------------------
//HTTP-Posts nach "urn:schemas-upnp-org:service:AVTransport:1"------------------
//HTTP-Posts nach "urn:schemas-upnp-org:service:RenderingControl:1"-------------
//HTTP-Posts nach "urn:schemas-sony-com:service:Party:1"------------------------
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
//imlementierte functions:------------------------------------------------------
//------------------------------------------------------------------------------
//function SetAVTransportURI($address, $port, $file, $MetaData)
//-----------------IN:  $file (CurrentURI)
//-----------------IN:  $MetaData (CurrentURIMetaData)
//function SetNextAVTransportURI($address, $port, $file_next, $MetaData_next)
//-----------------IN:  $file_next (NextURI)
//-----------------IN:  $MetaData_next (NextURIMetaData)
//------------------------------------------------------------------------------
//function Play_AV($address, $port)
//function Stop_AV($address, $port)
//function Pause_AV($address, $port)
//function Next_AV($address, $port) 			--> Funktion Next() in PHP vorhanden !!!
//function Previous_AV($address, $port)
//function Seek_AV($address, $port, $position)
//function Rewind_AV($address, $port)			--> Funktion Rewind() in PHP vorhanden !!!
//function Playmode_Normal($address, $port)
//function Playmode_Random($address, $port)
//function Playmode_Repeat_One($address, $port)
//function Playmode_Repeat_All($address, $port)
//------------------------------------------------------------------------------
//function SetVolume($address, $port, $DesiredVolume)
//-----------------IN:  $DesiredVolume
//function GetVolume($address, $port)
//-----------------OUT: $CurrentVolume
//function SetMute($address, $port, $DesiredMute)
//-----------------IN:  $DesiredMute
//function GetMute($address, $port)
//-----------------OUT: $CurrentMute
//function GetDeviceCapabilities($address, $port)
//-----------------OUT: $PlayMedia
//-----------------OUT: $RecMedia
//-----------------OUT: $RecQualityModes
//function GetMediaInfo($address, $port)
//-----------------OUT: $NrTracks
//-----------------OUT: $MediaDuration
//-----------------OUT: $CurrentURI
//-----------------OUT: $CurrentURIMetaData
//-----------------OUT: $NextURI
//-----------------OUT: $NextURIMetaData
//-----------------OUT: $PlayMedium
//-----------------OUT: $RecordMedium
//-----------------OUT: $WriteStatus
//function GetTransportInfo($address, $port)
//-----------------OUT: $CurrentTransportState
//-----------------OUT: $CurrentTransportStatus
//-----------------OUT: $CurrentSpeed
//function GetTransportSettings($address, $port)
//-----------------OUT: $PlayMode
//-----------------OUT: $RecQualityMode
//function GetCurrentTransportActions($address, $port)
//-----------------OUT: $Actions
//function GetPositionInfo($address, $port)
//-----------------OUT: $Track
//-----------------OUT: $TrackDuration
//-----------------OUT: $TrackMetaData
//-----------------OUT: $TrackURI
//-----------------OUT: $RelTime
//-----------------OUT: $AbsTime
//-----------------OUT: $RelCount
//-----------------OUT: $AbsCount
//------------------------------------------------------------------------------
//function Party_X_GetState($address, $port)
//-----------------OUT: $PartyState
//-----------------OUT: $PartyMode
//-----------------OUT: $PartySong
//-----------------OUT: $SessionID
//-----------------OUT: $NumberOfListeners
//-----------------OUT: $ListenerList
//-----------------OUT: $SingerUUID
//-----------------OUT: $SingerSessionID
//function Party_X_Start($address, $port, $PartyMode, $ListenerList)
//-----------------IN:  $PartyMode
//-----------------IN:  $ListenerList	   --> Auswahl der Geräte: UUID´s der Listener
//-----------------OUT: $SingerSessionID  --> essentiell für X_Entry / X_Abort
//function Party_X_Entry($address, $port, $SingerSessionID, $ListenerList)
//-----------------IN:  $SingerSessionID  --> aus X-Start: SingerSessionID
//-----------------IN:  $ListenerList     --> aus X-Start: UUID´s der Listener
//function Party_X_Abort($address, $port, $SingerSessionID)
//-----------------IN:  $SingerSessionID  --> aus X-Start: SingerSessionID
//function Party_X_Leave($address, $port, $SingerSessionID, $ListenerList)
//-----------------IN:  $SingerSessionID  --> aus X-Start: UUID´s der Listener
//-----------------IN:  $ListenerList
//------------------------------------------------------------------------------
//function send($address, $port, $content)
//-----------------OUT: $return (aus stream_get_contents)
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
//Variablen:...............X --> erforderlich
//.........................O --> anzulegen, wenn benötigt
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//zu übergebende Variablen------------------------------------------------------
//------------------------------------------------------------------------------
//$address.................X --> IP des Gerätes ("XXX.XXX.XXX.XXX")
//$port....................X --> Port des UPNP-Service (i.d.R. "8080")
//$file....................X --> Pfad zum MP3 etc.
//$MetaData................O --> MetaData des Files (kann leer bleiben)
//$file_next...............O --> Pfad zum nächsten MP3 etc.
//$MetaData_next...........O --> MetaData des nächsten Files (kann leer bleiben)
//$DesiredVolume...........X --> gewünschte Lautstärke an function SetVolume() übergeben
//$DesiredMute.............X --> gewünschtes Mute an function SetMute() übergeben
//$Target..................O --> für Rewind_AV()
//$Position................O --> für Seek_AV()
//------------------------------------------------------------------------------
//Statusvariablen---------------------------------------------------------------
//------------------------------------------------------------------------------
//$CurrentVolume...........X --> SetValue(49348 /*[Audio\Variablen\CurrentVolume]*/, $CurrentVolume);
//$CurrentMute.............X --> SetValue(35681 /*[Audio\Variablen\CurrentMute]*/, $CurrentMute);
//GetDeviceCapabilities---------------------------------------------------------
//$PlayMedia...............O --> SetValue(41033 /*[Audio\Variablen\GetDeviceCapabilities\PlayMedia]*/, $PlayMedia);
//$RecMedia................O --> SetValue(20844 /*[Audio\Variablen\GetDeviceCapabilities\RecMedia]*/, $RecMedia);
//$RecQualityModes.........O --> SetValue(37254 /*[Audio\Variablen\GetDeviceCapabilities\RecQualityModes]*/, $RecQualityModes);
//GetMediaInfo------------------------------------------------------------------
//$NrTracks................O --> SetValue(25573 /*[Audio\Variablen\GetMediaInfo\NrTracks]*/, $CurrentTransportState);
//$MediaDuration...........O --> SetValue(15324 /*[Audio\Variablen\GetMediaInfo\MediaDuration]*/, $CurrentTransportState);
//$CurrentURI..............O --> SetValue(49130 /*[Audio\Variablen\GetMediaInfo\CurrentURI]*/, $CurrentTransportState);
//$CurrentURIMetaData......O --> SetValue(28566 /*[Audio\Variablen\GetMediaInfo\CurrentURIMetaData]*/, $CurrentTransportState);
//$NextURI.................O --> SetValue(28865 /*[Audio\Variablen\GetMediaInfo\NextURI]*/, $CurrentTransportState);
//$NextURIMetaData.........O --> SetValue(39683 /*[Audio\Variablen\GetMediaInfo\NextURIMetaData]*/, $CurrentTransportState);
//$PlayMedium..............O --> SetValue(43433 /*[Audio\Variablen\GetMediaInfo\PlayMedium]*/, $CurrentTransportState);
//$RecordMedium............O --> SetValue(44923 /*[Audio\Variablen\GetMediaInfo\RecordMedium]*/, $CurrentTransportState);
//$WriteStatus.............O --> SetValue(14394 /*[Audio\Variablen\GetMediaInfo\WriteStatus]*/, $CurrentTransportState);
//GetTransportInfo--------------------------------------------------------------
//$CurrentTransportState...O --> SetValue(28600 /*[Audio\Variablen\GetTransportInfo\CurrentTransportState]*/, $CurrentTransportState);
//$CurrentTransportStatus..O --> SetValue(38643 /*[Audio\Variablen\GetTransportInfo\CurrentTransportStatus]*/, $CurrentTransportStatus);
//$CurrentSpeed............O --> SetValue(28539 /*[Audio\Variablen\GetTransportInfo\CurrentSpeed]*/, $CurrentSpeed);
//GetTransportSettings----------------------------------------------------------
//$PlayMode................O --> SetValue(11327 /*[Audio\Variablen\GetTransportSettings\PlayMode]*/, $PlayMode);
//$RecQualityMode..........O --> SetValue(22324 /*[Audio\Variablen\GetTransportSettings\RecQualityMode]*/, $RecQualityMode);
//GetCurrentTransportActions----------------------------------------------------
//$Actions.................O --> SetValue(34397 /*[Audio\Variablen\GetCurrentTransportActions\Actions]*/, $Actions);
//GetPositionInfo---------------------------------------------------------------
//$Track...................O --> Setvalue(37167 /*[Audio\Variablen\GetPositionInfo\Track]*/, $Track);
//$TrackDuration...........O --> SetValue(19680 /*[Audio\Variablen\GetPositionInfo\TrackDuration]*/, $TrackDuration);
//$TrackMetaData...........O --> SetValue(41870 /*[Audio\Variablen\GetPositionInfo\TrackMetaData]*/, $TrackMetaData);
//$TrackURI................O --> SetValue(52714 /*[Audio\Variablen\GetPositionInfo\TrackURI]*/, $TrackURI);
//$RelTime.................O --> SetValue(13956 /*[Audio\Variablen\GetPositionInfo\RelTime]*/, $RelTime);
//$AbsTime.................O --> SetValue(35614 /*[Audio\Variablen\GetPositionInfo\AbsTime]*/, $AbsTime);
//$RelCount................O --> SetValue(57388 /*[Audio\Variablen\GetPositionInfo\RelCount]*/, $RelCount);
//$AbsCount................O --> SetValue(26780 /*[Audio\Variablen\GetPositionInfo\AbsCount]*/, $AbsCount);
//Party_Mode Sony---------------------------------------------------------------
//$PartyState..............O --> Setvalue(15268 /*[Audio\Variablen\Party_Mode\PartyState]*/);
//$PartyMode...............O --> SetValue(53869 /*[Audio\Variablen\Party_Mode\PartyMode]*/);
//$PartySong...............O --> Setvalue(23773 /*[Audio\Variablen\Party_Mode\PartySong]*/);
//$SessionID...............O --> Setvalue(56331 /*[Audio\Variablen\Party_Mode\SessionID]*/);
//$NumberOfListeners.......O --> Setvalue(36305 /*[Audio\Variablen\Party_Mode\NumberOfListeners]*/);
//$ListenerList............O --> SetValue(49311 /*[Audio\Variablen\Party_Mode\ListenerList]*/);
//$SingerUUID..............O --> Setvalue(24532 /*[Audio\Variablen\Party_Mode\SingerUUID]*/);
//$SingerSessionID.........O --> Setvalue(23791 /*[Audio\Variablen\Party_Mode\SingerSessionID]*/);
//------------------------------------------------------------------------------

//AVTransportURI definieren-----------------------------------------------------

function SetAVTransportURI($address, $port, $file, $MetaData)
{
$content='POST /AVTransport/ctrl HTTP/1.1
HOST: '.$address.':'.$port.'
Content-Length: '.(394+strlen(htmlspecialchars($file))).'
Content-Type: text/xml; charset="utf-8"
SOAPAction: "urn:schemas-upnp-org:service:AVTransport:1#SetAVTransportURI"
CONNECTION: close

<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  <s:Body>
    <u:SetAVTransportURI xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">
      <InstanceID>0</InstanceID>
      <CurrentURI>'.$file.'</CurrentURI>
      <CurrentURIMetaData>'.$MetaData.'</CurrentURIMetaData>
    </u:SetAVTransportURI>
  </s:Body>
</s:Envelope>';

send($address, $port, $content);
}

//NextAVTransportURI definieren-------------------------------------------------

function SetNextAVTransportURI($address, $port, $file_next, $MetaData_next)
{
$content='POST /AVTransport/ctrl HTTP/1.1
HOST: '.$address.':'.$port.'
Content-Length: '.(394+strlen(htmlspecialchars($file))).'
Content-Type: text/xml; charset="utf-8"
SOAPAction: "urn:schemas-upnp-org:service:AVTransport:1#SetAVTransportURI"
CONNECTION: close

<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  <s:Body>
    <u:SetAVTransportURI xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">
      <InstanceID>0</InstanceID>
      <NextURI>'.$file_next.'</NextURI>
      <NextURIMetaData>'.$MetaData_next.'</NextURIMetaData>
    </u:SetAVTransportURI>
  </s:Body>
</s:Envelope>';

send($address, $port, $content);
}

//Play--------------------------------------------------------------------------

function Play_AV($address, $port)
{
$content='POST /AVTransport/ctrl HTTP/1.1
HOST: '.$address.':'.$port.'
Content-Length: 320
Content-Type: text/xml; charset="utf-8"
SOAPAction: "urn:schemas-upnp-org:service:AVTransport:1#Play"
CONNECTION: close

<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"
          s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  <s:Body>
    <u:Play xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">
      <InstanceID>0</InstanceID>
      <Speed>1</Speed>
    </u:Play>
  </s:Body>
</s:Envelope>';

send($address, $port, $content);
}

//Stop--------------------------------------------------------------------------

function Stop_AV($address, $port)
{
$content='POST /MediaRenderer/AVTransport/Control HTTP/1.1
HOST: '.$address.':'.$port.'
CONTENT-LENGTH: 250
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#Stop"
CONNECTION: close

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
 <s:Body>
  <u:Stop xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">
   <InstanceID>0</InstanceID>
  </u:Stop>
 </s:Body>
</s:Envelope>';

send($address, $port, $content);
}

//Pause-------------------------------------------------------------------------

function Pause_AV($address, $port)
{
$content='POST /MediaRenderer/AVTransport/Control HTTP/1.1
HOST: '.$address.':'.$port.'
CONTENT-LENGTH: 252
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#Pause"
CONNECTION: close

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
 <s:Body>
  <u:Pause xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">
   <InstanceID>0</InstanceID>
  </u:Pause>
 </s:Body>
</s:Envelope>';

send($address, $port, $content);
}

//Next--------------------------------------------------------------------------

function Next_AV($address, $port)
{
$content='POST /MediaRenderer/AVTransport/Control HTTP/1.1
HOST: '.$address.':'.$port.'
CONTENT-LENGTH: 250
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#Next"
CONNECTION: close

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
 <s:Body>
  <u:Next xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">
   <InstanceID>0</InstanceID>
  </u:Next>
 </s:Body>
</s:Envelope>';

send($address, $port, $content);
}

//Previous----------------------------------------------------------------------

function Previous_AV($address, $port)
{
$content='POST /MediaRenderer/AVTransport/Control HTTP/1.1
HOST: '.$address.':'.$port.'
CONTENT-LENGTH: 258
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#Previous"
CONNECTION: close

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
 <s:Body>
  <u:Previous xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">
   <InstanceID>0</InstanceID>
  </u:Previous>
 </s:Body>
</s:Envelope>';

send($address, $port, $content);
}

//Seek--------------------------------------------------------------------------

function Seek_AV($address, $port, $position)
{
$content='POST /MediaRenderer/AVTransport/Control HTTP/1.1
HOST: '.$address.':'.$port.'
CONTENT-LENGTH: 296
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#Seek"
CONNECTION: close

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
 <s:Body>
  <u:Seek xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">
   <InstanceID>0</InstanceID>
   <Unit>REL_TIME</Unit>
   <Target>'.$position.'</Target>
  </u:Seek>
 </s:Body>
</s:Envelope>';

send($address, $port, $content);
}

//Rewind------------------------------------------------------------------------

function Rewind_AV($address, $port)
{
$content='POST /MediaRenderer/AVTransport/Control HTTP/1.1
HOST: '.$address.':'.$port.'
CONTENT-LENGTH: 296
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#Seek"
CONNECTION: close

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
 <s:Body>
  <u:Seek xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">
   <InstanceID>0</InstanceID>
   <Unit>REL_TIME</Unit>
   <Target>'.$Target.'</Target>
  </u:Seek>
 </s:Body>
</s:Envelope>';

send($address, $port, $content);
}

//Setplaymode/NORMAL------------------------------------------------------------

function Playmode_Normal($address, $port)
{
$content='POST /AVTransport/ctrl HTTP/1.1
HOST: '.$address.':'.$port.'
Content-Length: 387
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#SetPlayMode"
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:SetPlayMode xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">
         <InstanceID>0</InstanceID>
         <NewPlayMode>NORMAL</NewPlayMode>
      </u:SetPlayMode>
   </s:Body>
</s:Envelope>';

send($address, $port, $content);
}

//Setplaymode/RANDOM------------------------------------------------------------

function Playmode_Random($address, $port)
{
$content='POST /AVTransport/ctrl HTTP/1.1
HOST: '.$address.':'.$port.'
Content-Length: 387
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#SetPlayMode"
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:SetPlayMode xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">
         <InstanceID>0</InstanceID>
         <NewPlayMode>RANDOM</NewPlayMode>
      </u:SetPlayMode>
   </s:Body>
</s:Envelope>';

send($address, $port, $content);
}

//Setplaymode/REPEAT_ONE--------------------------------------------------------

function Playmode_Repeat_One($address, $port)
{
$content='POST /AVTransport/ctrl HTTP/1.1
HOST: '.$address.':'.$port.'
Content-Length: 391
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#SetPlayMode"
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:SetPlayMode xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">
         <InstanceID>0</InstanceID>
         <NewPlayMode>REPEAT_ONE</NewPlayMode>
      </u:SetPlayMode>
   </s:Body>
</s:Envelope>';

send($address, $port, $content);
}

//Setplaymode/REPEAT_ALL--------------------------------------------------------

function Playmode_Repeat_All($address, $port)
{
$content='POST /AVTransport/ctrl HTTP/1.1
HOST: '.$address.':'.$port.'
Content-Length: 391
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#SetPlayMode"
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:SetPlayMode xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">
         <InstanceID>0</InstanceID>
         <NewPlayMode>REPEAT_ALL</NewPlayMode>
      </u:SetPlayMode>
   </s:Body>
</s:Envelope>';

send($address, $port, $content);
}

//SetVolume---------------------------------------------------------------------

function SetVolume($address, $port, $DesiredVolume)
{
$content='POST /MediaRenderer/RenderingControl/Control HTTP/1.1
HOST: '.$address.':'.$port.'
CONTENT-LENGTH: 32'.strlen($DesiredVolume).'
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:RenderingControl:1#SetVolume"
CONNECTION: close

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
 <s:Body>
  <u:SetVolume xmlns:u="urn:schemas-upnp-org:service:RenderingControl:1">
   <InstanceID>0</InstanceID>
   <Channel>Master</Channel>
   <DesiredVolume>'.$DesiredVolume.'</DesiredVolume>
  </u:SetVolume>
 </s:Body>
</s:Envelope>';

send($address, $port, $content);
}

//GetVolume---------------------------------------------------------------------

function GetVolume($address, $port)
{
$content_GetVolume='POST /RenderingControl/ctrl HTTP/1.1
HOST: '.$address.':'.$port.'
CONTENT-LENGTH: 380
CONTENT-TYPE: text/xml; charset="utf-8"
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>
  <u:GetVolume xmlns:u="urn:schemas-upnp-org:service:RenderingControl:1">
   <InstanceID>0</InstanceID>
   <Channel>Master</Channel>
  </u:GetVolume>
 </s:Body>
</s:Envelope>';

//GetVolume Senden--------------------------------------------------------------

$fp = fsockopen ($address, $port, $errno, $errstr, 10);

fputs ($fp, $content_GetVolume);

		$buffer = stream_get_contents($fp, -1);

		$vars = explode("

", $buffer); 						//Header abtrennen
		$header = $vars[0];                    					//Header
		$message = $vars[1];                   					//Meassage

		echo $message;

		$handle = fopen("GetVolume.xml", "w"); 					//XML schreiben
		fwrite($handle, $message);
		fclose($handle);

fclose($fp);

		//XML cutten und Variablen schreiben--------------------------------------

		$vars1 = explode("<CurrentVolume>", $message);			//cut vor CurrentVolume
		$cutted1 = $vars1[0];
		$cutted2 = $vars1[1];
		$vars2 = explode("</CurrentVolume>", $cutted2);			//cut nach CurrentVolume
		$cutted3 = $vars2[1];
		$CurrentVolume = $vars2[0];

		echo $CurrentVolume;

	SetValue(49348 /*[Audio\Variablen\CurrentVolume]*/, $CurrentVolume); //Buffer
}

//SetMute-----------------------------------------------------------------------

function SetMute($address, $port, $DesiredMute)
{
$content='POST /RenderingControl/ctrl HTTP/1.1
HOST: '.$address.':'.$port.'
CONTENT-TYPE: text/xml; charset="utf-8"
Content-Length: 396
SOAPACTION: "urn:schemas-upnp-org:service:RenderingControl:1#SetMute"
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:SetMute xmlns:u="urn:schemas-upnp-org:service:RenderingControl:1">
   <InstanceID>0</InstanceID>
   <Channel>Master</Channel>
   <DesiredMute>'.$DesiredMute.'</DesiredMute>
  </u:SetMute>
 </s:Body>
</s:Envelope>';

send($address, $port, $content);
}

//GetMute-----------------------------------------------------------------------

function GetMute($address, $port)
{
$content_GetMute='POST /RenderingControl/ctrl HTTP/1.1
HOST: '.$address.':'.$port.'
CONTENT-LENGTH: 376
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:RenderingControl:1#GetMute"
CONNECTION: close

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
 <s:Body>
  <u:GetMute xmlns:u="urn:schemas-upnp-org:service:RenderingControl:1">
   <InstanceID>0</InstanceID>
   <Channel>Master</Channel>
  </u:GetMute>
 </s:Body>
</s:Envelope>';

//GetMute Senden----------------------------------------------------------------

$fp = fsockopen ($address, $port, $errno, $errstr, 10);

fputs ($fp, $content_GetMute);

		$buffer = stream_get_contents($fp, -1);

		$vars = explode("

", $buffer); 						//Header abtrennen
		$header = $vars[0];                    					//Header
		$message = $vars[1];                   					//Meassage

		echo $message;

		$handle = fopen("GetMute.xml", "w"); 						//XML schreiben
		fwrite($handle, $message);
		fclose($handle);

fclose($fp);

		//XML cutten und Variablen schreiben--------------------------------------

		$vars1 = explode("<CurrentMute>", $message);				//cut vor CurrentMute
		$cutted1 = $vars1[0];
		$cutted2 = $vars1[1];
		$vars2 = explode("</CurrentMute>", $cutted2);			//cut nach CurrentMute
		$cutted3 = $vars2[1];
		$CurrentMute = $vars2[0];

		echo $CurrentMute;

	SetValue(35681 /*[Audio\Variablen\CurrentMute]*/, $CurrentMute); //Buffer
}

//GetDeviceCapabilities---------------------------------------------------------

function GetDeviceCapabilities($address, $port)
{
$content_GetDeviceCapabilities='POST /AVTransport/ctrl HTTP/1.1
HOST: '.$address.':'.$port.'
CONTENT-LENGTH: 363
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#GetDeviceCapabilities"
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:GetDeviceCapabilities xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">
         <InstanceID>0</InstanceID>
      </u:GetDeviceCapabilities>
   </s:Body>
</s:Envelope>';

//GetDeviceCapabilities Senden---------------------------------------------------

$fp = fsockopen ($address, $port, $errno, $errstr, 10);

fputs ($fp, $content_GetDeviceCapabilities);

		$buffer = stream_get_contents($fp, -1);

		$vars = explode("

", $buffer); 						//Header abtrennen
		$header = $vars[0];                    					//Header
		$message = $vars[1];                   					//Meassage

		echo $message;

		$handle = fopen("GetDeviceCapabilities.xml", "w"); 	//XML schreiben
		fwrite($handle, $message);
		fclose($handle);

fclose($fp);

		//XML cutten und Variablen schreiben--------------------------------------

		$vars1 = explode("<PlayMedia>", $message);				//cut vor PlayMedia
		$cutted1 = $vars1[0];
		$cutted2 = $vars1[1];
		$vars2 = explode("</PlayMedia>", $cutted2);				//cut nach PlayMedia
		$cutted3 = $vars2[1];
		$PlayMedia = $vars2[0];

		echo $PlayMedia;

	SetValue(41033 /*[Audio\Variablen\GetDeviceCapabilities\PlayMedia]*/, $PlayMedia);

		$vars1 = explode("<RecMedia>", $message);					//cut vor RecMedia
		$cutted1 = $vars1[0];
		$cutted2 = $vars1[1];
		$vars2 = explode("</RecMedia>", $cutted2);				//cut nach RecMedia
		$cutted3 = $vars2[1];
		$RecMedia = $vars2[0];

		echo $RecMedia;

	SetValue(20844 /*[Audio\Variablen\GetDeviceCapabilities\RecMedia]*/, $RecMedia);

		$vars1 = explode("<RecQualityModes>", $message);		//cut vor RecQualityModes
		$cutted1 = $vars1[0];
		$cutted2 = $vars1[1];
		$vars2 = explode("</RecQualityModes>", $cutted2);		//cut nach RecQualityModes
		$cutted3 = $vars2[1];
		$RecQualityModes = $vars2[0];

		echo $RecQualityModes;

	SetValue(37254 /*[Audio\Variablen\GetDeviceCapabilities\RecQualityModes]*/, $RecQualityModes);
}

//GetMediaInfo------------------------------------------------------------------

function GetMediaInfo ($address, $port)
{
$content_GetMediaInfo='POST /AVTransport/ctrl HTTP/1.1
HOST: '.$address.':'.$port.'
Content-Length: 345
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#GetMediaInfo"
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:GetMediaInfo xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">
         <InstanceID>0</InstanceID>
      </u:GetMediaInfo>
   </s:Body>
</s:Envelope>';

//GetMediaInfo Senden-----------------------------------------------------------

$fp = fsockopen ($address, $port, $errno, $errstr, 10);

fputs ($fp, $content_GetMediaInfo);

		$buffer = stream_get_contents($fp, -1);

		$vars = explode("

", $buffer); 						//Header abtrennen
		$header = $vars[0];                    					//Header
		$message = $vars[1];                   					//Meassage

		echo $message;

		$handle = fopen("GetMediaInfo.xml", "w"); 				//XML schreiben
		fwrite($handle, $message);
		fclose($handle);

fclose($fp);

		//XML cutten und Variablen schreiben--------------------------------------

		$vars1 = explode("<NrTracks>", $message);					//cut vor NrTracks
		$cutted1 = $vars1[0];
		$cutted2 = $vars1[1];
		$vars2 = explode("</NrTracks>", $cutted2);				//cut nach NrTracks
		$cutted3 = $vars2[1];
		$NrTracks = $vars2[0];

		echo $NrTracks;

	SetValue(25573 /*[Audio\Variablen\GetMediaInfo\NrTracks]*/, $NrTracks);

		$vars1 = explode("<MediaDuration>", $message);			//cut vor MediaDuration
		$cutted1 = $vars1[0];
		$cutted2 = $vars1[1];
		$vars2 = explode("</MediaDuration>", $cutted2);			//cut nach MediaDuration
		$cutted3 = $vars2[1];
		$MediaDuration = $vars2[0];

		echo $MediaDuration;

	SetValue(15324 /*[Audio\Variablen\GetMediaInfo\MediaDuration]*/, $MediaDuration);

		$vars1 = explode("<CurrentURI>", $message);				//cut vor CurrentURI
		$cutted1 = $vars1[0];
		$cutted2 = $vars1[1];
		$vars2 = explode("</CurrentURI>", $cutted2);				//cut nach CurrentURI
		$cutted3 = $vars2[1];
		$CurrentURI = $vars2[0];

		echo $CurrentURI;

	SetValue(49130 /*[Audio\Variablen\GetMediaInfo\CurrentURI]*/, $CurrentURI);

		$vars1 = explode("<CurrentURIMetaData>", $message);	//cut vor CurrentURIMetaData
		$cutted1 = $vars1[0];
		$cutted2 = $vars1[1];
		$vars2 = explode("</CurrentURIMetaData>", $cutted2);	//cut nach CurrentURIMetaData
		$cutted3 = $vars2[1];
		$CurrentURIMetaData = $vars2[0];

		echo $CurrentURIMetaData;

	SetValue(28566 /*[Audio\Variablen\GetMediaInfo\CurrentURIMetaData]*/, $CurrentURIMetaData);

		$vars1 = explode("<NextURI>", $message);					//cut vor NextURI
		$cutted1 = $vars1[0];
		$cutted2 = $vars1[1];
		$vars2 = explode("</NextURI>", $cutted2);					//cut nach NextURI
		$cutted3 = $vars2[1];
		$NextURI = $vars2[0];

		echo $NextURI;

	SetValue(28865 /*[Audio\Variablen\GetMediaInfo\NextURI]*/, $NextURI);

		$vars1 = explode("<NextURIMetaData>", $message);		//cut vor NextURIMetaData
		$cutted1 = $vars1[0];
		$cutted2 = $vars1[1];
		$vars2 = explode("</NextURIMetaData>", $cutted2);		//cut nach NextURIMetaData
		$cutted3 = $vars2[1];
		$NextURIMetaData = $vars2[0];

		echo $NextURIMetaData;

	SetValue(39683 /*[Audio\Variablen\GetMediaInfo\NextURIMetaData]*/, $NextURIMetaData);

		$vars1 = explode("<PlayMedium>", $message);				//cut vor PlayMedium
		$cutted1 = $vars1[0];
		$cutted2 = $vars1[1];
		$vars2 = explode("</PlayMedium>", $cutted2);				//cut nach PlayMedium
		$cutted3 = $vars2[1];
		$PlayMedium = $vars2[0];

		echo $PlayMedium;

	SetValue(43433 /*[Audio\Variablen\GetMediaInfo\PlayMedium]*/, $PlayMedium);

		$vars1 = explode("<RecordMedium>", $message);			//cut vor RecordMedium
		$cutted1 = $vars1[0];
		$cutted2 = $vars1[1];
		$vars2 = explode("</RecordMedium>", $cutted2);			//cut nach RecordMedium
		$cutted3 = $vars2[1];
		$RecordMedium = $vars2[0];

		echo $RecordMedium;

	SetValue(44923 /*[Audio\Variablen\GetMediaInfo\RecordMedium]*/, $RecordMedium);

		$vars1 = explode("<WriteStatus>", $message);			//cut vor WriteStatus
		$cutted1 = $vars1[0];
		$cutted2 = $vars1[1];
		$vars2 = explode("</WriteStatus>", $cutted2);			//cut nach WriteStatus
		$cutted3 = $vars2[1];
		$WriteStatus = $vars2[0];

		echo $WriteStatus;

	SetValue(14394 /*[Audio\Variablen\GetMediaInfo\WriteStatus]*/, $WriteStatus);
}

//GetTransportInfo--------------------------------------------------------------

function GetTransportInfo($address, $port)
{
$content_GetTransportInfo='POST /AVTransport/ctrl HTTP/1.1
HOST: '.$address.':'.$port.'
CONTENT-TYPE: text/xml; charset="utf-8"
Content-Length: 353
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#GetTransportInfo"
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:GetTransportInfo xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">
         <InstanceID>0</InstanceID>
      </u:GetTransportInfo>
   </s:Body>
</s:Envelope>';

//GetTransportInfo Senden--------------------------------------------------------

$fp = fsockopen ($address, $port, $errno, $errstr, 10);

fputs ($fp, $content_GetTransportInfo);

		$buffer = stream_get_contents($fp, -1);

		$vars = explode("

", $buffer); 							//Header abtrennen
		$header = $vars[0];                    						//Header
		$message = $vars[1];                   						//Meassage

		echo $message;

		$handle = fopen("GetTransportInfo.xml", "w"); 				//XML schreiben
		fwrite($handle, $message);
		fclose($handle);

fclose($fp);

		//XML cutten und Variablen schreiben--------------------------------------

		$vars1 = explode("<CurrentTransportState>", $message);	//cut vor CurrentTransportState
		$cutted1 = $vars1[0];
		$cutted2 = $vars1[1];
		$vars2 = explode("</CurrentTransportState>", $cutted2);	//cut nach CurrentTransportState
		$cutted3 = $vars2[1];
		$CurrentTransportState = $vars2[0];

		echo $CurrentTransportState;

	SetValue(28600 /*[Audio\Variablen\GetTransportInfo\CurrentTransportState]*/, $CurrentTransportState);

		$vars1 = explode("<CurrentTransportStatus>", $message);	//cut vor CurrentTransportStatus
		$cutted1 = $vars1[0];
		$cutted2 = $vars1[1];
		$vars2 = explode("</CurrentTransportStatus>", $cutted2);	//cut nach CurrentTransportStatus
		$cutted3 = $vars2[1];
		$CurrentTransportStatus = $vars2[0];

		echo $CurrentTransportStatus;

	SetValue(38643 /*[Audio\Variablen\GetTransportInfo\CurrentTransportStatus]*/, $CurrentTransportStatus);

		$vars1 = explode("<CurrentSpeed>", $message);				//cut vor CurrentSpeed
		$cutted1 = $vars1[0];
		$cutted2 = $vars1[1];
		$vars2 = explode("</CurrentSpeed>", $cutted2);				//cut nach CurrentSpeed
		$cutted3 = $vars2[1];
		$CurrentSpeed = $vars2[0];

		echo $CurrentSpeed;

	SetValue(28539 /*[Audio\Variablen\GetTransportInfo\CurrentSpeed]*/, $CurrentSpeed);
}

//GetTransportSettings----------------------------------------------------------

function GetTransportSettings($address, $port)
{
$content_GetTransportSettings='POST /AVTransport/ctrl HTTP/1.1
HOST: '.$address.':'.$port.'
Content-Length: 361
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#GetTransportSettings"
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:GetTransportSettings xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">
         <InstanceID>0</InstanceID>
      </u:GetTransportSettings>
   </s:Body>
</s:Envelope>';

//GetTransportSettings Senden---------------------------------------------------

$fp = fsockopen ($address, $port, $errno, $errstr, 10);

fputs ($fp, $content_GetTransportSettings);

		$buffer = stream_get_contents($fp, -1);

		$vars = explode("

", $buffer); 						//Header abtrennen
		$header = $vars[0];                    					//Header
		$message = $vars[1];                   					//Meassage

		echo $message;

		$handle = fopen("Party_GetCurrentTransportActions.xml", "w"); 	//XML schreiben
		fwrite($handle, $message);
		fclose($handle);

fclose($fp);

		//XML cutten und Variablen schreiben--------------------------------------

		$vars1 = explode("<PlayMode>", $message);					//cut vor PlayMode
		$cutted1 = $vars1[0];
		$cutted2 = $vars1[1];
		$vars2 = explode("</PlayMode>", $cutted2);				//cut nach PlayMode
		$cutted3 = $vars2[1];
		$PlayMode = $vars2[0];

		echo $PlayMode;

	SetValue(11327 /*[Audio\Variablen\GetTransportSettings\PlayMode]*/, $PlayMode);

		$vars1 = explode("<RecQualityMode>", $message);			//cut vor RecQualityMode
		$cutted1 = $vars1[0];
		$cutted2 = $vars1[1];
		$vars2 = explode("</RecQualityMode>", $cutted2);		//cut nach RecQualityMode
		$cutted3 = $vars2[1];
		$RecQualityMode = $vars2[0];

		echo $RecQualityMode;

	SetValue(22324 /*[Audio\Variablen\GetTransportSettings\RecQualityMode]*/, $RecQualityMode);
}

//GetCurrentTransportActions----------------------------------------------------

function GetCurrentTransportActions($address, $port)
{
$content_GetCurrentTransportActions='POST /AVTransport/ctrl HTTP/1.1
HOST: '.$address.':'.$port.'
Content-Length: 373
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#GetCurrentTransportActions"
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:GetCurrentTransportActions xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">
   <InstanceID>0</InstanceID>
  </u:GetCurrentTransportActions>
 </s:Body>
</s:Envelope>';

//GetCurrentTransportActions Senden---------------------------------------------

$fp = fsockopen ($address, $port, $errno, $errstr, 10);

fputs ($fp, $content_GetCurrentTransportActions);

		$buffer = stream_get_contents($fp, -1);

		$vars = explode("

", $buffer); 					//Header abtrennen
		$header = $vars[0];                    				//Header
		$message = $vars[1];                   				//Meassage

		echo $message;

		$handle = fopen("Party_GetCurrentTransportActions.xml", "w"); 	//XML schreiben
		fwrite($handle, $message);
		fclose($handle);

fclose($fp);

		//XML cutten und Variablen schreiben--------------------------------------

		$vars1 = explode("<Actions>", $message);				//cut vor Actions
		$cutted1 = $vars1[0];
		$cutted2 = $vars1[1];
		$vars2 = explode("</Actions>", $cutted2);				//cut nach Actions
		$cutted3 = $vars2[1];
		$Actions = $vars2[0];

		echo $Actions;

	SetValue(34397 /*[Audio\Variablen\GetCurrentTransportActions\Actions]*/, $Actions);
}

//GetPositionInfo---------------------------------------------------------------

function GetPositionInfo($address, $port)
{
$content_GetPositionInfo='POST /AVTransport/ctrl HTTP/1.1
HOST: '.$address.':'.$port.'
Content-Length: 272
Content-Type: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#GetPositionInfo"
Connection: Close

<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
 <s:Body>
  <u:GetPositionInfo xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">
   <InstanceID>0</InstanceID>
  </u:GetPositionInfo>
 </s:Body>
</s:Envelope>';

//GetPositionInfo Senden--------------------------------------------------------

$fp = fsockopen ($address, $port, $errno, $errstr, 10);

fputs ($fp, $content_GetPositionInfo);

		$buffer = stream_get_contents($fp, -1);

		$vars = explode("

", $buffer); 						//Header abtrennen
		$header = $vars[0];                    					//Header
		$message = $vars[1];                   					//Meassage

		echo $message;

		$handle = fopen("Party_GetPositionInfo.xml", "w"); 	//XML schreiben
		fwrite($handle, $message);
		fclose($handle);

fclose($fp);

		//XML cutten und Variablen schreiben--------------------------------------

		$vars1 = explode("<Track>", $message);						//cut vor Track
		$cutted1 = $vars1[0];
		$cutted2 = $vars1[1];
		$vars2 = explode("</Track>", $cutted2);					//cut nach Track
		$cutted3 = $vars2[1];
		$Track = $vars2[0];

		echo $Track;

	SetValue(37167 /*[Audio\Variablen\GetPositionInfo\Track]*/, $Track);

		$vars1 = explode("<TrackDuration>", $message);			//cut vor TrackDuration
		$cutted1 = $vars1[0];
		$cutted2 = $vars1[1];
		$vars2 = explode("</TrackDuration>", $cutted2);			//cut nach TrackDuration
		$cutted3 = $vars2[1];
		$TrackDuration = $vars2[0];

		echo $TrackDuration;

	SetValue(19680 /*[Audio\Variablen\GetPositionInfo\TrackDuration]*/, $TrackDuration);

		$vars1 = explode("<TrackMetaData>", $message);			//cut vor TrackMetaData
		$cutted1 = $vars1[0];
		$cutted2 = $vars1[1];
		$vars2 = explode("</TrackMetaData>", $cutted2);			//cut nach TrackMetaData
		$cutted3 = $vars2[1];
		$TrackMetaData = $vars2[0];

		echo $TrackMetaData;

	SetValue(41870 /*[Audio\Variablen\GetPositionInfo\TrackMetaData]*/, $TrackMetaData);

		$vars1 = explode("<TrackURI>", $message);					//cut vor TrackURI
		$cutted1 = $vars1[0];
		$cutted2 = $vars1[1];
		$vars2 = explode("</TrackURI>", $cutted2);				//cut nach TrackURI
		$cutted3 = $vars2[1];
		$TrackURI = $vars2[0];

		echo $TrackURI;

	SetValue(52714 /*[Audio\Variablen\GetPositionInfo\TrackURI]*/, $TrackURI);

		$vars1 = explode("<RelTime>", $message);					//cut vor RelTime
		$cutted1 = $vars1[0];
		$cutted2 = $vars1[1];
		$vars2 = explode("</RelTime>", $cutted2);					//cut nach RelTime
		$cutted3 = $vars2[1];
		$RelTime = $vars2[0];

		echo $RelTime;

	SetValue(13956 /*[Audio\Variablen\GetPositionInfo\RelTime]*/, $RelTime);

		$vars1 = explode("<AbsTime>", $message);					//cut vor AbsTime
		$cutted1 = $vars1[0];
		$cutted2 = $vars1[1];
		$vars2 = explode("</AbsTime>", $cutted2);					//cut nach AbsTime
		$cutted3 = $vars2[1];
		$AbsTime = $vars2[0];

		echo $AbsTime;

	SetValue(35614 /*[Audio\Variablen\GetPositionInfo\AbsTime]*/, $AbsTime);

		$vars1 = explode("<RelCount>", $message);					//cut vor RelCount
		$cutted1 = $vars1[0];
		$cutted2 = $vars1[1];
		$vars2 = explode("</RelCount>", $cutted2);				//cut nach RelCount
		$cutted3 = $vars2[1];
		$RelCount = $vars2[0];

		echo $RelCount;

	SetValue(57388 /*[Audio\Variablen\GetPositionInfo\RelCount]*/, $RelCount);

		$vars1 = explode("<AbsCount>", $message);					//cut vor AbsCount
		$cutted1 = $vars1[0];
		$cutted2 = $vars1[1];
		$vars2 = explode("</AbsCount>", $cutted2);				//cut nach AbsCount
		$cutted3 = $vars2[1];
		$AbsCount = $vars2[0];

		echo $AbsCount;

	SetValue(26780 /*[Audio\Variablen\GetPositionInfo\AbsCount]*/, $AbsCount);
}

//------------------------------------------------------------------------------
//Party_Mode Sony
//------------------------------------------------------------------------------

//Party_X_GetState--------------------------------------------------------------

function Party_X_GetState($address, $port)
{
$content_Party_X_GetState='POST /Party_Control HTTP/1.1
HOST: '.$address.':'.$port.'
Content-Length: 298
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-sony-com:service:Party:1#X_GetState"
CONNECTION: close

<?xml version="1.0" encoding="utf-8"?>
  <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <s:Body>
      <u:X_GetState xmlns:u="urn:schemas-sony-com:service:Party:1"></u:X_GetState>
    </s:Body>
  </s:Envelope>';

	//Party_GetState senden und XML schreiben------------------------------------

	$fp = fsockopen ($address, $port, $errno, $errstr, 10);

	fputs ($fp, $content_Party_X_GetState);

		$buffer = stream_get_contents($fp, -1);

		$vars = explode("

", $buffer); 					//Header abtrennen
		$header = $vars[0];                    				//Header
		$message = $vars[1];                   				//Meassage

		echo $message;

		$handle = fopen("Party_GetState.xml", "w"); 			//XML schreiben
		fwrite($handle, $message);
		fclose($handle);

	fclose($fp);

		//Party_GetState XML cutten und Variablen schreiben--------------------------------------------

		$vars1 = explode("<PartyState>", $message);			//cut vor PartyState
		$cutted1 = $vars1[0];
		$cutted2 = $vars1[1];
		$vars2 = explode("</PartyState>", $cutted2);			//cut nach PartyState
		$cutted3 = $vars2[1];
		$PartyState = $vars2[0];

		echo $PartyState;

	SetValue(15268 /*[Audio\Variablen\Party_Mode\PartyState]*/, $PartyState);

		$vars1 = explode("<PartyMode>", $message);			//cut vor PartyMode
		$cutted1 = $vars1[0];
		$cutted2 = $vars1[1];
		$vars2 = explode("</PartyMode>", $cutted2);			//cut nach PartyMode
		$cutted3 = $vars2[1];
		$PartyMode = $vars2[0];

		echo $PartyMode;

	SetValue(53869 /*[Audio\Variablen\Party_Mode\PartyMode]*/, $PartyMode);

		$vars1 = explode("<PartySong>", $message);			//cut vor PartySong
		$cutted1 = $vars1[0];
		$cutted2 = $vars1[1];
		$vars2 = explode("</PartySong>", $cutted2);			//cut nach PartySong
		$cutted3 = $vars2[1];
		$PartySong = $vars2[0];

		echo $PartySong;

	SetValue(23773 /*[Audio\Variablen\Party_Mode\PartySong]*/, $PartySong);

		$vars1 = explode("<SessionID>", $message);			//cut vor SessionID
		$cutted1 = $vars1[0];
		$cutted2 = $vars1[1];
		$vars2 = explode("</SessionID>", $cutted2);			//cut nach SessionID
		$cutted3 = $vars2[1];
		$SessionID = $vars2[0];

		echo $SessionID;

	SetValue(56331 /*[Audio\Variablen\Party_Mode\SessionID]*/, $SessionID);

		$vars1 = explode("<NumberOfListeners>", $message);		//cut vor NumberOfListeners
		$cutted1 = $vars1[0];
		$cutted2 = $vars1[1];
		$vars2 = explode("</NumberOfListeners>", $cutted2);	//cut nach NumberOfListeners
		$cutted3 = $vars2[1];
		$NumberOfListeners = $vars2[0];

		echo $NumberOfListeners;

	SetValue(36305 /*[Audio\Variablen\Party_Mode\NumberOfListeners]*/, $NumberOfListeners);

		$vars1 = explode("<ListenerList>", $message);			//cut vor ListenerList
		$cutted1 = $vars1[0];
		$cutted2 = $vars1[1];
		$vars2 = explode("</ListenerList>", $cutted2);			//cut nach ListenerList
		$cutted3 = $vars2[1];
		$ListenerList = $vars2[0];

		echo $ListenerList;

	SetValue(49311 /*[Audio\Variablen\Party_Mode\ListenerList]*/, $ListenerList);

		$vars1 = explode("<SingerUUID>", $message);				//cut vor SingerUUID
		$cutted1 = $vars1[0];
		$cutted2 = $vars1[1];
		$vars2 = explode("</SingerUUID>", $cutted2);				//cut nach SingerUUID
		$cutted3 = $vars2[1];
		$SingerUUID = $vars2[0];

		echo $SingerUUID;

	SetValue(24532 /*[Audio\Variablen\Party_Mode\SingerUUID]*/, $SingerUUID);

		$vars1 = explode("<SingerSessionID>", $message);		//cut vor SingerSessionID
		$cutted1 = $vars1[0];
		$cutted2 = $vars1[1];
		$vars2 = explode("</SingerSessionID>", $cutted2);		//cut nach SingerSessionID
		$cutted3 = $vars2[1];
		$SingerSessionID = $vars2[0];

		echo $SingerSessionID;

	SetValue(23791 /*[Audio\Variablen\Party_Mode\SingerSessionID]*/, $SingerSessionID);
}

//Party_X_Start-----------------------------------------------------------------

function Party_X_Start($address, $port, $PartyMode, $ListenerList)
{
$content_Party_X_Start='POST /Party_Control HTTP/1.1
HOST: '.$address.':'.$port.'
Content-Length: 505
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-sony-com:service:Party:1#X_Start"
CONNECTION: close

<?xml version="1.0" encoding="utf-8"?>
  <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <s:Body>
      <u:X_Start xmlns:u="urn:schemas-sony-com:service:Party:1">
        <PartyMode>'.$PartyMode.'</PartyMode>
        <ListenerList>'.$ListenerList.'</ListenerList>
      </u:X_Start>
    </s:Body>
  </s:Envelope>';

		//Party_Start Senden------------------------------------------------------------

	$fp = fsockopen ($address, $port, $errno, $errstr, 10);

	fputs ($fp, $content_Party_X_Start);

		$buffer = stream_get_contents($fp, -1);

		$vars = explode("

", $buffer); 						//Header abtrennen
		$header = $vars[0];                    					//Header
		$message = $vars[1];                   					//Meassage

		echo $message;

		$handle = fopen("Party_Start.xml", "w"); 					//XML schreiben
		fwrite($handle, $message);
		fclose($handle);

		//Party_Start XML cutten und Variablen schreiben-----------------------------

		$vars1 = explode("<SingerSessionID>", $message);		//cut vor SingerSessionID
		$cutted1 = $vars1[0];
		$cutted2 = $vars1[1];
		$vars2 = explode("</SingerSessionID>", $cutted2);		//cut nach SingerSessionID
		$cutted3 = $vars2[1];
		$SingerSessionID = $vars2[0];

		echo $SingerSessionID;

	SetValue (23791 /*[Audio\Variablen\Party_Mode\SingerSessionID]*/, $SingerSessionID);
}

//Party_X_Entry-----------------------------------------------------------------

function Party_X_Entry($address, $port, $SingerSessionID, $ListenerList)
{
$content='POST /Party_Control HTTP/1.1
HOST: '.$address.':'.$port.'
Content-Length: 514
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-sony-com:service:Party:1#X_Entry"
CONNECTION: close

<?xml version="1.0" encoding="utf-8"?>
  <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <s:Body>
      <u:X_Entry xmlns:u="urn:schemas-sony-com:service:Party:1">
        <SingerSessionID>'.$SingerSessionID.'</SingerSessionID>
        <ListenerList>'.$ListenerList.'</ListenerList>
      </u:X_Entry>
    </s:Body>
  </s:Envelope>';

send($address, $port, $content);
}

//Party_X_Abort-----------------------------------------------------------------

function Party_X_Abort($address, $port, $SingerSessionID)
{
$content='POST /Party_Control HTTP/1.1
HOST: '.$address.':'.$port.'
Content-Length: 351
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-sony-com:service:Party:1#X_Abort"
CONNECTION: close

<?xml version="1.0" encoding="utf-8"?>
  <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <s:Body>
      <u:X_Abort xmlns:u="urn:schemas-sony-com:service:Party:1">
        <SingerSessionID>'.$SingerSessionID.'</SingerSessionID>
      </u:X_Abort>
    </s:Body>
  </s:Envelope>';

send($address, $port, $content);
}

//Party_X_Leave-----------------------------------------------------------------

function Party_X_Leave($address, $port, $SingerSessionID, $ListenerList)
{
$content='POST /Party_Control HTTP/1.1
HOST: '.$address.':'.$port.'
Content-Length: 431
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-sony-com:service:Party:1#X_Leave"
CONNECTION: close

<?xml version="1.0" encoding="utf-8"?>
  <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <s:Body>
      <u:X_Leave xmlns:u="urn:schemas-sony-com:service:Party:1">
        <SingerSessionID>'.$SingerSessionID.'</SingerSessionID>
        <ListenerList>'.$ListenerList.'</ListenerList>
      </u:X_Leave>
    </s:Body>
  </s:Envelope>';

send($address, $port, $content);
}

//Ende Party Mode---------------------------------------------------------------

//Send--------------------------------------------------------------------------

function send($address, $port, $content)
{
		$fp = fsockopen($address, $port);

		fputs ($fp, $content);

		$return = stream_get_contents($fp, -1);

		echo $return;

		fclose($fp);
}

?>

Zum Testen erstmal SetAVTransportURI und Play_AV aufrufen.
Zu übergebende Variablen sind: $address, $port, $file, $MetaData. $MetaData kann dabei leer bleiben.

Zum Beispiel:

$address = „XXX.XXX.XXX.XXX“;
$port = „8080“;
$file = „http://192.168.178.22:8080/Test.mp3“;
$MetaData = „BlaBlaBla“;

SetAVTransportURI($address, $port, $file, $MetaData);
Play_AV($address, $port);

Die IN und OUT der functions sowie erforderliche (X) oder fakultative (O) Variablen habe ich dokumentiert.

Über Rückmeldungen, Anmerkungen und (möglichst wenig) Bug-Reports würde ich mich freuen :slight_smile:

Viele Grüsse

André

UPNP_Functions_V1.7.zip (5.37 KB)

…habe gerade noch einen Bug entdeckt (paste and copy - Fehler). Die Content Length von Play_AV war falsch, sowie kleine Fixes.

Deshalb:

UPNP_Functions_V1.8.zip (5.41 KB)

Kleiner Funktionstest: $file muss ein freigebenes File (z.B. mp3) sein. Theoretisch müsste das mit allem funktionieren, womit der Renderer zurechtkommt (in Doku nachsehen)

<?

//------------------------------------------------------------------------------
//UPNP_Test000.ips.php
//------------------------------------------------------------------------------

include ("UPNP_Functions_V1.8.ips.php");

//IPAdresse und Port des UPNP-Device (bei Party der Host)-----------------------

$address = "192.168.178.151"; //IP des Device
$port = "8080"; //Port des Device

$file = "http://192.168.178.22:8080/Test.mp3"; //Beispiel freigegebenes File
$MetaData = "BlaBlaBla"; //oder leer

SetAVTransportURI($address, $port, $file, $MetaData);
Play_AV($address, $port);

GetVolume($address, $port);
GetMute($address, $port);
GetDeviceCapabilities($address, $port);
GetMediaInfo($address, $port);
GetTransportInfo($address, $port);
GetTransportSettings($address, $port);
GetCurrentTransportActions($address, $port);
GetPositionInfo($address, $port);

//Party_X_GetState($address, $port); //nur bei Sony (event. andere)

?>

VG André

Hi,

hab das mal mit dem o.g. Teil probiert und bekomm es nicht zum Laufen.

Firmwarestand V3.2rc11.
Online Update meldet „ist bereits aktualisiert“ (war aber nicht, mehr dazu später).

Doku dazu: nichts passendes entdeckt.

Kinsky: sobald das Teil im Netz ist, schliesst sich Kinsky automatisch. Neuaufruf: Fenster sofort wieder geschlossen.

Unter Win7 lässt sich per Explorer mit Hilfe der rechten Kontexttaste „wiedergeben auf“ etwas auf der Kiste starten.

Wireshark 1.8.7 zeigt intensive Kommunikation auf den Ports:

49152 zur Kommunikation
37969 für den Datenaustausch

IPS Skript mit Port 49152:

HTTP/1.1 500 Internal Server Error
CONTENT-LENGTH: 407
CONTENT-TYPE: text/xml; charset=„utf-8“
DATE: Tue, 28 May 2013 18:25:41 GMT
EXT:
Server: Linux/2.6.31.3-svn217, UPnP/1.0, Portable SDK for UPnP devices/1.6.13
X-User-Agent: redsonic
s:Client
UPnPError
501
XML error
Fatal error: Maximum execution time of 30 seconds exceeded in D:\Programme\IP-Symcon\scripts\UPNP_Functions_V1.8.ips.php on line 1443

Interessanterweise bleibt seitdem der Philips Fernseher PFL9607 mit dem Bild stehen und nach 10 Sekunden wird das Bild dunkel, Ton läuft weiter. Abhilfe schafft nur einmal umschalten. Nach 6-7 Minuten dasselbe; Freude ist was anderes. Ob dieses an dem Xoro liegt kann ich noch nicht sagen.

Auf der Homepage des Herstellers nach geschaut: es gibt neuere Firmware, V3.3rc5.

Rauf gebügelt über SD Karte:
Update und die zu hohe Lautstärke in Stufe 1 ist immer noch zu viel des guten.

IPS:
HTTP/1.1 500 Internal Server Error
CONTENT-LENGTH: 407
CONTENT-TYPE: text/xml; charset=„utf-8“
DATE: Wed, 29 May 2013 18:59:56 GMT
EXT:
Server: Linux/2.6.31.3-svn263, UPnP/1.0, Portable SDK for UPnP devices/1.6.13
X-User-Agent: redsonic
s:Client
UPnPError
501
XML error
Fatal error: Maximum execution time of 30 seconds exceeded in D:\Programme\IP-Symcon\scripts\UPNP_Functions_V1.8.ips.php on line 1443
Abort Processing during Fatal-Error: Maximum execution time of 30 seconds exceeded
Error in Script D:\Programme\IP-Symcon\scripts\UPNP_Functions_V1.8.ips.php on Line 1443

es hat sich also nichts geändert.

Wie können wir die Wiedergabe aktivieren?

BTW: Sonos und der Philips reden auch nicht mit Hilfe des Skriptes (V1.8)

mfg

BerndJ

Hallo Bernd,

ist IP und Port richtig gesetzt ? (die o.g. sind von meinen Geräten!) Schneide doch mal mit Wireshark mit, wohin (Port/IP) der WMP den Http-Post schickt. Alternativ gibt es bei Kinsky einen Debugmodus.

VG André

PS: aus Kinsky könntest Du auch direkt eine URI kopieren (siehe anderen Post von mir) falls an der Freigabe liegt - deshalb will ich Content browsen zum Laufen bringen …

Noch eine Alternative sind die Intel Developer Tools–> Device Spy um das zu ermitteln, da offenbar das Gerät nicht gefunden wird…

Jo

Wie?

Die ist zwar per IPS Server eingerichtet, aber erfolgreich getestet und lüppt.

Doch, finden tut er es, aber dann hat er Probleme mit UPnP und XML.
Falls der Port oder die IP falsch ist sieht es anders aus mit den Fehlermeldungen.

Schau ich mir mal an, wenn wieder mal ´ne Stunde über ist.

Nachschlag: ich hab jetzt die ListenLive.nl Firmware V1.49 drauf gezogen. Läuft zwar besser, hat aber keinen UPnP Clienten. :eek:

Dafür aber ein Remote Tool, was bis jetzt aber auch nicht so richtig will.

mfg

BerndJ

PS: hat mal einer ´nen Philips TV zum Laufen gebracht?

Boa, das kenn ich:mad:

Bei der Entwicklung meines eigenen Stacks hatte ich das ständig. Die Hersteller pfuschen beim Aufbau der XML. Bestimmt ein Drittel meines selbst entwickelten Parsers (fertige Produkte arbeiten ja alle XML Konform und sind dann meisst unbrauchbar für diesen Zweck) besteht aus Herstellerspezifischen Workarounds.

Ausserdem muss man als ControlPoint-Entwickler dafür sorgen, dass das XML-Zeug auch an den Renderer geroutet wird. Sonst passiert was ich bei vielen ControlPoints hasse sobald ein zweiter ControlPoint mitspielt. Der eine zeigt den Titel den er zuletzt an den Renderer gesendet hat und der Andere auch. Aber nur einer (oder keiner) hat recht. Das war knifflig umzusetzen.

Toni

@BerndJ

Danke für Dein Feedback.

Habe mir deshalb die Functions noch mal zur Brust genommen und ein paar verkrüppelte Header entdeckt. Xoro selbst habe ich nicht zur Verfügung. Offenbar sind meine Sony SA NS weniger wählerisch :slight_smile:

Deshalb:

UPNP_Functions_V1.9.zip (5.13 KB)

Changelog:

UPNP_Functions_V1.9.ips.php:

  • statische durch variable Content-Length ausgetauscht
  • Bug Fixes in XML-Headern

Versuchs noch mal mit der und gib Feedback. Ich habe in der Kürze der Zeit nur rudimentär getestet.

Ansonsten zu Kinsky:

@Tonic1024

Bist Du weitergekommen ? Ich habe stur versucht meinen Weg weiter zu gehen :slight_smile:

Viele Grüsse

André

@BerndJ

Kann es sein, dass der Philips angesprochen wird ? Traffic über Port …

Siehe hier:

http://www.upnp-database.info/device.jsp?deviceId=258

Könnte auch für das Ansprechen über UPNP helfen …

Viele Grüsse

André

Hallo André,

jo, der Port ist der richtige.

Hab gerade mal die neue V1.9er getestet.

IPS Fehlermeldung mit V1.9:


HTTP/1.1 500 Internal Server Error
CONTENT-LENGTH: 411
CONTENT-TYPE: text/xml; charset=„utf-8“
DATE: Thu, 30 May 2013 20:43:40 GMT
EXT:
SERVER: Linux2.6/0.0 UPnP/1.0 PhilipsIntelSDK/1.4 DLNADOC/1.50

s:Client
UPnPError

-1
Invalid Action

HTTP/1.1 500 Internal Server Error
CONTENT-LENGTH: 411
CONTENT-TYPE: text/xml; charset=„utf-8“
DATE: Thu, 30 May 2013 20:43:40 GMT
EXT:
SERVER: Linux2.6/0.0 UPnP/1.0 PhilipsIntelSDK/1.4 DLNADOC/1.50

s:Client
UPnPError

-1
Invalid Action


Seltsamerweise schmeißt er den Fehler 2mal raus.
Den Xoro konnte ich noch nicht testen, hat noch die LL Firmware.
Medion MD 86672 folgt gleich im nächsten Beitrag.

mfg

BerndJ

Hi,

nu das kleine Spielzeug vom Aldi.

Kinsky und Win7 akzeptieren ihn als DMR.

Port
52525

IPS Fehlermeldung mit V1.8:


Fatal error: Maximum execution time of 30 seconds exceeded in D:\Programme\IP-Symcon\scripts\UPNP_Functions_V1.8.ips.php on line 1443
Abort Processing during Fatal-Error: Maximum execution time of 30 seconds exceeded
Error in Script D:\Programme\IP-Symcon\scripts\UPNP_Functions_V1.8.ips.php on Line 1443


bei falschem Port kommt folgendes:
Warning: fsockopen(): unable to connect to 192.168.113.144:52520 (Es konnte keine Verbindung hergestellt werden, da der Zielcomputer die Verbindung verweigerte.
) in D:\Programme\IP-Symcon\scripts\UPNP_Functions_V1.8.ips.php on line 1439

Warning: fputs() expects parameter 1 to be resource, boolean given in D:\Programme\IP-Symcon\scripts\UPNP_Functions_V1.8.ips.php on line 1441

Warning: stream_get_contents() expects parameter 1 to be resource, boolean given in D:\Programme\IP-Symcon\scripts\UPNP_Functions_V1.8.ips.php on line 1443

Warning: fclose() expects parameter 1 to be resource, boolean given in D:\Programme\IP-Symcon\scripts\UPNP_Functions_V1.8.ips.php on line 1447

Warning: fsockopen(): unable to connect to 192.168.113.144:52520 (Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle nach einer bestimmten Zeitspanne nicht richtig reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host nicht reagiert hat.
) in D:\Programme\IP-Symcon\scripts\UPNP_Functions_V1.8.ips.php on line 1439

Warning: fputs() expects parameter 1 to be resource, boolean given in D:\Programme\IP-Symcon\scripts\UPNP_Functions_V1.8.ips.php on line 1441

Warning: stream_get_contents() expects parameter 1 to be resource, boolean given in D:\Programme\IP-Symcon\scripts\UPNP_Functions_V1.8.ips.php on line 1443

Warning: fclose() expects parameter 1 to be resource, boolean given in D:\Programme\IP-Symcon\scripts\UPNP_Functions_V1.8.ips.php on line 1447


IPS Fehlermeldung mit V1.9:


Fatal error: Maximum execution time of 30 seconds exceeded in D:\Programme\IP-Symcon\scripts\UPNP_Functions_V1.9.ips.php on line 1577
Abort Processing during Fatal-Error: Maximum execution time of 30 seconds exceeded
Error in Script D:\Programme\IP-Symcon\scripts\UPNP_Functions_V1.9.ips.php on Line 1577


Die xml Dateien kann ich direkt erreichen über:

IP:52525/root_XXYY.xml
IP:52525/xml/RenderingControl.xml
IP:52525/xml/ConnectionManager.xml
IP:52525/xml/AVTransport.xml

Momentan fehlt mir noch das Verständnis, kann ich per direktem Aufruf die Funktionen ansprechen?


Nachschlag vom 1.6.2013

Nach

Hinweis und der Installation des Programmes kam die Lösung:

im Header ist ctrl durch Control zu ersetzen, danach lief es.

Hier mal das von Andre´ radikal zusammen gestrichene und für den Medion modifizierte Skript zum Probieren:

<?

$address = "192.168.xxx.xxx"; //IP des Device Aldi MD86672
$port = "52525"; //Port des Device Aldi MD86672
$file = "http://192.168.xxx.xxx:8080/So far.mp3"; //Beispiel freigegebenes File
$MetaData = ""; //oder leer

//AVTransportURI definieren-----------------------------------------------------

function SetAVTransportURI($address, $port, $file, $MetaData)
{
$header = 'POST /AVTransport/Control HTTP/1.1
HOST: '.$address.':'.$port.'
Content-Type: text/xml; charset="utf-8"
SOAPAction: "urn:schemas-upnp-org:service:AVTransport:1#SetAVTransportURI"
CONNECTION: close';

$xml = '<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
 <s:Body>
  <u:SetAVTransportURI xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">
   <InstanceID>0</InstanceID>
   <CurrentURI>'.$file.'</CurrentURI>
   <CurrentURIMetaData>'.$MetaData.'</CurrentURIMetaData>
  </u:SetAVTransportURI>
 </s:Body>
</s:Envelope>';

$content = $header . '
Content-Length: '.strlen($xml) .'

'. $xml;

send($address, $port, $content);
}

//Play--------------------------------------------------------------------------

function Play_AV($address, $port)
{
$header = 'POST /AVTransport/Control HTTP/1.1
HOST: '.$address.':'.$port.'
Content-Type: text/xml; charset="utf-8"
SOAPAction: "urn:schemas-upnp-org:service:AVTransport:1#Play"
CONNECTION: close';

$xml = '<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
 <s:Body>
  <u:Play xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">
   <InstanceID>0</InstanceID>
   <Speed>1</Speed>
  </u:Play>
 </s:Body>
</s:Envelope>';

$content = $header . '
Content-Length: '.strlen($xml) .'

'. $xml;

send($address, $port, $content);
}

//Send--------------------------------------------------------------------------

function send($address, $port, $content)
{
		$fp = fsockopen($address, $port);

		fputs ($fp, $content);

		$return = stream_get_contents($fp, -1);

		echo $return;

		fclose($fp);
}

SetAVTransportURI($address, $port, $file, $MetaData);
Play_AV($address, $port);

?>

mfg

BerndJ

Zuletzt hab ich mich mit dem Discover beschäftigt. Ich finde jetzt IP-Adressen und Ports von Servern und Renderen weitgehend automatisch. Das Suchen von Titeln in der Datenbank des Servers klappt auch. Das kennst du ja schon, André.

Neu ist das Abspielen von Playlisten. Da ich das selbst verwalte muss der Renderer diese Funktion nicht mal unterstützen. Wichtig war mir auch, dass das Webinterface, an dem ich noch arbeite, immer das zeigt was der Renderer wirklich spielt und nicht was er selbst zuletzt an den Renderer gesendet hat. Dann kann man dem Control-Point auch mit Kinsky mal in die Parade fahren ohne dass er es ihm gleich übel nimmt.

Der letzte Schritt den ich begonnen hatte war eine brauchbare Oberfläche zu bauen. Aber dann brauchte ich ne Auszeit von dem Projekt. Hab mir jetzt Pulse erst mal vorgenommen und wende mich danach dem DLNA-Problem wieder zu.

Toni

@BerndJ

Ich versuche Dir heute Abend noch ein kleines how to zu Device Spy zu geben. Diesen Output können wir dann mit den Functions vergleichen. Hab jetzt erstmal im Haus etwas zu richten :slight_smile:

Habe die Vermutung,dass der Header bei Dir etwas anders aussehen muss … (das XML/… in der Service Directory fiel mir auf)

@ ToniC

Discovery würde mich brennend interessieren. Siehe auch mal meinen anderen Thread…
Was ist Pulse ?

Viele Grüsse

André

Guckst Du hier unter Software, ganz unten

Gruß
Bruno

@Powerfreddy:

Danke :slight_smile:

@BerndJ:

DeviceSpy schon Installiert ? Völlig easy. So geht`s:

Device auswählen, AVTransport:1 auswählen und eine URI einfügen (z.B. die, die Du zum Testen verwendest).
Dann „INVOKE“ und im Kopfteil „Show Packet Capture“ wählen. Jetzt siehst Du die Kommunikation.

Interessant ist jetzt, wie bei Dir die 1.Zeile des Header (bei mir „POST /AVTransport/ctrl HTTP/1.1“) aussieht. Ist die anders ?

Dasselbe dann mit Play …

Viele Grüsse

André

Jo.

„POST /AVTransport/Control HTTP/1.1“

Hab ich

als Nachtrag eingefügt.

Der in dem Beitrag darüber angesprochene Philips ist zickiger, daß Anpassen des Headers scheint nicht zu reichen.

mfg

BerndJ

PS:
Wenn ich mich recht erinnere ist XML ja für die Kommunikation M2M konzipiert und
als erstes werden die Möglichkeiten vom Initiator ausgelesen und anschliessend verwendet.
Wir unterstellen hier den Entwicklern dass Sie sich strikt an die Vorgaben der UPnp halten
(lesen also nicht vorher die entsprechende Tabelle aus),
diese nutzen aber anscheinend die Gestaltungsmöglichkeiten von XML.
Sinnvoll wäre zumindest für den Header die notwendigen Daten zu ermitteln und zu nutzen.
Dann klappt dat auch mit den nächsten Herstellern; …bis auf Philips

PS: eigentlich stand der Mauli hinter Philips; da oben krieg ich den nicht weg; help me mod, da oben passt besser der grinsi

Hallo BerndJ,

Medion MD86672 lüppt

Super. Ist ja schon mal ein Anfang :smiley:

„POST /AVTransport/Control HTTP/1.1“

… und der Installation des Programmes kam die Lösung:

im Header ist ctrl durch Control zu ersetzen, danach lief es.

Offenbar ist Standard nicht gleich Standard :frowning: und die Control Directory in der ersten Zeile des Header herstellerspezifisch unterschiedlich. Da ich nur Sony verwende war es da natürlich gleich. Bis wir einen UPNP-Discovery haben kann ich jedem also nur raten:

Device Spy nutzen und die Control Directory in den Functions ändern wie in Post: http://www.ip-symcon.de/forum/threads/21492-UPNP-functions-Skript-aller-A-V-UPNP-Befehle-Tester-gesucht?p=197181#post197181 gezeigt

Werde die Woche mal das Function-Script anpassen, das man einen variablen Header für die Control Directory eingeben kann.

Viele Grüsse

André

Das Problem ist, dass DLNA (das hat nicht mehr viel mit UPnP zu tun) kaum exakte Vorgaben macht und dafür einen Haufen Möglichkeiten anbietet. Die Hersteller machen also völlig DLNA-Konform was sie wollen und testen ihre Geräte vermutlich nur gegen ihre eigenen Modelle. Somit ist die Herstellerunabhängige Kommunikation gefährdet und bisweilen stark eingeschränkt.

Die Grundfunktionen klappen meisst so dass wenn man keine Ansprüche hat alles blendend zu funktionieren scheint. Aber versuch mal, z.B. mit Kisky, mehrere Titel nacheinander zu spielen und während dessen mit einem zweiten ControlPoint, zum Beispiel dem Webfront, Titel und Interpret abzufragen. Da werden ganz schnell die Unterschiede zwischen den Herstellern deutlich.

Theoretisch müsste das funktionieren. Die Praxis sieht aber teilweise ganz anders aus. Man wird sich damit abfinden müssen, dass einige Geräte eben nicht funktionieren auch wenn sie das DLNA Siegel tragen. Das UPnP Label auf dem Karton sagt gar nichts aus.

Toni

Jawoll ich liebe dieses Forum…
Werde das mal mit meiner LG Palette testen und ein Statement abgeben.

Das LAN Protokoll für die LG Smart TVs packe ich dann gleich mit dran.

Kann Toni was die Kompatibilität untereinander angeht nur unterstützen. DLNA untereinander fast immer nur
mit nativen Geräten möglich.

Gruß Nick

Na dann wart mal ab was da kommt. Liegt grad etwas auf Eis, aber kommt :wink:

Hmm Ok. So wie ich dich kenne hast du das eh schon gelöst :D:D