Minidlna

一简介:

UPnP全名是Universal Plug and Play,主要是微软在推行的一个标准。简单的来说,UPnP最大的愿景就是希望任何设备只要一接上网络,所有在网络上的设备马上就能知道有新设备加入,这些设备彼此之间能互相沟通,更能直接使用或控制它,一切都不需要设定,完全的Plug and Play

upnp协议:

UPnP设备体系结构包含了设备之间、控制点之间、设备和控制点之间的通信。完整的UPnP由设备寻址、设备发现、设备描述、设备控制、事件通知和基于Html的描述界面几部分构成。


  图一:协议整体图

 

1. UPnP是一个多层协议构成的框架体系,每一层都以相邻的下层为基础,同时又是相邻上层的基础。直至达到应用层为止。该图中的最下面是就是IPTCP,共两层,负责设备的IP地址。

2. 三层是HTTPHTTPUHTTPMU,这一层,属于传送协议层。传送的是内容都经过封装后,存放在特定的XML文件中的。对应的SSDPGENASOAP指的是保存在XML文件中的数据格式。到这一层,已经解决了UPnP设备的IP地址和传送信息问题。

3. 第四层是UPnP设备体系定义,仅仅是一个抽象的、公用的设备模型。任何UPnP设备都必须使用这一层。

4. 第五层是UPnP论坛的各个专业委员会的设备定义层,在这个论坛中,不同电器设备由不同的专业委员会定义,例如:电视委员会只负责定义网络电视设备部分,空调器委员会只负责定义网络空调设备部分……,依此类推。所有的不同类型的设备都被定义成一个专门的架构或者模板,供建立设备的时候使用。可以推知,进入这一层,设备已经被指定了明确用途。当然,这些都必须遵守标准化的规范。从目前看,UPnP已经可以支持大部分的设备:从电脑、电脑外设,移动设备和家用消费类电子设备等等,无所不包,随着这个体系的普及,将可能有更多的厂家承认这一标准,最终,可能演化为公认的行业标准。

5. 最上层,也就是应用层,由UPnP设备制造厂商定义的部分。这一层的信息是由设备制造厂商来填充的,这部分一般有设备厂商提供的、对设备控制和操作的底层代码,然后,就是名称序列号呀,厂商信息之类的东西。

upnp术语

图二:minidlna结构图

● UUID

UUID含义是通用唯一识别码(Universally Unique Identifier),其目的是让分布式系统中的所有元素,都有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。其格式为xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxxxxxx分别为当前日期和时间,时钟序列,全局唯一的IEEE机器识别号,如果有网卡,从网卡mac地址获得,没有网卡以其他方式获得。

● UDN

单一设备名(Unique Device Name),基于UUID,表示一个设备。在不同的时间,对于同一个设备此值应该是唯一的。

● URI

 Web上可用的每种资源 - HTML文档、图像、视频片段、程序等-由一个通用资源标志符(Universal Resource Identifier,简称"URI")进行定位。URI一般由三部分组成:访问资源的命名机制;存放资源的主机名;资源自身的名称,由路径表示。考虑下面的URI,它表示了当前的HTML 4.0规范:http://www.webmonkey.com.cn/html/html40/它表示一个可通过HTTP协议访问的资源,位于主机www.webmonkey.com.cn上,通过路径“/html/html40”访问。

● URL

URLURI命名机制的一个子集,URLUniform Resource Location的缩写,译为统一资源定位符。通俗地说,URLInternet上用来描述信息资源的字符串,主要用在各种www客户程序和服务器程序上。采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。

● URN

URNURL的一种更新形式,统一资源名称(URN,Uniform Resource Name)。唯一标识一个实体的标识符,但是不能给出实体的位置。标识持久性Internet资源URN可以提供一种机制,用于查找和检索定义特定命名空间的架构文件。尽管普通的URL可以提供类似的功能,但是在这方面,URN更加强大并且更容易管理,因为URN可以引用多个URL

upnp组件

完整的UPnP服务系统由支持UPnP的网络和符合UPnP规范的设备共同构成的。

整个系统是由DeviceService、和Control Point三部分所构成。

1设备(Device):

这里是指符合UPnP规范的设备。一个UPnP设备可以看成一个包含服务并嵌套了常规设备的容器。例如,一个UPnPVCR(录像机)设备可以包含磁带传送服务、调谐服务和时钟服务。就是说,UPnP之下的设备不能仅仅理解为硬件意义上的设备,而应当包括服务功能。

