DLNA(Digital Living Network Alliance),即数字家庭网络联盟。
DLNA不是技术,而是一种解决方案,它是多种技术的整合,并致力于构建家庭媒体共享。
DLNA包含多种网络协议,如http、https、upnp等,其中upnp是其重要组成部分。
DLNA主要包含以下四种产品:
DMS,即Digital Media Server(数字媒体服务器)的缩写,其主要作用是作为媒体内容的提供者,为DMP/DMR提供内容播放,DMS可控制提供哪些媒体内容。
DMP,即Digital Media Player(数字媒体播放器)的缩写,可搜索并播放DMS的内容,其作用相当于DMR+DMC。
DMC,即Digital Media Controller(数字媒体控制器)的缩写,可搜索并控制DMR播放DMS提供的内容,即控制DMR与DMS的交互。
DMR,即Digital Media Renderer(数字媒体渲染器)的缩写,可播放DMS提供的内容。
Upnp DA将家庭网络中的角色分为三种:控制点、设备和服务。它们之间主要通过HTTP技术实现通信。设备和相关服务的规格信息使用XML方式向其他节点公布。
Upnp DA中各角色的关系如下图:
Upnp组件架构.png
各个角色的基本概念如下:
控制点
,它初始化并配置好DMS和DMR设备之间的连接,并不直接参与真正的内容传输,内容传输由DMS和DMR完成。DLNA的网络传输由设备发现开始。首先,一个新的控制点(Control Point)加入局域网,那么这个Control Point就会开始搜索局域网内可用的设备了。当控制点开始搜索时,它会从UDP端口发送如下格式的搜索请求消息:
M-SEARCH * HTTP/1.1
MX: 1 //最大时间间隔数
ST: upnp:rootdevice //搜索的设备类型
MAN: "ssdp:discover"
User-Agent: iOS 10.2.1 product/version
Connection: close
Host: 239.255.255.250 //多播地址
如果发现可用设备,则会从UDP端口收到如下响应消息:
HTTP/1.1 200 OK
Cache-control: max-age=1800
Date: Thu, 16 Feb 2017 09:09:45 GMT
EXT:
LOCATION: http://10.2.9.152:49152/TxMediaRenderer_desc.xml //URL for UPnP description for device
Server: search target
USN: uuid:3c970e3c0c0d0000_MR::upnp:rootdevice //composite identifier for the advertisment
BOOTID.UPNP.ORG: 1487062102 //number increased each time device sends an initial announce or an update message
CONFIGID.UPNP.ORG: 499354 //number used for caching description information
SEARCHPORT.UPNP.ORG: number identifies port on which device responds to unicast M-SEARCH
ST: upnp:rootdevice //device type
可以看到,在响应消息中,LOCATION
这个字段是一个url:
LOCATION: http://10.2.9.152:49152/TxMediaRenderer_desc.xml //URL for UPnP description for device
这个url指向的是设备服务和信息描述文档
,一般为xml格式。我们可以直接通过浏览器访问该链接查看该设备的相关信息:
1
1
urn:schemas-upnp-org:device:MediaRenderer:1
卧室的创维盒子Q+
Plutinosoft LLC
http://www.plutinosoft.com
Plutinosoft AV Media Renderer Device
AV Renderer Device
http://www.plutinosoft.com/platinum
uuid:9c443d47158b-dmr
DMR-1.50
urn:schemas-upnp-org:service:AVTransport:1
urn:upnp-org:serviceId:AVTransport
/AVTransport/9c443d47158b-dmr/scpd.xml
/AVTransport/9c443d47158b-dmr/control.xml
/AVTransport/9c443d47158b-dmr/event.xml
...
在设备信息描述文档中,有一个名为
的节点,该节点是设备可提供服务的描述。有多个
节点,
在
节点中,包含了多个在
节点,每一个
节点代表着一个服务
。
节点中主要包含着以下节点:
service的类型
service的ID值
该节点的url指向服务的动作描述文档(SDD)
,可以直接通过浏览器访问
该节点为服务请求url,在发送动作请求消息时,需要将动作参数以规定格式发送给该url以获取响应消息可以看出,
节点的url并没有标出域名和端口号,因为其域名和端口号与响应消息中LOCATION
字段的域名和端口号一致。如上述代码中的
的完整url应为:
http://10.2.9.152:49152/AVTransport/9c443d47158b-dmr/scpd.xml
通过浏览器访问url,可获取如下格式的内容:
1
0
SetAVTransportURI
InstanceID
in
A_ARG_TYPE_InstanceID
CurrentURI
in
AVTransportURI
CurrentURIMetaData
in
AVTransportURIMetaData
...
AVTransportURI
string
...
可以看到,文档中包含一个名为
的节点,该节点为服务的动作描述。
中包含了多个
节点,每个节点对应着一个动作
。
每个
节点中都包含着如下节点:
动作名
参数列表。每个
节点中包含了多个
节点,每个
节点代表着一个动作参数。一个
节点包含着如下节点:
参数名
该节点参数取值为in/out
, 当
的值为in
时,表明这个参数的值是传入值,当为out
时,表明这个参数的值是返回值,则该值会随着订阅事件一起返回给订阅者。
该节点的值是一个
节点的映射,映射的内容可在下方
节点中找到,
节点包含值的类型及取值范围等信息。简单的来说,可以把一个action
当成一个API接口,而action
中的argument
则可表示为API接口的参数,而service
即是多个相关接口的集合。
通过上面的信息,就可以请求服务动作,实现设备控制了。开发者可根据文档中规定的请求参数,发送如下格式的请求消息:
POST /AVTransport/9c443d47158b-dmr/control.xml HTTP/1.1
HOST: 10.2.9.152
Content-Type: text/xml; charset="utf-8"
SOAPAction: "urn:schemas-upnp-org:service:AVTransport:1#SetAVTransportURI"
0
yourAVURI
POST
字段后面跟的是
节点的url,HOST
对应的LOCATION
字段的IP。SOAPAction
的格式:"
节点的内容是请求体,请求体的格式为:
<参数1>参数值参数1>
<参数2>参数值参数2>
...
如果请求成功,会获取如下格式的响应消息:
HTTP/1.1 200 OK
Content-Type: text/xml; charset="utf-8"
Date: Thu, 16 Feb 2017 09:09:45 GMT
Server: OS/version UPnP/1.1 product/version
<_xmlns:u>"urn:schemas-upnp-org:service:AVTransport:1"
这样,整个传输流程就完成了。同一种类型的设备提供的服务大部分相同,但也可能有所差异,因此,在请求设备服务之前,最好先浏览其设备描述文档
,查看设备支持哪些服务。