DLNA(一)

導讀:
本文集主要講的是,dlna的投屏底層的原理,以及一步步的教你實現(xiàn),對網(wǎng)絡圖片/視頻或者本地的圖片/視頻的投屏到電視盒子上面(demo里面用的是電信的悅me盒子

PS由于第一次接觸投屏,我只講我自己的理解,以及自己項目里面的所使用的功能模塊,如有理解不到位的,可以一起交流學習下。??????

主要參考:

說明:
對于投屏功能,本文主要是利用的iOS DLNA投屏功能了解一下,里的框架,感謝作者的源碼。

我是根據(jù)作者的代碼,新增了一些實際需要的方法,以及實現(xiàn)了可講本地圖片、視頻投影到盒子上面。

具體的代碼見gitHubDemo里面的具體的包括實現(xiàn)都有具體的實現(xiàn)


我們從upnp中文文檔,可大致可得出下面的流程
1.尋址
2.發(fā)現(xiàn)
3.描述
4.控制、事件、展示

下面我結合悅me盒子來做具體的描述
1.尋址:設備通過尋址來獲得一個網(wǎng)絡地址 (具體的說明見upnp中文文檔)
這是設備和路由完成的
2.發(fā)現(xiàn)
當設備已經有自己的ip地址(步驟1),那么怎么樣才能獲取到設備呢?
我們可以通過udp請求,來喊話

發(fā)現(xiàn)設備:搜索請求消息字符串

 NSData * sendData = [[self getSearchString] dataUsingEncoding:NSUTF8StringEncoding]; 
 [_udpSocket sendData:sendData toHost:ssdpAddres port:ssdpPort withTimeout:-1 tag:1];
 
 其中:getSearchString為: 
 [NSString stringWithFormat:
 @"M-SEARCH * HTTP/1.1\r\nHOST: %@:%d\r\nMAN: \"ssdp:discover\"\r\nMX: 3\r\nST: %@\r\nUSER-AGENT: iOS UPnP/1.1 mccree/1.0\r\n\r\n",
ssdpAddres, 
ssdpPort, 
serviceType_AVTransport];
-----
ssdpAddres --> @"239.255.255.250";
ssdpPort --> 1900;
serviceType_AVTransport -->@"urn:schemas-upnp-org:service:AVTransport:1";

通過upd來發(fā)送消息,此時在同一個局域網(wǎng)的設備,會收到該消息,然后返回自己的設備信息,下面是悅me盒子返回的示例

HTTP/1.1 200 OK
Location: http://192.168.124.43:1266/
Cache-Control: max-age=1800
Server: UPnP/1.0 DLNADOC/1.50 Platinum/1.0.4.2
EXT: 
USN: uuid:skyworth&208B3756FFED&192.168.124.43::urn:schemas-upnp-org:service:AVTransport:1
ST: urn:schemas-upnp-org:service:AVTransport:1
Date: Thu, 24 Jan 2019 02:38:18 GMT

3.描述 我們發(fā)現(xiàn)了設備,看第2步只會返回一些基本的信息,我們還需要去獲取設備的詳細的信息
我們通過向步驟2拿到的location發(fā)送get請求
get:http://192.168.124.43:1266/
返回信息如下:

<html>
<head></head>
<body>
 {type:1 name:root xml:&quot;
  <root xmlns="urn:schemas-upnp-org:device-1-0" xmlns:dlna="urn:schemas-dlna-org:device-1-0">
   <specversion>
    <major>
     1
   </major>
   <minor>
     0
   </minor>
 </specversion>
 <device>
  <devicetype>
   urn:schemas-upnp-org:device:MediaRenderer:1
 </devicetype>
 <friendlyname>
   YuemeTV
 </friendlyname>
 <manufacturer>
   GeniusGitHub
 </manufacturer>
 <manufacturerurl>
   https://github.com/geniusgithub
 </manufacturerurl>
 <modeldescription>
   GeniusGitHub AV Media Renderer Device
 </modeldescription>
 <modelname>
   Genius Software
 </modelname>
 <modelurl>
   https://github.com/geniusgithub
 </modelurl>
 <modelnumber>
   20130520
 </modelnumber>
 <serialnumber />
 <udn>
   uuid:skyworth&amp;208B3756FFED&amp;192.168.124.43
 </udn>
 <dlna:x_dlnadoc xmlns:dlna="urn:schemas-dlna-org:device-1-0">
 DMR-1.50
</dlna:x_dlnadoc>
<servicelist>
 <service>
  <servicetype>
   urn:schemas-upnp-org:service:AVTransport:1
 </servicetype>
 <serviceid>
   urn:upnp-org:serviceId:AVTransport
 </serviceid>
 <scpdurl>
   /AVTransport/skyworth&amp;208B3756FFED&amp;192.168.124.43/scpd.xml
 </scpdurl>
 <controlurl>
   /AVTransport/skyworth&amp;208B3756FFED&amp;192.168.124.43/control.xml
 </controlurl>
 <eventsuburl>
   /AVTransport/skyworth&amp;208B3756FFED&amp;192.168.124.43/event.xml
 </eventsuburl>
</service>
<service>
  <servicetype>
   urn:schemas-upnp-org:service:ConnectionManager:1
 </servicetype>
 <serviceid>
   urn:upnp-org:serviceId:ConnectionManager
 </serviceid>
 <scpdurl>
   /ConnectionManager/skyworth&amp;208B3756FFED&amp;192.168.124.43/scpd.xml
 </scpdurl>
 <controlurl>
   /ConnectionManager/skyworth&amp;208B3756FFED&amp;192.168.124.43/control.xml
 </controlurl>
 <eventsuburl>
   /ConnectionManager/skyworth&amp;208B3756FFED&amp;192.168.124.43/event.xml
 </eventsuburl>
</service>
<service>
  <servicetype>
   urn:schemas-upnp-org:service:RenderingControl:1
 </servicetype>
 <serviceid>
   urn:upnp-org:serviceId:RenderingControl
 </serviceid>
 <scpdurl>
   /RenderingControl/skyworth&amp;208B3756FFED&amp;192.168.124.43/scpd.xml
 </scpdurl>
 <controlurl>
   /RenderingControl/skyworth&amp;208B3756FFED&amp;192.168.124.43/control.xml
 </controlurl>
 <eventsuburl>
   /RenderingControl/skyworth&amp;208B3756FFED&amp;192.168.124.43/event.xml
 </eventsuburl>
</service>
</servicelist></device>
</root>&quot;}
</body>
</html>

這個格式很清晰地描述了設備的詳細信息,比如設備的名字:YuemeTV,設備類型是媒體渲染播放器、制造商相關信息、UUID、以及它提供的服務列表,每個服務都有serviceType, serviceId, SCPDURL, controlURL和eventSubURL等
比如:serviceType為urn:schemas-upnp-org:service:AVTransport:1,表示這個服務提供的是音視頻傳輸服務,版本號是1

4.接下來:我們怎么使用這些服務呢?
SCPDURL這個字段的內容就是提供的使用路徑
將:前面拿到的設備 ip和端口 以及SCPDURL字段的內容,拼接成url即可
以 /AVTransport/skyworth&208B3756FFED&192.168.124.43/scpd.xml為例
發(fā)送請求:

<html>
 <head></head>
 <body>
  This XML file does not appear to have any style information associated with it. The document tree is shown below. 
  <scpd xmlns="urn:schemas-upnp-org:service-1-0"> 
   <specversion> 
    <major>
     1
    </major> 
    <minor>
     0
    </minor> 
   </specversion> 
   <actionlist> 
    <action> 
     <name>
      GetCurrentTransportActions
     </name> 
     <argumentlist> 
      <argument> 
       <name>
        InstanceID
       </name> 
       <direction>
        in
       </direction> 
       <relatedstatevariable>
        A_ARG_TYPE_InstanceID
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        Actions
       </name> 
       <direction>
        out
       </direction> 
       <relatedstatevariable>
        CurrentTransportActions
       </relatedstatevariable> 
      </argument> 
     </argumentlist> 
    </action> 
    <action> 
     <name>
      GetDeviceCapabilities
     </name> 
     <argumentlist> 
      <argument> 
       <name>
        InstanceID
       </name> 
       <direction>
        in
       </direction> 
       <relatedstatevariable>
        A_ARG_TYPE_InstanceID
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        PlayMedia
       </name> 
       <direction>
        out
       </direction> 
       <relatedstatevariable>
        PossiblePlaybackStorageMedia
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        RecMedia
       </name> 
       <direction>
        out
       </direction> 
       <relatedstatevariable>
        PossibleRecordStorageMedia
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        RecQualityModes
       </name> 
       <direction>
        out
       </direction> 
       <relatedstatevariable>
        PossibleRecordQualityModes
       </relatedstatevariable> 
      </argument> 
     </argumentlist> 
    </action> 
    <action> 
     <name>
      GetMediaInfo
     </name> 
     <argumentlist> 
      <argument> 
       <name>
        InstanceID
       </name> 
       <direction>
        in
       </direction> 
       <relatedstatevariable>
        A_ARG_TYPE_InstanceID
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        NrTracks
       </name> 
       <direction>
        out
       </direction> 
       <relatedstatevariable>
        NumberOfTracks
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        MediaDuration
       </name> 
       <direction>
        out
       </direction> 
       <relatedstatevariable>
        CurrentMediaDuration
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        CurrentURI
       </name> 
       <direction>
        out
       </direction> 
       <relatedstatevariable>
        AVTransportURI
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        CurrentURIMetaData
       </name> 
       <direction>
        out
       </direction> 
       <relatedstatevariable>
        AVTransportURIMetaData
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        NextURI
       </name> 
       <direction>
        out
       </direction> 
       <relatedstatevariable>
        NextAVTransportURI
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        NextURIMetaData
       </name> 
       <direction>
        out
       </direction> 
       <relatedstatevariable>
        NextAVTransportURIMetaData
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        PlayMedium
       </name> 
       <direction>
        out
       </direction> 
       <relatedstatevariable>
        PlaybackStorageMedium
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        RecordMedium
       </name> 
       <direction>
        out
       </direction> 
       <relatedstatevariable>
        RecordStorageMedium
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        WriteStatus
       </name> 
       <direction>
        out
       </direction> 
       <relatedstatevariable>
        RecordMediumWriteStatus
       </relatedstatevariable> 
      </argument> 
     </argumentlist> 
    </action> 
    <action> 
     <name>
      GetPositionInfo
     </name> 
     <argumentlist> 
      <argument> 
       <name>
        InstanceID
       </name> 
       <direction>
        in
       </direction> 
       <relatedstatevariable>
        A_ARG_TYPE_InstanceID
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        Track
       </name> 
       <direction>
        out
       </direction> 
       <relatedstatevariable>
        CurrentTrack
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        TrackDuration
       </name> 
       <direction>
        out
       </direction> 
       <relatedstatevariable>
        CurrentTrackDuration
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        TrackMetaData
       </name> 
       <direction>
        out
       </direction> 
       <relatedstatevariable>
        CurrentTrackMetaData
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        TrackURI
       </name> 
       <direction>
        out
       </direction> 
       <relatedstatevariable>
        CurrentTrackURI
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        RelTime
       </name> 
       <direction>
        out
       </direction> 
       <relatedstatevariable>
        RelativeTimePosition
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        AbsTime
       </name> 
       <direction>
        out
       </direction> 
       <relatedstatevariable>
        AbsoluteTimePosition
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        RelCount
       </name> 
       <direction>
        out
       </direction> 
       <relatedstatevariable>
        RelativeCounterPosition
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        AbsCount
       </name> 
       <direction>
        out
       </direction> 
       <relatedstatevariable>
        AbsoluteCounterPosition
       </relatedstatevariable> 
      </argument> 
     </argumentlist> 
    </action> 
    <action> 
     <name>
      GetTransportInfo
     </name> 
     <argumentlist> 
      <argument> 
       <name>
        InstanceID
       </name> 
       <direction>
        in
       </direction> 
       <relatedstatevariable>
        A_ARG_TYPE_InstanceID
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        CurrentTransportState
       </name> 
       <direction>
        out
       </direction> 
       <relatedstatevariable>
        TransportState
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        CurrentTransportStatus
       </name> 
       <direction>
        out
       </direction> 
       <relatedstatevariable>
        TransportStatus
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        CurrentSpeed
       </name> 
       <direction>
        out
       </direction> 
       <relatedstatevariable>
        TransportPlaySpeed
       </relatedstatevariable> 
      </argument> 
     </argumentlist> 
    </action> 
    <action> 
     <name>
      GetTransportSettings
     </name> 
     <argumentlist> 
      <argument> 
       <name>
        InstanceID
       </name> 
       <direction>
        in
       </direction> 
       <relatedstatevariable>
        A_ARG_TYPE_InstanceID
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        PlayMode
       </name> 
       <direction>
        out
       </direction> 
       <relatedstatevariable>
        CurrentPlayMode
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        RecQualityMode
       </name> 
       <direction>
        out
       </direction> 
       <relatedstatevariable>
        CurrentRecordQualityMode
       </relatedstatevariable> 
      </argument> 
     </argumentlist> 
    </action> 
    <action> 
     <name>
      Next
     </name> 
     <argumentlist> 
      <argument> 
       <name>
        InstanceID
       </name> 
       <direction>
        in
       </direction> 
       <relatedstatevariable>
        A_ARG_TYPE_InstanceID
       </relatedstatevariable> 
      </argument> 
     </argumentlist> 
    </action> 
    <action> 
     <name>
      Pause
     </name> 
     <argumentlist> 
      <argument> 
       <name>
        InstanceID
       </name> 
       <direction>
        in
       </direction> 
       <relatedstatevariable>
        A_ARG_TYPE_InstanceID
       </relatedstatevariable> 
      </argument> 
     </argumentlist> 
    </action> 
    <action> 
     <name>
      Play
     </name> 
     <argumentlist> 
      <argument> 
       <name>
        InstanceID
       </name> 
       <direction>
        in
       </direction> 
       <relatedstatevariable>
        A_ARG_TYPE_InstanceID
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        Speed
       </name> 
       <direction>
        in
       </direction> 
       <relatedstatevariable>
        TransportPlaySpeed
       </relatedstatevariable> 
      </argument> 
     </argumentlist> 
    </action> 
    <action> 
     <name>
      Previous
     </name> 
     <argumentlist> 
      <argument> 
       <name>
        InstanceID
       </name> 
       <direction>
        in
       </direction> 
       <relatedstatevariable>
        A_ARG_TYPE_InstanceID
       </relatedstatevariable> 
      </argument> 
     </argumentlist> 
    </action> 
    <action> 
     <name>
      Seek
     </name> 
     <argumentlist> 
      <argument> 
       <name>
        InstanceID
       </name> 
       <direction>
        in
       </direction> 
       <relatedstatevariable>
        A_ARG_TYPE_InstanceID
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        Unit
       </name> 
       <direction>
        in
       </direction> 
       <relatedstatevariable>
        A_ARG_TYPE_SeekMode
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        Target
       </name> 
       <direction>
        in
       </direction> 
       <relatedstatevariable>
        A_ARG_TYPE_SeekTarget
       </relatedstatevariable> 
      </argument> 
     </argumentlist> 
    </action> 
    <action> 
     <name>
      SetAVTransportURI
     </name> 
     <argumentlist> 
      <argument> 
       <name>
        InstanceID
       </name> 
       <direction>
        in
       </direction> 
       <relatedstatevariable>
        A_ARG_TYPE_InstanceID
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        CurrentURI
       </name> 
       <direction>
        in
       </direction> 
       <relatedstatevariable>
        AVTransportURI
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        CurrentURIMetaData
       </name> 
       <direction>
        in
       </direction> 
       <relatedstatevariable>
        AVTransportURIMetaData
       </relatedstatevariable> 
      </argument> 
     </argumentlist> 
    </action> 
    <action> 
     <name>
      SetPlayMode
     </name> 
     <argumentlist> 
      <argument> 
       <name>
        InstanceID
       </name> 
       <direction>
        in
       </direction> 
       <relatedstatevariable>
        A_ARG_TYPE_InstanceID
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        NewPlayMode
       </name> 
       <direction>
        in
       </direction> 
       <relatedstatevariable>
        CurrentPlayMode
       </relatedstatevariable> 
      </argument> 
     </argumentlist> 
    </action> 
    <action> 
     <name>
      Stop
     </name> 
     <argumentlist> 
      <argument> 
       <name>
        InstanceID
       </name> 
       <direction>
        in
       </direction> 
       <relatedstatevariable>
        A_ARG_TYPE_InstanceID
       </relatedstatevariable> 
      </argument> 
     </argumentlist> 
    </action> 
   </actionlist> 
   <servicestatetable> 
    <statevariable sendevents="no"> 
     <name>
      CurrentPlayMode
     </name> 
     <datatype>
      string
     </datatype> 
     <defaultvalue>
      NORMAL
     </defaultvalue> 
     <allowedvaluelist> 
      <allowedvalue>
       NORMAL
      </allowedvalue> 
      <allowedvalue>
       REPEAT_ONE
      </allowedvalue> 
      <allowedvalue>
       REPEAT_ALL
      </allowedvalue> 
      <allowedvalue>
       SHUFFLE
      </allowedvalue> 
      <allowedvalue>
       SHUFFLE_NOREPEAT
      </allowedvalue> 
     </allowedvaluelist> 
    </statevariable> 
    <statevariable sendevents="no"> 
     <name>
      RecordStorageMedium
     </name> 
     <datatype>
      string
     </datatype> 
     <allowedvaluelist> 
      <allowedvalue>
       NOT_IMPLEMENTED
      </allowedvalue> 
     </allowedvaluelist> 
    </statevariable> 
    <statevariable sendevents="yes"> 
     <name>
      LastChange
     </name> 
     <datatype>
      string
     </datatype> 
    </statevariable> 
    <statevariable sendevents="no"> 
     <name>
      RelativeTimePosition
     </name> 
     <datatype>
      string
     </datatype> 
    </statevariable> 
    <statevariable sendevents="no"> 
     <name>
      CurrentTrackURI
     </name> 
     <datatype>
      string
     </datatype> 
    </statevariable> 
    <statevariable sendevents="no"> 
     <name>
      CurrentTrackDuration
     </name> 
     <datatype>
      string
     </datatype> 
    </statevariable> 
    <statevariable sendevents="no"> 
     <name>
      CurrentRecordQualityMode
     </name> 
     <datatype>
      string
     </datatype> 
     <allowedvaluelist> 
      <allowedvalue>
       NOT_IMPLEMENTED
      </allowedvalue> 
     </allowedvaluelist> 
    </statevariable> 
    <statevariable sendevents="no"> 
     <name>
      CurrentMediaDuration
     </name> 
     <datatype>
      string
     </datatype> 
    </statevariable> 
    <statevariable sendevents="no"> 
     <name>
      AbsoluteCounterPosition
     </name> 
     <datatype>
      i4
     </datatype> 
    </statevariable> 
    <statevariable sendevents="no"> 
     <name>
      RelativeCounterPosition
     </name> 
     <datatype>
      i4
     </datatype> 
    </statevariable> 
    <statevariable sendevents="no"> 
     <name>
      A_ARG_TYPE_InstanceID
     </name> 
     <datatype>
      ui4
     </datatype> 
    </statevariable> 
    <statevariable sendevents="no"> 
     <name>
      AVTransportURI
     </name> 
     <datatype>
      string
     </datatype> 
    </statevariable> 
    <statevariable sendevents="no"> 
     <name>
      TransportState
     </name> 
     <datatype>
      string
     </datatype> 
     <allowedvaluelist> 
      <allowedvalue>
       STOPPED
      </allowedvalue> 
      <allowedvalue>
       PAUSED_PLAYBACK
      </allowedvalue> 
      <allowedvalue>
       PLAYING
      </allowedvalue> 
      <allowedvalue>
       TRANSITIONING
      </allowedvalue> 
      <allowedvalue>
       NO_MEDIA_PRESENT
      </allowedvalue> 
     </allowedvaluelist> 
    </statevariable> 
    <statevariable sendevents="no"> 
     <name>
      CurrentTrackMetaData
     </name> 
     <datatype>
      string
     </datatype> 
    </statevariable> 
    <statevariable sendevents="no"> 
     <name>
      NextAVTransportURI
     </name> 
     <datatype>
      string
     </datatype> 
    </statevariable> 
    <statevariable sendevents="no"> 
     <name>
      PossibleRecordQualityModes
     </name> 
     <datatype>
      string
     </datatype> 
     <allowedvaluelist> 
      <allowedvalue>
       NOT_IMPLEMENTED
      </allowedvalue> 
     </allowedvaluelist> 
    </statevariable> 
    <statevariable sendevents="no"> 
     <name>
      CurrentTrack
     </name> 
     <datatype>
      ui4
     </datatype> 
     <allowedvaluerange> 
      <minimum>
       0
      </minimum> 
      <maximum>
       65535
      </maximum> 
      <step>
       1
      </step> 
     </allowedvaluerange> 
    </statevariable> 
    <statevariable sendevents="no"> 
     <name>
      AbsoluteTimePosition
     </name> 
     <datatype>
      string
     </datatype> 
    </statevariable> 
    <statevariable sendevents="no"> 
     <name>
      NextAVTransportURIMetaData
     </name> 
     <datatype>
      string
     </datatype> 
    </statevariable> 
    <statevariable sendevents="no"> 
     <name>
      PlaybackStorageMedium
     </name> 
     <datatype>
      string
     </datatype> 
     <allowedvaluelist> 
      <allowedvalue>
       NONE
      </allowedvalue> 
      <allowedvalue>
       UNKNOWN
      </allowedvalue> 
      <allowedvalue>
       CD-DA
      </allowedvalue> 
      <allowedvalue>
       HDD
      </allowedvalue> 
      <allowedvalue>
       NETWORK
      </allowedvalue> 
     </allowedvaluelist> 
    </statevariable> 
    <statevariable sendevents="no"> 
     <name>
      CurrentTransportActions
     </name> 
     <datatype>
      string
     </datatype> 
    </statevariable> 
    <statevariable sendevents="no"> 
     <name>
      RecordMediumWriteStatus
     </name> 
     <datatype>
      string
     </datatype> 
     <allowedvaluelist> 
      <allowedvalue>
       NOT_IMPLEMENTED
      </allowedvalue> 
     </allowedvaluelist> 
    </statevariable> 
    <statevariable sendevents="no"> 
     <name>
      PossiblePlaybackStorageMedia
     </name> 
     <datatype>
      string
     </datatype> 
     <allowedvaluelist> 
      <allowedvalue>
       NONE
      </allowedvalue> 
      <allowedvalue>
       UNKNOWN
      </allowedvalue> 
      <allowedvalue>
       CD-DA
      </allowedvalue> 
      <allowedvalue>
       HDD
      </allowedvalue> 
      <allowedvalue>
       NETWORK
      </allowedvalue> 
     </allowedvaluelist> 
    </statevariable> 
    <statevariable sendevents="no"> 
     <name>
      AVTransportURIMetaData
     </name> 
     <datatype>
      string
     </datatype> 
    </statevariable> 
    <statevariable sendevents="no"> 
     <name>
      NumberOfTracks
     </name> 
     <datatype>
      ui4
     </datatype> 
     <allowedvaluerange> 
      <minimum>
       0
      </minimum> 
      <maximum>
       65535
      </maximum> 
     </allowedvaluerange> 
    </statevariable> 
    <statevariable sendevents="no"> 
     <name>
      A_ARG_TYPE_SeekMode
     </name> 
     <datatype>
      string
     </datatype> 
     <allowedvaluelist> 
      <allowedvalue>
       REL_TIME
      </allowedvalue> 
      <allowedvalue>
       TRACK_NR
      </allowedvalue> 
     </allowedvaluelist> 
    </statevariable> 
    <statevariable sendevents="no"> 
     <name>
      A_ARG_TYPE_SeekTarget
     </name> 
     <datatype>
      string
     </datatype> 
    </statevariable> 
    <statevariable sendevents="no"> 
     <name>
      PossibleRecordStorageMedia
     </name> 
     <datatype>
      string
     </datatype> 
     <allowedvaluelist> 
      <allowedvalue>
       NOT_IMPLEMENTED
      </allowedvalue> 
     </allowedvaluelist> 
    </statevariable> 
    <statevariable sendevents="no"> 
     <name>
      TransportStatus
     </name> 
     <datatype>
      string
     </datatype> 
     <allowedvaluelist> 
      <allowedvalue>
       OK
      </allowedvalue> 
      <allowedvalue>
       ERROR_OCCURRED
      </allowedvalue> 
     </allowedvaluelist> 
    </statevariable> 
    <statevariable sendevents="no"> 
     <name>
      TransportPlaySpeed
     </name> 
     <datatype>
      string
     </datatype> 
     <allowedvaluelist> 
      <allowedvalue>
       1
      </allowedvalue> 
     </allowedvaluelist> 
    </statevariable> 
   </servicestatetable> 
  </scpd>
 </body>
</html>

該服務提供了一個actionList即動作列表,一個服務會包含一個或多個功能請求動作,如actionList下這個SetAVTransportURI,顧名思義,這個請求的功能是將一個音視頻資源的URI發(fā)送給渲染端。一個動作(Action)就好比一個API請求,你還需要傳遞一些要求的參數(shù),這時就會用到該Action后面argumentList里規(guī)定的一些Argument。比如根據(jù)第一個參數(shù)<name>CurrentURI</name>,表示的就是你想發(fā)送的URI;同時<direction>in</direction>表示的是這是一個傳入?yún)?shù),如果為out則表示該Action會返回給你這個參數(shù)的值. action如:play播放指令,pause暫停指令,獲取播放的媒體的信息GetTransportInfo指令等等

