I'm trying to send a command to my TV (Sony Bravia KDL-42W800A) to play a video through UPnP. I can discover all UPnP devices on my network using SSDP. Here is a sample response from the TV:
HTTP/1.1 200 OK
CACHE-CONTROL: max-age=1800
EXT:
LOCATION: http://192.168.1.11:52323/dmr.xml
SERVER: Linux/2.6 UPnP/1.0 KDL-42W800A/1.7
ST: urn:schemas-upnp-org:service:AVTransport:1
USN: uuid:00000000-0000-1010-8000-d8d43c73618b::urn:schemas-upnp-org:service:AVTransport:1
X-AV-Physical-Unit-Info: pa="BRAVIA KDL-42W800A";
X-AV-Server-Info: av=5.0; cn="Sony Corporation"; mn="BRAVIA KDL-42W800A"; mv="1.7";
From this I have followed the Location to retrieve the XML file containing more specifics on the TV. Given below:
<?xml version="1.0"?>
<root xmlns="urn:schemas-upnp-org:device-1-0"
xmlns:pnpx="http://schemas.microsoft.com/windows/pnpx/2005/11"
xmlns:df="http://schemas.microsoft.com/windows/2008/09/devicefoundation">
<specVersion>
<major>1</major>
<minor>0</minor>
</specVersion>
<device>
<deviceType>urn:schemas-upnp-org:device:MediaRenderer:1</deviceType>
<friendlyName>BRAVIA KDL-42W800A</friendlyName>
<manufacturer>Sony Corporation</manufacturer>
<manufacturerURL>http://www.sony.net/</manufacturerURL>
<modelName>KDL-42W800A</modelName>
<modelNumber>MINT1.7.0.1</modelNumber>
<UDN>uuid:00000000-0000-1010-8000-d8d43c73618b</UDN>
<dlna:X_DLNADOC xmlns:dlna="urn:schemas-dlna-org:device-1-0">DMR-1.50</dlna:X_DLNADOC>
<microsoft:magicPacketWakeSupported xmlns:microsoft="urn:schemas-microsoft-com:WMPNSS-1-0">1</microsoft:magicPacketWakeSupported>
<iconList>
<icon>
<mimetype>image/png</mimetype>
<width>32</width>
<height>32</height>
<depth>24</depth>
<url>/MediaRenderer_32x32.png</url>
</icon>
<icon>
<mimetype>image/png</mimetype>
<width>48</width>
<height>48</height>
<depth>24</depth>
<url>/MediaRenderer_48x48.png</url>
</icon>
<icon>
<mimetype>image/png</mimetype>
<width>60</width>
<height>60</height>
<depth>24</depth>
<url>/MediaRenderer_60x60.png</url>
</icon>
<icon>
<mimetype>image/png</mimetype>
<width>120</width>
<height>120</height>
<depth>24</depth>
<url>/MediaRenderer_120x120.png</url>
</icon>
<icon>
<mimetype>image/jpeg</mimetype>
<width>32</width>
<height>32</height>
<depth>24</depth>
<url>/MediaRenderer_32x32.jpg</url>
</icon>
<icon>
<mimetype>image/jpeg</mimetype>
<width>48</width>
<height>48</height>
<depth>24</depth>
<url>/MediaRenderer_48x48.jpg</url>
</icon>
<icon>
<mimetype>image/jpeg</mimetype>
<width>60</width>
<height>60</height>
<depth>24</depth>
<url>/MediaRenderer_60x60.jpg</url>
</icon>
<icon>
<mimetype>image/jpeg</mimetype>
<width>120</width>
<height>120</height>
<depth>24</depth>
<url>/MediaRenderer_120x120.jpg</url>
</icon>
</iconList>
<serviceList>
<service>
<serviceType>urn:schemas-upnp-org:service:RenderingControl:1</serviceType>
<serviceId>urn:upnp-org:serviceId:RenderingControl</serviceId>
<SCPDURL>/RenderingControlSCPD.xml</SCPDURL>
<controlURL>/upnp/control/RenderingControl</controlURL>
<eventSubURL>/upnp/event/RenderingControl</eventSubURL>
</service>
<service>
<serviceType>urn:schemas-upnp-org:service:ConnectionManager:1</serviceType>
<serviceId>urn:upnp-org:serviceId:ConnectionManager</serviceId>
<SCPDURL>/ConnectionManagerSCPD.xml</SCPDURL>
<controlURL>/upnp/control/ConnectionManager</controlURL>
<eventSubURL>/upnp/event/ConnectionManager</eventSubURL>
</service>
<service>
<serviceType>urn:schemas-upnp-org:service:AVTransport:1</serviceType>
<serviceId>urn:upnp-org:serviceId:AVTransport</serviceId>
<SCPDURL>/AVTransportSCPD.xml</SCPDURL>
<controlURL>/upnp/control/AVTransport</controlURL>
<eventSubURL>/upnp/event/AVTransport</eventSubURL>
</service>
<service>
<serviceType>urn:dial-multiscreen-org:service:dial:1</serviceType>
<serviceId>urn:dial-multiscreen-org:serviceId:dial</serviceId>
<SCPDURL>/DIALSCPD.xml</SCPDURL>
<controlURL>/upnp/control/DIAL</controlURL>
<eventSubURL></eventSubURL>
</service>
<service>
<serviceType>urn:schemas-sony-com:service:IRCC:1</serviceType>
<serviceId>urn:schemas-sony-com:serviceId:IRCC</serviceId>
<SCPDURL>/IRCCSCPD.xml</SCPDURL>
<controlURL>http://192.168.1.11/sony/IRCC</controlURL>
<eventSubURL></eventSubURL>
</service>
<service>
<serviceType>urn:schemas-sony-com:service:ScalarWebAPI:1</serviceType>
<serviceId>urn:schemas-sony-com:serviceId:ScalarWebAPI</serviceId>
<SCPDURL>/ScalarWebApiSCPD.xml</SCPDURL>
<controlURL>/upnp/control/ScalarAPI</controlURL>
<eventSubURL></eventSubURL>
</service>
</serviceList>
<av:X_MaxBGMCount xmlns:av="urn:schemas-sony-com:av">64</av:X_MaxBGMCount>
<av:X_StandardDMR xmlns:av="urn:schemas-sony-com:av">1.1</av:X_StandardDMR>
<av:X_ScreenResolution xmlns:av="urn:schemas-sony-com:av">2K</av:X_ScreenResolution>
<av:X_IRCCCodeList xmlns:av="urn:schemas-sony-com:av">
<av:X_IRCCCode command="Power">AAAAAQAAAAEAAAAVAw==</av:X_IRCCCode>
<av:X_IRCCCode command="Power ON">AAAAAQAAAAEAAAAuAw==</av:X_IRCCCode>
<av:X_IRCCCode command="Power OFF">AAAAAQAAAAEAAAAvAw==</av:X_IRCCCode>
</av:X_IRCCCodeList>
<pnpx:X_compatibleId>MS_DigitalMediaDeviceClass_DMR_V001</pnpx:X_compatibleId>
<pnpx:X_deviceCategory>MediaDevices</pnpx:X_deviceCategory>
<pnpx:X_hardwareId>VEN_0106&DEV_0006&REV_01</pnpx:X_hardwareId>
<df:X_deviceCategory>Display.TV Multimedia.DMR</df:X_deviceCategory>
<av:X_TrackID_DeviceInfo xmlns:av="urn:schemas-sony-com:av">
<av:X_TrackID_BaseURL>http://192.168.1.11/sony/BgmSearch</av:X_TrackID_BaseURL>
</av:X_TrackID_DeviceInfo>
<av:X_DIALEX_DeviceInfo xmlns:av="urn:schemas-sony-com:av">
<av:X_DIALEX_AppsListURL>http://192.168.1.11/DIAL/sony/applist</av:X_DIALEX_AppsListURL>
</av:X_DIALEX_DeviceInfo>
<av:X_ScalarWebAPI_DeviceInfo xmlns:av="urn:schemas-sony-com:av">
<av:X_ScalarWebAPI_Version>1.0</av:X_ScalarWebAPI_Version>
<av:X_ScalarWebAPI_BaseURL>http://192.168.1.11/sony</av:X_ScalarWebAPI_BaseURL>
<av:X_ScalarWebAPI_ServiceList>
<av:X_ScalarWebAPI_ServiceType>guide</av:X_ScalarWebAPI_ServiceType>
<av:X_ScalarWebAPI_ServiceType>system</av:X_ScalarWebAPI_ServiceType>
<av:X_ScalarWebAPI_ServiceType>videoScreen</av:X_ScalarWebAPI_ServiceType>
<av:X_ScalarWebAPI_ServiceType>audio</av:X_ScalarWebAPI_ServiceType>
<av:X_ScalarWebAPI_ServiceType>avContent</av:X_ScalarWebAPI_ServiceType>
<av:X_ScalarWebAPI_ServiceType>recording</av:X_ScalarWebAPI_ServiceType>
<av:X_ScalarWebAPI_ServiceType>appControl</av:X_ScalarWebAPI_ServiceType>
<av:X_ScalarWebAPI_ServiceType>browser</av:X_ScalarWebAPI_ServiceType>
<av:X_ScalarWebAPI_ServiceType>notification</av:X_ScalarWebAPI_ServiceType>
<av:X_ScalarWebAPI_ServiceType>cec</av:X_ScalarWebAPI_ServiceType>
<av:X_ScalarWebAPI_ServiceType>accessControl</av:X_ScalarWebAPI_ServiceType>
<av:X_ScalarWebAPI_ServiceType>irCommandProxy</av:X_ScalarWebAPI_ServiceType>
</av:X_ScalarWebAPI_ServiceList>
</av:X_ScalarWebAPI_DeviceInfo>
<av:X_RDIS_DeviceInfo xmlns:av="urn:schemas-sony-com:av">
<av:X_RDIS_Version>1.0</av:X_RDIS_Version>
<av:X_RDIS_SESSION_CONTROL>false</av:X_RDIS_SESSION_CONTROL>
<av:X_RDIS_ENTRY_PORT>20677</av:X_RDIS_ENTRY_PORT>
</av:X_RDIS_DeviceInfo>
</device>
</root>
Using this information, how can I request the TV to play a video if I have the link? I have tried to based on what I've read online and got this code so far, which is supposed to set the AVTransportURI, but it keeps on giving error 500 Internal Server Error.
private const string SetAvTransportURIXml = "<?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:SetAVTransportURI xmlns:u=\"urn:schemas-upnp-org:service:AVTransport:1\">" +
"<InstanceID>0</InstanceID>" +
"<CurrentURI>{0}</CurrentURI>" +
"<CurrentURIMetaData></CurrentURIMetaData>" +
"</u:SetAVTransportURI>" +
"</s:Body>" +
"</s:Envelope>";
public void PlayVideo(string videoLink)
{
byte[] bytes;
bytes = Encoding.UTF8.GetBytes(String.Format(SetAvTransportURIXml, videoLink));
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://192.168.1.11:52323/upnp/control/AVTransport");
request.Headers.Add("SOAPAction", "\"urn:schemas-upnp-org:service:AVTransport:1#SetAVTransportURI\"");
request.ContentType = "text/xml; encoding=\"utf-8\"";
request.ContentLength = bytes.Length;
request.Method = "POST";
Stream requestStream = request.GetRequestStream();
requestStream.Write(bytes, 0, bytes.Length);
requestStream.Flush();
requestStream.Close();
var response = (HttpWebResponse) request.GetResponse();
if (response.StatusCode == HttpStatusCode.OK)
{
Stream responseStream = response.GetResponseStream();
if (responseStream == null) return;
string responseStr = new StreamReader(responseStream).ReadToEnd();
Console.WriteLine(responseStr);
}
}
Any help would be appreciated, thanks.