不同种类的UPnP设备将关联不同的设置、服务和嵌入设备。如打印机和VCR属于不同用途的设备,服务就不可能定义成一样的。

2服务(Service

设备执行用户请求的控制过程,可划分成一个个很小的阶段或单位,每个单位就称为一个服务。每一个服务,对外都表现为具体的行为和模式,而行为和模式又可以用状态和变量值进行描述。只要可以用数值描述,在计算机里面就容易处理了。例如,模仿一个时钟,它只有一个工作模式:这个模式就是模拟并显示当前的时间。而一个时钟的行为共有两种(也只有两种):

(1). 设置时间(用来即平时说的对表.

(2). 得到时间(用于显示时间)。

其它设备服务,也是用这样思路来描述和定义的,一个设备也可以被定义多个服务。不论是设备的定义信息和服务的描述信息,都保存在一个XML文件中,这个文件也是UPnP协议构成的一部分。当设备建立和使用服务的时候,XML文件可以与它们进行关联。

XML文件中还有一个很关键的状态表,状态表可进一步分为服务状态表事件状态表。整个UPnP设备运行的全过程内,状态表贯穿始终,当设备状态改变的时候,例如发生参数变化或状态刷新的时候,立即就在状态表中反映出来。如控制服务器在接收到设置时间的行为请求时,就立即执行请求(对时操作),并给出响应,同时更新状态表中的有关数据。相应地,事件服务器负责向对此事件感兴趣的设备公布所发生的状态改变。例如,一个火灾事件发生后,事件服务器就向火灾报警器发布这个事件,导致报警器动作产生报警信号。

 

3控制点(Control Point):

UPnP网络中,用户请求设备执行的控制是通过控制点实现的,控制点首先是一个有能力控制别的设备的控制者,还要具有在网络中发现控制目标的能力。在发现(控制目标)之后,控制点应当:

取得设备的描述信息并得到所关联的服务列表。

取得相关服务的描述。

调用控制服务行为。

确定服务的事件,不论何时,只要服务状态发生改变,事件服务器会立即向控制点发送一个事件信息。

从上面说到的各种信息,都保存在XML文件中,不同用途的信息,格式不同。保证可以各取所需,不会混淆。

五、Upnp工作流程

图三:upnp工作流程图

1、 设备寻址阶段

地址是整个UPnP系统工作的基础条件,每个设备都应当是DHCPDynamic Host Configuration Protocol动态主机配置协议)的客户。当设备首次与网络建立连接后,利用DHCP服务,使设备得到一个IP地址。我们的minidlnaLanIP地址。

 

2、 发现阶段

   可分成两种情况,一种是在有控制请求之后,在当前的网络中查找有无对应的可用设备;另一种情况是某一设备接入网络、取得IP地址之后,就开始向网络广播自己已经进入网络,即寻找控制请求。

图四:发现阶段

当一个设备加入网络,它将向组播发送类似如下的消息:

NOTIFY * HTTP/1.1

HOST:239.255.255.250:1900

Cache-Control:max-age=60

Location:http://192.168.0.1:5500/rootDesc.xml

Server: 1.0

NT:upnp:rootdevice

USN:uuid:ec9982fc-9600-11df-b8e5-000c29d32f89::upnp:rootdevice

NTS:ssdp:alive

 

Host:这里必须使用IANAInternetAssigned Numbers Authority)为SSDP预留的组播地址:239.255.255.250:1900

Cache-controlmax-age的数值表明设备将在这段时间(单位为秒)后失效,因此,设备应当在失效前,重发这样的消息。

Location:设备描述文件的URL

NtNotification Type,这里的值upnprootdevice)表明这是一个根设备。每个设备可以有自己的子设备。

NtsNotification Sub Type,标准规定必须是ssdp:alive

UsnUnique Service Name,是一个设备实例的标识符。

 

 

 与之对应的是,当控制点加入网络时,它也将组播一个消息,用来发现设备:

M-SEARCH * HTTP/1.1

Host:239.255.255.250:1900

ST:urn:schemas-upnp-org:service:ContentDirectory:1

Man:"ssdp:discover"

MX:3

 

Host:同上。

Man:必须是“ssdp:discover”

Mx15之间的一个值,表示最大的等待应答的秒数。