5.控制服務controlurl具體的信息
同理4

<html>
 <head></head>
 <body>
  This XML file does not appear to have any style information associated with it. The document tree is shown below. 
  <scpd xmlns="urn:schemas-upnp-org:service-1-0"> 
   <specversion> 
    <major>
     1
    </major> 
    <minor>
     0
    </minor> 
   </specversion> 
   <actionlist> 
    <action> 
     <name>
      GetMute
     </name> 
     <argumentlist> 
      <argument> 
       <name>
        InstanceID
       </name> 
       <direction>
        in
       </direction> 
       <relatedstatevariable>
        A_ARG_TYPE_InstanceID
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        Channel
       </name> 
       <direction>
        in
       </direction> 
       <relatedstatevariable>
        A_ARG_TYPE_Channel
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        CurrentMute
       </name> 
       <direction>
        out
       </direction> 
       <relatedstatevariable>
        Mute
       </relatedstatevariable> 
      </argument> 
     </argumentlist> 
    </action> 
    <action> 
     <name>
      GetVolume
     </name> 
     <argumentlist> 
      <argument> 
       <name>
        InstanceID
       </name> 
       <direction>
        in
       </direction> 
       <relatedstatevariable>
        A_ARG_TYPE_InstanceID
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        Channel
       </name> 
       <direction>
        in
       </direction> 
       <relatedstatevariable>
        A_ARG_TYPE_Channel
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        CurrentVolume
       </name> 
       <direction>
        out
       </direction> 
       <relatedstatevariable>
        Volume
       </relatedstatevariable> 
      </argument> 
     </argumentlist> 
    </action> 
    <action> 
     <name>
      GetVolumeDB
     </name> 
     <argumentlist> 
      <argument> 
       <name>
        InstanceID
       </name> 
       <direction>
        in
       </direction> 
       <relatedstatevariable>
        A_ARG_TYPE_InstanceID
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        Channel
       </name> 
       <direction>
        in
       </direction> 
       <relatedstatevariable>
        A_ARG_TYPE_Channel
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        CurrentVolume
       </name> 
       <direction>
        out
       </direction> 
       <relatedstatevariable>
        VolumeDB
       </relatedstatevariable> 
      </argument> 
     </argumentlist> 
    </action> 
    <action> 
     <name>
      GetVolumeDBRange
     </name> 
     <argumentlist> 
      <argument> 
       <name>
        InstanceID
       </name> 
       <direction>
        in
       </direction> 
       <relatedstatevariable>
        A_ARG_TYPE_InstanceID
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        Channel
       </name> 
       <direction>
        in
       </direction> 
       <relatedstatevariable>
        A_ARG_TYPE_Channel
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        MinValue
       </name> 
       <direction>
        out
       </direction> 
       <relatedstatevariable>
        VolumeDB
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        MaxValue
       </name> 
       <direction>
        out
       </direction> 
       <relatedstatevariable>
        VolumeDB
       </relatedstatevariable> 
      </argument> 
     </argumentlist> 
    </action> 
    <action> 
     <name>
      ListPresets
     </name> 
     <argumentlist> 
      <argument> 
       <name>
        InstanceID
       </name> 
       <direction>
        in
       </direction> 
       <relatedstatevariable>
        A_ARG_TYPE_InstanceID
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        CurrentPresetNameList
       </name> 
       <direction>
        out
       </direction> 
       <relatedstatevariable>
        PresetNameList
       </relatedstatevariable> 
      </argument> 
     </argumentlist> 
    </action> 
    <action> 
     <name>
      SelectPreset
     </name> 
     <argumentlist> 
      <argument> 
       <name>
        InstanceID
       </name> 
       <direction>
        in
       </direction> 
       <relatedstatevariable>
        A_ARG_TYPE_InstanceID
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        PresetName
       </name> 
       <direction>
        in
       </direction> 
       <relatedstatevariable>
        A_ARG_TYPE_PresetName
       </relatedstatevariable> 
      </argument> 
     </argumentlist> 
    </action> 
    <action> 
     <name>
      SetMute
     </name> 
     <argumentlist> 
      <argument> 
       <name>
        InstanceID
       </name> 
       <direction>
        in
       </direction> 
       <relatedstatevariable>
        A_ARG_TYPE_InstanceID
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        Channel
       </name> 
       <direction>
        in
       </direction> 
       <relatedstatevariable>
        A_ARG_TYPE_Channel
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        DesiredMute
       </name> 
       <direction>
        in
       </direction> 
       <relatedstatevariable>
        Mute
       </relatedstatevariable> 
      </argument> 
     </argumentlist> 
    </action> 
    <action> 
     <name>
      SetVolume
     </name> 
     <argumentlist> 
      <argument> 
       <name>
        InstanceID
       </name> 
       <direction>
        in
       </direction> 
       <relatedstatevariable>
        A_ARG_TYPE_InstanceID
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        Channel
       </name> 
       <direction>
        in
       </direction> 
       <relatedstatevariable>
        A_ARG_TYPE_Channel
       </relatedstatevariable> 
      </argument> 
      <argument> 
       <name>
        DesiredVolume
       </name> 
       <direction>
        in
       </direction> 
       <relatedstatevariable>
        Volume
       </relatedstatevariable> 
      </argument> 
     </argumentlist> 
    </action> 
   </actionlist> 
   <servicestatetable> 
    <statevariable sendevents="yes"> 
     <name>
      LastChange
     </name> 
     <datatype>
      string
     </datatype> 
    </statevariable> 
    <statevariable sendevents="no"> 
     <name>
      A_ARG_TYPE_Channel
     </name> 
     <datatype>
      string
     </datatype> 
     <allowedvaluelist> 
      <allowedvalue>
       Master
      </allowedvalue> 
     </allowedvaluelist> 
    </statevariable> 
    <statevariable sendevents="no"> 
     <name>
      A_ARG_TYPE_InstanceID
     </name> 
     <datatype>
      ui4
     </datatype> 
    </statevariable> 
    <statevariable sendevents="no"> 
     <name>
      Volume
     </name> 
     <datatype>
      ui2
     </datatype> 
     <allowedvaluerange> 
      <minimum>
       0
      </minimum> 
      <maximum>
       100
      </maximum> 
      <step>
       1
      </step> 
     </allowedvaluerange> 
    </statevariable> 
    <statevariable sendevents="no"> 
     <name>
      Mute
     </name> 
     <datatype>
      boolean
     </datatype> 
    </statevariable> 
    <statevariable sendevents="no"> 
     <name>
      PresetNameList
     </name> 
     <datatype>
      string
     </datatype> 
     <allowedvaluelist> 
      <allowedvalue>
       FactoryDefaults
      </allowedvalue> 
     </allowedvaluelist> 
    </statevariable> 
    <statevariable sendevents="no"> 
     <name>
      A_ARG_TYPE_PresetName
     </name> 
     <datatype>
      string
     </datatype> 
     <allowedvaluelist> 
      <allowedvalue>
       FactoryDefaults
      </allowedvalue> 
     </allowedvaluelist> 
    </statevariable> 
    <statevariable sendevents="no"> 
     <name>
      VolumeDB
     </name> 
     <datatype>
      i2
     </datatype> 
     <allowedvaluerange> 
      <minimum>
       -32767
      </minimum> 
      <maximum>
       32767
      </maximum> 
     </allowedvaluerange> 
    </statevariable> 
   </servicestatetable> 
  </scpd>
 </body>
</html>

里面包含了:設置音量的動作指令:SetVolume、快退進Seek、獲取音量GetVolume等等

下面具體怎么控制的呢?詳見 DLNA(二)

友情鏈接:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容