精华内容
下载资源
问答
  • 适用于Python的uPnP客户端库3。 该库可用于发现和使用uPnP设备及其服务。 它最初是基于以及他的博客文章题为“。 安装 pip install upnpclient 用法 典型用法: In [ 1 ]: import upnpclient In [ 2 ]: devices =...
  • Upnp TEST 测试器

    2019-01-03 13:39:21
    That is where the UPnP Test application comes in. This simple program is designed to help you identify the issues that prevent the UPnP protocol from functioning correctly. Before you get your hopes...
  • UPnP PortMapper UPnP PortMapper是易于使用的程序,用于管理本地网络中启用UPnP的Internet网关设备(路由器)的端口映射(端口转发)。 您可以轻松查看,添加和删除端口映射。 使用端口转发,可以从Internet访问...
  • upnp Golang UPNP实现可打开网关端口并获取WAN地址 可用的功能包括: AddMappingPort DelMappingPort 外部IP地址
  • UPnP PortMapper可用于轻松管理本地网络中启用UPnP的Internet网关/路由器的端口映射/端口转发。
  • 路由器怎么关闭upnp功能?upnp功能能让局域网中的各电脑看网上的在线视频,多点下载软件等较流畅,该怎么关闭这个功能呢?下面我们就来看看详细的教程,需要的朋友可以参考下
  • 在NodeJS中使用UPnP和NAT-PMP进行快速端口映射。 安装 必需:NodeJS> = 10 npm install nat-api 用法 const NatAPI = require ( 'nat-api' ) const client = new NatAPI ( ) // Map public port 1000 to private ...
  • 最近很多人都在找潘多拉固件上网配置方法,大家都感觉非常的困难,其实很简单,需要的快来看看下面的教程吧
  • 此应用程序是罗技媒体服务器 (LMS) / SqueezeBox 服务器 (SBS) 和 UPnP 设备之间的桥梁。 它允许任何 UPnP 设备用作普通的 SqueezeBox 设备。 打包版本可以在这里找到和这里: : 请参阅此处的支持线程: : 高级...
  • upnpserver UpnpServer是用NodeJS编写的快速轻便的UPnP服务器。 此版本不需要外部数据库(mysql,mongodb),它将所有信息存储在内存中。 兼容性 Freebox HD 音桥 ht5streamer 英特尔设备验证器 三星AllShare播放...
  • UPnP&DLNARefrence.7z

    2020-08-17 22:01:21
    UPnP&DLNARefrence ├── 2007.06.05 Status Report.ppt ├── 2007.07.04 Rehearsal.ppt ├── 2007.07.20 Oral Present.ppt ├── A survey of key management for secure group communication.pdf ├── ...
  • UPnP检查器 基于一致性的UPnP设备和服务分析器 作者: 弗兰克·斯科茨(Frank Scholz) 版权: 2008年:弗兰克·斯科茨(Frank Scholz),2014年:哈特穆特·戈贝尔(Hartmut Goebel) 执照: 麻省理工学院执照...
  • 通用UPnP、DLNA安卓播放器是一套关于家庭互联的项目源码,首先设备需要在一个局域网中,才能通过uPnP/Dlna服务可以实现设备间的点播交互,就像通过局域网你可以连接到你的智能电视上并且让你智能电视里面的某个视频...
  • 端口控制协议 (PCP) 是一种简单、灵活、轻... 法国电信/Orange Labs Beijing 已根据 RFC6887 和 RFC6970 开发了 PCP 客户端,可在通用即插即用 (UPnP) 和 PCP 之间互通。 请注意,PCP 客户端应与 PCP 服务器一起工作。
  • UPnP 渗透测试工具包 该工具旨在汇集一系列 UPnP 评估功能,以最少的配置和设置实现快速评估。 它的开发目的是帮助安全顾问探索、欺骗和操纵 UPnP 设备和工作中的底层协议。 它旨在作为在受信任环境中用于研究目的的...
  • UPnP是通过各种各样的智能设备、无线设备和个人电脑等实现遍布全球的对等网络连接(P2P)的结构
  • 非洲菊-UPnP媒体服务器 Gerbera是UPnP媒体服务器,它使您可以通过家庭网络流式传输数字媒体,并在各种UPnP兼容设备上使用它。 非常欢迎请求请求,并鼓励报告问题。 文献资料 通过在线查看我们的文档。 特征 通过...
  • goupnp是Go的UPnP客户端库 安装 运行go get -u github.com/huin/goupnp 。 文献资料 请参阅 ,以快速了解该库的最常用用例。 支持的DCP(您可能想从以下其中一个开始): -UPnP设备控制协议MediaServer v1和Media...
  • 节点-upnp-控制点 Node.js 的 UPnP 控制点实现,用于发现和连接 UPnP 设备。 Belkin WeMo 传感器和开关的设备实现是作为起点提供的。 依赖关系 安装依赖: npm install 例子 简单的 WeMo 演示。 node examples/...
  • UPnP BHunter 描述 UPnP BHunter是用Python / Jython编写的Burp Suite扩展,可用作UPnP渗透测试工具,用于查找活动的UPnP服务/设备并提取相关的SOAP,Subscribe和Presentation请求(支持IPv4和IPv6),然后对其进行...
  • 用于查看UPnP服务以及UPnP DLNA服务的应用程序
  • UPNP

    2021-01-26 18:42:04
    设备类型及服务类型 设备类型 表示 UPnP_RootDevice upnp:rootdevice UPnP_InternetGatewayDevice1 urn:schemas-upnp-org:device:InternetGatewayDevice:1 UPnP_WANConnectionDevice1 urn:schemas-upnp-org:device:...

    原文:https://www.uedbox.com/post/65529/

    视频投屏概念

    投屏不止是投射视频,还包括常见的多媒体文件。但常见的还是视频投屏功能需求。

    视频投屏大致分2种两种:

    1. 投射视频流到设备上。
      • Google -> Chromecast
      • Wi-Fi Alliance -> Miracast
      • Intel -> WiDi
      • Apple -> AirPlay
    2. 传递多媒体地址到设备上,由设备自己来展示或者播放。
      • Digital Home Working Group -> DLNA
      • Apple -> AirPlay

    DLNA

    简介

    数字生活网络联盟 Digital Living Network Alliance,简称 DLNA 是一个由消费性电子、移动电话以及计算机厂商组成的联盟组织。

    最初索尼于2003年6月创立 Digital Home Working Group,并于一年后更名为 DLNA 联盟。联盟成员包括飞利浦、三星、索尼、微软、英特尔和诺基亚等厂家。

    2017年2月20日,数字生活网络联盟在其官网宣布:本组织的使命已经完成,已于2017年1月5日正式解散,相关的认证将移交给 SpireSpark 公司。

    DLNA 投屏相关简析

     

    设备类型

    大致家用网络设备种类,详见 https://en.wikipedia.org/wiki/Digital_Living_Network_Alliance。

    DLNA 设备类型功能
    Digital Media Server(DMS)数字媒体服务器提供了媒体文件的获取、录制、存储以及作为源头的设备。
    Digital Media Player(DMP)数字媒体播放器可查找并播放或输出任何由DMS所提供的媒体文件的设备。
    Digital Media Controller(DMC)数字媒体控制器作为遥控设备使用,可查找DMS上的多媒体文件,并指定可播放该多媒体文件的DMR进行播放或是控制多媒体文件上下传到DMS的设备。
    Digital Media Renderer(DMR)可接收并播放从DMC 投送过来的媒体文件。
    Digital Media Printer(DMPr)数字媒体打印机DMPr的打印机可以在DLNA网络架构下提供打印功能。

     

    支持媒体类型

    媒体类型支持格式
    图片JPEG、PNG
    音频LPCM、MP3、AAC、WMA
    视频MPEG2、MPEG-4、WMV

    具体协议

    投屏功能的实现本质上就是局域网内的设备发现,交互与控制功能的实现。

    我们先看下 DLNA 协议的一些技术分层。

    DLNA 投屏相关简析

    这里最主要的是 UPnP 协议,它是 DLNA 设备发现与控制最主要的协议,也可以说 UPnP 就是 DLNA 的核心,类似于 AirPlay 里的 Bonjour 协议。

    UPnP

    DLNA 投屏相关简析

    UPnP Universal Plug and Play 协议主要功能是提供了不同设备之间发现,控制,通信的功能。

    上面三层主要是 UPnP 设备定义相关,最上层是由 UPnP 设备制造厂商定义的,包含厂家信息或独有的一些功能。

    下面三层负责设备的发现,描述,控制等功能。

    常见的DLNA库有Cling,CyberGarage,Intel UPnP stack,Platinum 等,具体见 http://www.upnp.org 。

    抽象组件

    在将 SSDP 等协议之前,我们需要理解 UPnP 协议中基本的几个抽象组件。

    • 设备 Devices一个物理设备可能有多个根设备。根设备可以有多个嵌入式设备。因此 UPnP提供了一种非常灵活的逻辑安排。设备将有一个状态表来维护状态变量。设备上的所有操作都基于这些状态变量的状态。
    • 服务 Services代表设备能提供的功能,是依赖于设备存在的。
    • 控制点 Control points提供设备控制能力比如提供获取设备描述,服务列表,设备控制指令,服务订阅等功能。

    协议简述

    • 发现 DiscoveryUPnP 设备通过 简单服务发现协议 Simple Service Discovery Protocol (SSDP) 来完成发现功能。
    • 描述 Description
      • 一旦找到了网络中的其他可用设备,我们就需要获得设备的具体服务细节。
      • 设备还应该向请求它的其他设备提供其功能细节
    • 控制 Control
      控制点可以通过SOAP消息调用服务提供的功能。
      简单对象访问协议(Simple Object Access Protocol, SOAP)是微软用于跨平台rpc的技术。
      设备服务一旦接收到消息,就必须对其进行操作
    • 事件 Eventing
      UPnP 遵循发布-订阅模型,将状态变量的变化通知给订阅状态的控制点。采用通用事件通知体系结构 General Event Notification Architecture (GENA) 来实现这个功能。
    • 浏览 Presentation
      UPnP 设备还能提供基于浏览器的界面。基于HTML的,表示URL是作为描述过程一部分提供的设备描述符文档(DDD)的一部分。

    寻址 Addressing

    UPnP 基于 IP 协议,所以跟普通网络设备一样都需要一个唯一的 IP 地址。通常局域网内的 IP 都是通过 DHCP 自动分配,如果没有 UPnP 则会使用 LLA 来为自己找适合的 IP 地址。另外在运行过程中如果发现有 DHCP 服务了,那么就改用 DHCP 分配的地址。

    发现 Discovery - SSDP

    简单服务发现协议(SSDP,Simple Service Discovery Protocol)是一种应用层协议。它提供了在局部网络里面发现设备的机制。控制点可以通过使用简单服务发现协议,根据自己的需要查询在自己所在的局部网络里面提供特定服务的设备。设备也可以通过使用简单服务发现协议,向自己所在的局部网络里面的控制点宣告它的存在。

    简单服务发现协议是在 HTTPU 和 HTTPMU 的基础上实现的协议。

    HTTPU & HTTPMU

    • HTTPU 协议是指在 UDP 上实现普通的 HTTP 传送协议。它一项自1999年至今,实验中的技,至今尚未被列入RFC之中。
    • HTTPMU 协议是指在 UDP 上实现 HTTP 协议的多址传送。

    发现方式

    SSDP 通过多播来实现设备发现功能,地址限定如下,端口也是固定的 1900。

    协议地址
    IPv4 site-local address239.255.255.250
    IPv6 link-localFF02::C
    IPv6 site-localFF05::C
    IPv6 organization-localFF08::C
    IPv6 globalFF0E::C

    SSDP 有两种发现设备的方式:

    接收 NOTIFY 信息

    DLNA 投屏相关简析

    ssdp:alive 存活消息

     

    1

    2

    3

    4

    5

    6

    7

    8

    NOTIFY * HTTP/1.1

    HOST: 239.255.255.250:1900

    CACHE-CONTROL: max-age=62

    LOCATION: http://10.23.167.129:49153/description.xml

    NT: urn:schemas-upnp-org:service:AVTransport:1

    NTS: ssdp:alive

    SERVER: Linux/3.10.61+, UPnP/1.0, Portable SDK for UPnP devices/1.6.13

    USN: uuid:F7CA5454-3F48-4390-8009-4c3d4ee64f1c::urn:schemas-upnp-org:service:AVTransport:1

    ssdp:byebye 离开消息

     

    1

    2

    3

    4

    NOTIFY * HTTP/1.1

    HOST: 239.255.255.250:1900

    NTS: ssdp:byebye

    USN: uuid:F7CA5454-3F48-4390-8009-4c3d4ee64f1c::urn:schemas-upnp-org:service:AVTransport:1

    主动发送搜索消息

    DLNA 投屏相关简析

    多播发送搜索消息

     

    1

    2

    3

    4

    5

    M-SEARCH * HTTP/1.1

    ST: ssdp:all

    HOST: 239.255.255.250:1900

    MAN: "ssdp:discover"

    MX: 5

    多播搜索响应,返回内容跟 alive 消息区别不大。

     

    1

    2

    3

    4

    5

    6

    7

    HTTP/1.1 200 OK

    LOCATION: http://10.23.169.140:61000/

    DATE: Thu, 06 Sep 2018 07:47:49 GMT

    EXT:

    SERVER: REALTEK, UPnP/1.0, Intel MicroStack/1.0.2718

    USN: uuid:31d5c4f9-8bd3-44bd-bb62-e352417eff66

    CACHE-CONTROL: max-age=1800ST: uuid:31d5c4f9-8bd3-44bd-bb62-e352417eff66

    字段含义
    CACHE-CONTROLmax-age指定通知消息存活时间,如果超过此时间间隔,控制点可以认为设备不存在
    DATE指定响应生成的时间
    MANssdp:discover 表示是搜索消息
    EXT向控制点确认MAN头域已经被设备理解
    LOCATION包含根设备描述地址
    SERVER饱含操作系统名,版本,产品名和产品版本信息
    ST内容和意义与查询请求的相应字段相同,ssdp:all 表示搜索所有设备
    USN表示不同服务的统一服务名,它提供了一种标识出相同类型服务的能力。
    HOST固定的多播地址
    NTSssdp:alive 表示存活消息 ssdp:bye 表示离开消息
    NT设备的服务类型
    MX表示设备应该再5秒内响应,值是0到5之间随机。

    设备类型及服务类型

    设备类型表示
    UPnP_RootDeviceupnp:rootdevice
    UPnP_InternetGatewayDevice1urn:schemas-upnp-org:device:InternetGatewayDevice:1
    UPnP_WANConnectionDevice1urn:schemas-upnp-org:device:WANConnectionDevice:1
    UPnP_WANDevice1urn:schemas-upnp-org:device:WANConnectionDevice:1
    UPnP_WANCommonInterfaceConfig1urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1
    UPnP_WANIPConnection1urn:schemas-upnp-org:device:WANConnectionDevice:1
    UPnP_Layer3Forwarding1urn:schemas-upnp-org:service:WANIPConnection:1
    UPnP_WANConnectionDevice1urn:schemas-upnp-org:service:Layer3Forwarding:1
    服务类型表示
    UPnP_MediaServer1urn:schemas-upnp-org:device:MediaServer:1
    UPnP_MediaRenderer1urn:schemas-upnp-org:device:MediaRenderer:1
    UPnP_ContentDirectory1urn:schemas-upnp-org:service:ContentDirectory:1
    UPnP_RenderingControl1urn:schemas-upnp-org:service:RenderingControl:1
    UPnP_ConnectionManager1urn:schemas-upnp-org:service:ConnectionManager:1
    UPnP_AVTransport1urn:schemas-upnp-org:service:AVTransport:1

    描述 Description - DDD & SDD

    有可能考虑到 UDP 内传输的内容大小的考虑,上面发现时消息里的数据内容都不是很多,难以获得完整的 DLNA 设备信息。所以 UPnP 通过提供 XML 描述文件来详细记录设备信息,并把 XML 文件的地址放在消息体内,就是 Location 字段内的地址。

    描述 XML 主要有两种类型:

    1. 设备描述文档 DDD
    2. 服务描述文档 SDD

    设备描述文档

     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    62

    63

    <root xmlns="urn:schemas-upnp-org:device-1-0">

    <specVersion>

    <major>1</major>

    <minor>0</minor>

    </specVersion>

    <device>

    <deviceType>urn:schemas-upnp-org:device:MediaRenderer:1</deviceType>

    <presentationURL>/</presentationURL>

    <friendlyName>小小的小米盒子</friendlyName>

    <manufacturer>Xiaomi</manufacturer>

    <manufacturerURL>http://www.xiaomi.com/</manufacturerURL>

    <modelDescription>Xiaomi MediaRenderer</modelDescription>

    <modelName>Xiaomi MediaRenderer</modelName>

    <modelURL>http://www.xiaomi.com/hezi</modelURL>

    <UPC>000000000013</UPC>

    <UDN>uuid:F7CA5454-3F48-4390-8009-4c3d4ee64f1c</UDN>

    <UID>-89219150</UID>

    <serviceList>

    <service>

    <serviceType>urn:schemas-upnp-org:service:AVTransport:1</serviceType>

    <serviceId>urn:upnp-org:serviceId:AVTransport</serviceId>

    <SCPDURL>/dlna/Render/AVTransport_scpd.xml</SCPDURL>

    <controlURL>_urn:schemas-upnp-org:service:AVTransport_control</controlURL>

    <eventSubURL>_urn:schemas-upnp-org:service:AVTransport_event</eventSubURL>

    </service>

    <service>

    <serviceType>urn:schemas-upnp-org:service:ConnectionManager:1</serviceType>

    <serviceId>urn:upnp-org:serviceId:ConnectionManager</serviceId>

    <SCPDURL>/dlna/Render/ConnectionManager_scpd.xml</SCPDURL>

    <controlURL>_urn:schemas-upnp-org:service:ConnectionManager_control</controlURL>

    <eventSubURL>_urn:schemas-upnp-org:service:ConnectionManager_event</eventSubURL>

    </service>

    <service>

    <serviceType>urn:schemas-upnp-org:service:RenderingControl:1</serviceType>

    <serviceId>urn:upnp-org:serviceId:RenderingControl</serviceId>

    <SCPDURL>/dlna/Render/RenderingControl_scpd.xml</SCPDURL>

    <controlURL>_urn:schemas-upnp-org:service:RenderingControl_control</controlURL>

    <eventSubURL>_urn:schemas-upnp-org:service:RenderingControl_event</eventSubURL>

    </service>

    <service>

    <serviceType>urn:mi-com:service:RController:1</serviceType>

    <serviceId>urn:upnp-org:serviceId:RController</serviceId>

    <SCPDURL>/dlna/Render/RControl_scpd.xml</SCPDURL>

    <controlURL>_urn:schemas-upnp-org:service:RenderingControl_control</controlURL>

    <eventSubURL>_urn:schemas-upnp-org:service:RenderingControl_event</eventSubURL>

    </service>

    </serviceList>

    <av:X_RController_DeviceInfo xmlns:av="urn:mi-com:av">

    <av:X_RController_Version>1.0</av:X_RController_Version>

    <av:X_RController_ServiceList>

    <av:X_RController_Service>

    <av:X_RController_ServiceType>controller</av:X_RController_ServiceType>

    <av:X_RController_ActionList_URL>http://10.23.167.129:6095/</av:X_RController_ActionList_URL>

    </av:X_RController_Service>

    <av:X_RController_Service>

    <av:X_RController_ServiceType>data</av:X_RController_ServiceType>

    <av:X_RController_ActionList_URL>http://api.tv.duokanbox.com/bolt/3party/</av:X_RController_ActionList_URL>

    </av:X_RController_Service>

    </av:X_RController_ServiceList>

    </av:X_RController_DeviceInfo>

    </device>

    <URLBase>http://10.23.167.129:49152/</URLBase>

    </root>

    这里字段中最主要的是 serviceList 里的内容,它代表这个设备所能提供的 DLNA 服务。

      
    serviceId服务表示符,是服务实例的唯一标识。
    serviceType服务类型就是设备服务类型。
    SCPDURL服务描述文档地址。
    eventSubURL订阅该服务的URL。

    服务描述文档

    服务描述文档里的地址是需要我们通过当前设备 IP + SCPDURL 拼接而成,这里拼接需要注意分割符不要出现重复的/

    • http://10.23.167.129:49152/dlna/Render/RenderingControl_scpd.xml
    • http://10.23.167.129:49152/dlna/Render/AVTransport_scpd.xml

     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    <scpd xmlns="urn:schemas-upnp-org:service-1-0">

    <specVersion>

    <major>1</major>

    <minor>0</minor>

    </specVersion>

    <actionList>

    <action>

    <name>GetBlueVideoBlackLevel</name>

    <argumentList>

    <argument>

    <name>InstanceID</name>

    <direction>in</direction>

    <relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>

    </argument>

    <argument>

    <name>CurrentBlueVideoBlackLevel</name>

    <direction>out</direction>

    <relatedStateVariable>BlueVideoBlackLevel</relatedStateVariable>

    </argument>

    ...... // 内容太多

    <name>Brightness</name>

    <dataType>ui2</dataType>

    <allowedValueRange>

    <minimum>0</minimum>

    <maximum>100</maximum>

    <step>1</step>

    </allowedValueRange>

    </stateVariable>

    </serviceStateTable>

    </scpd>

    这里的话如果不是为了百分百实现 UPnP 规范,其实到也不用解析了,因为我们通过标准指令去操作大致是不会出问题的。比如如果设备提供了投屏功能,那么 setUrl,play,pause 等操作都是肯定支持的,也就无需再去获取投屏服务能提供那些功能了。

    获取

    DLNA 投屏相关简析

    控制 Control - SOAP

    上面说到我们通过解析服务描述文档可以获取设备上服务的操作指令和参数要求。当我们通过 HTTP 请求相对应地址就可以完成控制命令的发送。

    我们客户端与服务端进行交互使用的是 Simple Object Access Protocol,SOAP 简单对象访问协议。SOAP 与 SSDP 一样都是基于 HTTP 协议,不过区别在于 SOAP 的 Body 里是由内容的,里面存放的是想要操作的指令和参数,叫做 Action invocation。

    在 UPnP 中,把 SOAP 控制/响应信息分成 3 种:

    1、UPnP Action Request

    这里需要注意的是我们的 Post 请求头里面一定要带上 SOAPACTION 字段。

     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    <?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>

            <!--Body内部分根据不同动作不同-->

            <!--动作名称-->

            <u:actionName xmlns:u="urn:schemas-upnp-org:service:serviceType:v">

                <!--输入参数名称和值-->

                <argumentName>in arg values</argumentName>

                 <!--若有多个参数则需要提供-->

            </u:actionName>

        </s:Body>

    </s:Envelope>

    2、UPnP Action Response-Success

    如果服务端收到请求后成功执行后需要返回成功的回执,这个响应需要在 30 秒内完成,如果超过了可以先应答后续通过订阅事件机制返回。

    这是小米盒子设置播放地址以后的回执,这里注意小米盒子它不管你投递过去的视频播放地址能否播放他都会返回如下结果。

     

    1

    2

    3

    4

    5

    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">

        <s:Body>

            <u:PlayResponse xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">            </u:PlayResponse>

        </s:Body>

    </s:Envelope>

    3、UPnP Action Response-Error

    失败了也必须返回错误回执,里面有可能带了具体的错误码。错误码的具体含义可以详见官方文档。

    标准指令

    设置播放地址

    Post Header 里的 SOAPACTION 为 urn:upnp-org:serviceId:AVTransport#SetAVTransportURI。

     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    <?xml version='1.0' encoding='utf-8' standalone='yes' ?><s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">

        <s:Body>

            <u:SetAVTransportURI xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">             <InstanceID>0</InstanceID>

                <CurrentURI>This is url</CurrentURI>

                <CurrentURIMetaData>&lt;?xml version='1.0' encoding='utf-8' standalone='yes' ?&gt;&lt;DIDL-Lite xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/" xmlns:dlna="urn:schemas-dlna-org:metadata-1-0/"&gt;&lt;item id="id" parentID="0" restricted="0"&gt;&lt;dc:title&gt;This is title&lt;/dc:title&gt;&lt;upnp:artist&gt;unknow&lt;/upnp:artist&gt;&lt;upnp:class&gt;object.item.videoItem&lt;/upnp:class&gt;&lt;dc:date&gt;2018-09-06T18:23:54&lt;/dc:date&gt;&lt;res protocolInfo="http-get:*:*/*:*"&gt;This is url&lt;/res&gt;&lt;/item&gt;&lt;/DIDL-Lite&gt;

                </CurrentURIMetaData>

            </u:SetAVTransportURI>

        </s:Body>

    </s:Envelope>

    这里注意 CurrentURIMetaData 里又是一坨 XML,所以有部分数据会被转义掉,媒体信息内可以携带播放标题等内容。

     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    <?xml version='1.0' encoding='utf-8' standalone='yes' ?>

    <DIDL-Lite xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/" xmlns:dlna="urn:schemas-dlna-org:metadata-1-0/"><item id="id" parentID="0" restricted="0">

        <dc:title>This is title</dc:title>

        <upnp:artist>unknow</upnp:artist>

        <upnp:class>object.item.videoItem</upnp:class>

        <dc:date>2018-06-06T18:42:19</dc:date>

        <res protocolInfo="http-get:*:*/*:*">This is url</res>

        </item>

    </DIDL-Lite>

    播放 PlayPost Header 里的 SOAPACTION 为 urn:upnp-org:serviceId:AVTransport#Play。

     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    <?xml version="1.0" encoding="utf-8" standalone="no"?>

    <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>

    这里的话国产大部分 DLNA DMS 设备都是在 seturl 后自动播放,如果为了保证 seturl 后自动播放,可以在上面设置播放地址后在调用一次播放指令。

    跳转进度 SeekPost Header 里的 SOAPACTION 为 urn:upnp-org:serviceId:AVTransport#Seek。

     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    <?xml version="1.0" encoding="utf-8" standalone="no"?>

    <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>00:33:33</Target>

            </u:Seek>

        </s:Body>

    </s:Envelope>

    获取播放进度 GetPositionInfoPost Header 里的 SOAPACTION 为 urn:upnp-org:serviceId:AVTransport#GetPositionInfo。

     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    <?xml version="1.0" encoding="utf-8" standalone="no"?>

    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">

        <s:Body>

            <u:GetPositionInfo xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">

                <InstanceID>0</InstanceID>

                <MediaDuration />

            </u:GetPositionInfo>

        </s:Body>

    </s:Envelope>

    服务端返回

     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">

        <s:Body>

            <u:GetPositionInfoResponse xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">

                <Track>0</Track>

                <TrackDuration>00:00:00</TrackDuration>

                <TrackMetaData></TrackMetaData>

                <TrackURI></TrackURI>

                <RelTime>00:00:00</RelTime>

                <AbsTime>00:00:00</AbsTime>

                <RelCount>2147483647</RelCount>

                <AbsCount>2147483647</AbsCount>

            </u:GetPositionInfoResponse>

        </s:Body>

    </s:Envelope>

    这里注意小米设备返回的进度总时长总是0,需要我们特殊处理下,而天猫盒子就没有这个问题。

    DLNA 投屏相关简析

    除了这些指令外还有其他跟多的比如暂停,获取播放的媒体信息等功能。这些都是 AvTransport 服务提供的功能。而像 RenderingControl 服务又提供音量调整等功能,这里就不一一列举了。

    事件 Eventing - GENA

    服务运行时,可能改变有些状态变量的值,控制点需要的话就需要通过订阅或者鉴定多播来及时获取变化的信息,因为 DLNA 协议双方并没有保持一个长连接状态所以需要通过别的方式来相互通讯。

    DMC 如果想要获取事件信息有两种方式:

    1. 监听多播获取服务的描述文件中的状态变量 <stateVariable> 发生了变化并且该变量的 <sendEvents> 属性为 yes 时,将会产生一个事件消息。如该状态变量的 <multicast> 属性为 yes ,则会多播这个事件。如果是 no 则通过 GENA 方式传递。
    2. 服务双方遵循通用事件通知体系 General Event Notification Architecture GENA 协议,通过 HTTP 传递 XML 信息内容来交互。

    GENA 订阅请求

    事件订阅说白了就是给服务的 eventSubURL 发送一条包含回调 URL 和订阅期限的请求。回到上面 DDD 里,我拿到订阅地址并拼接起来。

    http://10.23.167.129:49152/_urn:schemas-upnp-org:service:AVTransport_event

     

    1

    2

    3

    4

    5

    SUBSCRIBE _urn:schemas-upnp-org:service:AVTransport_event HTTP/1.1

    HOST: http://10.23.167.129:49152

    CALLBACK: <http://10.23.167.222:233/callback>

    NT: upnp:event

    TIMEOUT: Second-3600

    1. SUBSCRIBE + publisher path + HTTP/1.1SUBSCRIBE 表示开始订阅或者续订,publisher path 发布路径就是 eventSubURL。
    2. HOST就是设备 IP 和端口,如果端口没有默认是 80。
    3. CALLBACK控制端的回调地址,这里可以看到如果想要实现订阅,等于双方都需要一个 HttpServer,比如 Java 上的 DLNA 库 Cling,它内部集成 Jetty 做 HttpServer。所以如果不像加没必要的依赖则完全可以不用实现订阅功能。
    4. NTGENA 规定标头。通知类型必须为 upnp:event。
    5. TIMEOUT订阅期限

    订阅成功响应

    如果订阅成功,则服务 30s 内返回如下的响应。其中 SID 为订阅标识符,必须以uuid开头。订阅成功后需要保存,后续续订和取消订阅均需要提供该标识符。此外还需要保存订阅期限 TIMEOUT: Second-3600

     

    1

    2

    3

    4

    5

    HTTP/1.1 200 OK

    Date: Tue, 12 Jun 2018 13:22:25 GMT

    Server: Linux/3.10.61+, UPnP/1.0, Portable SDK for UPnP devices/1.6.13

    SID: uuid:8bd3-44bd-bb62-e35241

    TIMEOUT: Second-3600

    1. Http 响应码
    2. 响应时间
    3. 设备系统等信息
    4. SIDGENA 规定标头,订阅标识符,必须以 uuid 开头。
    5. TIMEOUT订阅期限,按照标准应大于 1800 秒。

    订阅失败响应

    订阅失败将返回错误吗。比如 400 表示错误的标头之类。

    续订

    续订越订阅请求的区别就是:

    • 续订没有 Callback 和 NT 字段。
    • 续订需要订阅成功的那个 SID。

    取消订阅

     

    1

    2

    3

    UNSUBSCRIBE _urn:schemas-upnp-org:service:AVTransport_event HTTP/1.1

    HOST: http://10.23.167.129:49152

    SID: uuid:8bd3-44bd-bb62-e35241

    接收订阅事件

    我们订阅了事件以后,一旦有状态变化后,服务单会通过回调地址反响请求我们。所以在我们的 HttpServer 里需要处理接收回调的逻辑。

     

    1

    2

    3

    4

    5

    6

    7

    8

    NOTIFY /callback HTTP/1.1

    Host: 10.23.167.222:233

    Content-Length: 325

    Content-Type: text/xml"

    NT: upnp:event

    NTS: upnp:propchange  

    SID: uuid:8bd3-44bd-bb62-e35241

    SEQ: 1

    1. NOTIFY + 请求订阅时的回调地址 + HTTP/1.1
    2. 订阅方的 Host
    3. 消息体内 XML 内容的大小
    4. 消息体内 XML 的格式,必须为 text/xml。
    5. NTGENA标头,必须是 upnp:event。
    6. NTSGENA 标头,必须是 upnp:propchange。
    7. SIDGENA 标头,订阅标识符。
    8. SEQUPnP 标头,事件编号。初始化事件消息必须为零。发送给特定订阅者时每条消息必须加一,长度为8字节,超过则重置为一。

    消息体

     

    1

    2

    3

    4

    5

    6

    <?xml version="1.0" encoding="UTF-8"?>

    <e:propertyset xmlns:e="urn:schemas-upnp-org:event-1-0">

        <e:property>

            <variableName>new values</variableName>

        </e:property>

    </e:propertyset>

    1. 命名空间必须为 urn:schemas-upnp-org:event-1-0。
    2. e:property 里是真正的回调信息。

    播放的回调

     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    <?xml version="1.0" encoding="UTF-8"?>

    <e:propertyset xmlns:e="urn:schemas-upnp-org:event-1-0">

        <e:property>

            <LastChange>

                <Event xmlns="urn:schemas-upnp-org:metadata-1-0/AVT/">

                    <InstanceID val="0">

                        <TransportState val="PLAYING"/>

                    </InstanceID>

                </Event>

            </LastChange>

        </e:property>

    </e:propertyset>

    停止的回调

     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    <?xml version="1.0" encoding="UTF-8"?>

    <e:propertyset xmlns:e="urn:schemas-upnp-org:event-1-0">

        <e:property>

            <LastChange>

                <Event xmlns="urn:schemas-upnp-org:metadata-1-0/AVT/">

                    <InstanceID val="0">

                        <TransportState val="STOPPED"/>

                    </InstanceID>

                </Event>

            </LastChange>

        </e:property>

    </e:propertyset>

    代码实现注意点

    整体 DLNA 的逻辑从上到下并没有太复杂的地方,我们主要的工作是在实现对不同 DLNA 服务端设备的兼容上,因为官方并没有给出标准的实现代码,各 DLNA 设备生产厂家对协议的实现上都是不同的,我们需要建立在大量 DLNA 设备的实际测试上才能保证手机控制功能的正常。

    • 设备存活时间不可靠我们不能依赖于 DLNA 设备的缓存时间,我们必须实现一个本地设备缓存机制,当多少时间内没有收到 alive 或者我们发出的搜索消息没有收到回应时,应及时移除过期设备。
    • 设备发现不了
      1. DLNA 设备的发现跟大部分零配置网络协议一样是基于 UDP 多播的,在局域网内 UDP 包有可能被路由器拦截导致发现不了。
      2. 如果手机种同时打开2个 DMC 开启设备搜索,有可能导致端口被占用而无法收到消息。
    • seturl 失败电视端返回 501 失败,注意 Sony 上一定要加 protocol 内容。
    • 小米设备上重复 seturl 导致第二次无法播放解决方式是在描述文件中我们能知道投屏的 DLNA 设备是小米,可以在判断是小米设备的时候,seturl 之前先 stop 一下,这样不管之前有没有视频在播放都不会影响下一次视频播放。
    • DLNA 理论上支持视频,音频,图像等投送,但限于不同设备的实现上的区别,目前尝试了在天猫盒子上是都可以显示的。
    • 理论上只要多媒体投送到 DLNA 设备上之后的一切都已经跟 DMC 无关了,包括视频播放卡顿,无法播放之类的。这里注意一下 UA 问题,很多盒子播放器的 UA 千奇百怪,没有或者变成了 iOS,这样可以会导致视频播放的问题。
    • DMS 向服务端发送指令时,POST 的头里一定要加上 SOAPACTION。
    • 为了干净的代码依赖,不加入 HttpServer 将导致无法订阅事件,这里影响最大的是播放进度获取和盒子端的视频播放暂停状态获取。所以我们需要实现一个定时轮询播放时长和状态的任务。
    • 小米设备上我们获取的播放时长信息里没有视频总时长,前端显示就需要特殊处理。
    展开全文
  • UPNP音频播放器 它是什么 ? 这是一个播放通过 UPnP(“通用即插即用”)控制的音频的应用程序 - 旨在在 Raspberry PI 上运行。 没有 GUI(即它的“无头”)。 它通过 UPnP 控制点进行控制,该控制点可以在 Android...
  • upnp-dlna-播放器 该项目是使用 upnp-dlna 编写简单媒体播放器的第一个 alpha 方法。 这个项目使用 Swing 作为 UI。 ##什么在起作用(大部分时间) 将本地文件拖放到播放列表中,也是递归的 - 对于播放列表条目...
  • UPNP实现端口映射的windows版代码
  • 本文为你讲解如何使用UPnP协议实现网络设备自动配置路由器进行端口映射。
  • peer-upnp是实现所述的UPnP协议的Node.js模块。 设置 使用npm install peer-upnp来安装模块。 运行binary light示例: 使用node node_modules/peer-upnp/test/binary-light-device.js来创建和发布带有SwitchPower...
  • minidlna:MiniDLNA守护程序是UPnP-AV和DLNA服务,可为网络上的兼容客户端提供多媒体内容
  • UPnP测试程序

    2017-12-21 19:38:07
    用于测试windows系统至外网的UPnP设置是否完全通过。 适合检测网络映射状态。
  • UPNP 测试工具 它能做什么 upnptool 将检查您的路由器/调制解调器/gw 是否完全兼容 UPNP。 测试有4个步骤。 第 1 步:在您的网络上寻找合适的网关。 基本上是对 UDP 端口 1900 进行多播并等待任何路由器应答。 第 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,415
精华内容 3,766
关键字:

UPNP