STSeatch Targer,表示搜索的节点类型。

 

设备的应答报文是:

HTTP/1.1 200 OK

CACHE-CONTROL: max-age=1410

DATE: Fri, 15 Jul 2016 02:22:13 GMT

ST: urn:schemas-upnp-org:service:ContentDirectory:1

USN: uuid:4d696e69-444c-164e-9d41-00904c888888::urn:schemas-upnp-org:service:ContentDirectory:1

EXT:

SERVER: Linux DLNADOC/1.50 UPnP/1.0 MiniDLNA/1.1.4

LOCATION: http://192.168.0.1:8200/rootDesc.xml

Content-Length: 0

LOCATION:设备描述的URL这个很重要

 

1、 描述阶段

简单说,这是声明自己是什么样的设备,例如名称、制造厂商、序列号码等等。刚开始发现设备后,控制点对这个设备的了解还很少,需要依据ULR找到该设备的描述文件,从这些文件中读取更多的描述信息。描述信息的范围很广,一般都是由设备的制造厂商提供的。主要的描述项目有:控制的模式名称和模式号码、设备序列号、制造厂商名称、厂商的WEBULR等等。这些一般都存放在特定的XML文件中。

图五:描述阶段

设备的描述通过HTTP协议来完成。

1、设备描述

控制点请求设备描述报文:

GET /rootDesc.xml HTTP/1.1

Cache-Control: no-cache

Connection: Close

Pragma: no-cache

Accept: text/xml, application/xml

Host: 192.168.0.2:8200

User-Agent: Microsoft-Windows/6.1 UPnP/1.0 Windows-Media-Player/12.0.7601.19148 DLNADOC/1.50 (MS-DeviceCaps/1024)

 

设备应答报文

HTTP/1.1 200 OK

Content-Type: text/xml; charset="utf-8"

Connection: close

Content-Length: 2196

Server: Linux DLNADOC/1.50 UPnP/1.0 MiniDLNA/1.1.4

Date: Thu, 21 Jul 2016 08:17:53 GMT

EXT:

1

0

 

urn:schemas-upnp-org:device:MediaServer:1

TendaDLNA

Tenda Technology Co.,Ltd

http://www.tenda.com.cn/

MiniDLNA on Tenda

Windows Media Connect compatible

1

http://www.tenda.com.cn/

12345678

uuid:4d696e69-444c-164e-9d41-00904c888888

DMS-1.50

/

urn:schemas-upnp-org:service:ContentDirectory:1

urn:upnp-org:serviceId:ContentDirectory

/ctl/ContentDir

/evt/ContentDir

/ContentDir.xml

 

deviceType:设备类型,格式为:“urn:schemas-upnp-org:device:deviceType:v”,这里deviceTypev是由设备定义的。

friendlyName:一个更加友好的设备名。

Manufacturer:制造商。

modeName:型号。

UDNUnique Device Name,设备的UUID

对于每一个服务:

serviceType:与deviceType类似,这里的后两段由服务定义。

serviceId:服务ID,通常于serviceType对应。

SCPDURL:服务描述的URL

controlURL:用于控制的URL

eventSubURL:用于订阅事件的URL

 

 

2、服务描述:

控制点请求设备描述报文

GET /ContentDir.xml HTTP/1.1

Cache-Control: no-cache

Connection: Close

Pragma: no-cache

Accept: text/xml, application/xml

User-Agent: Microsoft-Windows/6.1 UPnP/1.0 Windows-Media-Player/12.0.7601.19148 DLNADOC/1.50 (MS-DeviceCaps/1024)

Host: 192.168.0.2:8200

 

服务描述设备应答报文:

HTTP/1.1 200 OK

Content-Type: text/xml; charset="utf-8"

Connection: close

Content-Length: 5094

Server: Linux DLNADOC/1.50 UPnP/1.0 MiniDLNA/1.1.4

Date: Fri, 15 Jul 2016 02:22:11 GMT

EXT:

 

1

0

GetSearchCapabilities

SearchCaps

out

SearchCapabilities

GetSortCapabilities

SortCaps

actionList定义了行为serviceStateTable定义了状态变数

每一个行为都由一个名称(name)和若干参数(argument)组成。二参数由名字(name)、传递方向(direction,取值in或者out)以及关联的状态变数(relatedStateVariable)组成。

状态变数之所以叫做状态变数,是用来标明UPnP设备或程序的一些状态的。一个程序可以订阅(subscribe)状态的变化,从而得到通知。而一个参数之所以必须关联一个状态变数,是因为状态变数的类型决定了参数的类型。

Windows medaiplay的主要服务是:ContentDirX_MS_MediaReceiverRegistrar.xml

ContentDir主要包括的动作有:Browse(展开目录结构)

Search(从数据库获取媒体资源的parentID。。。。。。。)

X_MS_MediaReceiverRegistrar.xml包括的动作有:IsAuthorizedIsValidatedRegisterDeviceRegistrationRespMsg

 

手机客户端ubbleupnp的主要服务是:ContentDirConnectionMgr.xml

ConnectionMgr.xml提供的动作:GetProtocolInfo

4、控制阶段

控制点找到设备描述之后,会从描述中提炼出要进行的操作并获悉所有的服务;对每个UPnP设备来说,这些描述必须是很确切、很详细的,描述中可能包含有命令或行为列表、服务响应信息、用到的参数等等。对于服务的每个行为,也伴有描述信息:主要是整个服务进行期间的变量、变量的数据类型、可用的取值范围和事件的特征。

要控制某个设备,控制点必须先发送一个控制行为请求,要求设备开始服务,然后再按设备的ULR发送相应的控制消息,控制消息就是放置在XML文件中的那些SOAP格式的信息。最后,服务会返回响应信息,指出服务是成功或是失败。

图六:控制阶段

Process_upnphttp会在底层调用upnpsoap.c中的ExecuteSoapAction方法,在upnpsoap.c定义了相关信令和它们对应的方法,如下:


控制请求报文:

POST /ctl/X_MS_MediaReceiverRegistrar HTTP/1.1

Cache-Control: no-cache

Connection: Close

Pragma: no-cache

Content-Type: text/xml; charset="utf-8"

User-Agent: Microsoft-Windows/6.1 UPnP/1.0 Windows-Media-Player/12.0.7601.19148 DLNADOC/1.50 (MS-DeviceCaps/1024)

SOAPAction: "urn:microsoft.com:service:X_MS_MediaReceiverRegistrar:1#IsAuthorized"

Content-Length: 403

Host: 192.168.0.2:8200

 

设备控制应答报文

HTTP/1.1 200 OK

Content-Type: text/xml; charset="utf-8"

Connection: close

Content-Length: 329

Server: Linux DLNADOC/1.50 UPnP/1.0 MiniDLNA/1.1.4

Date: Fri, 15 Jul 2016 02:22:11 GMT

EXT:

 

1

 

5、事件阶段

在服务进行的整个时间内,只要变量值发生了变化或者模式的状态发生了改变,就产生了一个事件,系统将修改上述提到的事件列表的内容。随之,事件服务器把事件向整个网络进行广播。另一方面,控制点也可以事先向事件服务器预约事件信息,保证将该控制点感兴趣的事件及时准确地传送过来。

广播或预约事件,传送的都是事件消息,事件消息也放在XML文件中,使用的格式是GENA。设备投入工作之前的准备―――初始化过程,也是一个事件,初始化需要的各种信息也是用事件消息传送的。包括的内容主要是:变量初始值,模式的初始状态等等

SUBSCRIBE /evt/ContentDir HTTP/1.1

Cache-Control: no-cache

Connection: Close

Pragma: no-cache

User-Agent: Microsoft-Windows/6.1 UPnP/1.0

NT: upnp:event

Callback:

Timeout: Second-1800

Host: 192.168.0.2:8200

SID:本订阅的标识符,通常使用UUID

TIMETOUT:这里的值表示本订阅的有效期。这意味着在超时前,必须续订。

 

HTTP/1.1 200 OK

Content-Type: text/xml; charset="utf-8"

Connection: close

Content-Length: 0

Server: Linux DLNADOC/1.50 UPnP/1.0 MiniDLNA/1.1.4

Timeout: Second-1800

SID: uuid:efa9f9ba-4a32-11e6-b545-00904c888888

Date: Fri, 15 Jul 2016 02:22:11 GMT

EXT:

六、minidlna执行流程图

一、扫描流程图


二、发现阶段流程图

                                                        

三、描述阶段流程图


四、控制阶段流程图


五、监控子线程流程图



你可能感兴趣的:(媒体服务)