基于DLNA实现iOS,Android投屏:SOAP控制设备

UPdP网络中,控制点和服务之间使用简单对象访问协议(Simple Object Access Protocol,SOAP)

根据基于DLNA实现iOS,Android投屏:SSDP发现设备收到设备描述文档(DDD)和服务描述文档(SDD),通过解析DDD获取 <controlURL> 控制点可以知道该设备上某个服务的控制点地址。再通过解析 DDD 中 <action> 中的 <name><argumentList> 获取该服务动作的动作名称,参数要求。控制点向 controlURL 发出服务调用信息,表明动作名称和相应参数来调用相应的服务。

SOAP简单对象访问协议

控制点和服务之间使用简单对象访问协议(Simple Object Access Protocol,SOAP)的格式。SOAP 的底层协议一般也是HTTP。在 UPnP 中,把 SOAP 控制/响应信息分成 3 种: UPnP Action Request、UPnP Action Response-Success 和 UPnP Action Response-Error。SOAP 和 SSDP 不一样,所使用的 HTTP 消息是有 Body 内容,Body 部分可以写想要调用的动作,叫做 Action invocation,可能还要传递参数,如想播放一个网络上的视频,就要把视频的URL传过去;服务收到后要 response ,回答能不能执行调用,如果出错则返回一个错误代码。

动作调用(UPnP Action Request)

使用POST方法发送控制消息的格式如下

  • control URL: 基于DLNA实现iOS,Android投屏:SSDP发现设备 中提到的 设备描述文件urn:upnp-org:serviceId:AVTransport 服务的 <controlURL>
  • HOST: 上述服务器的根地址和端口号。
  • actionName: 需要调用动作的名称,对应相应服务的 服务描述文件<SCPDURL> 中的 <action><name> 字段。
  • argumentName: 输入参数名称,对应相应服务的 服务描述文件<SCPDURL> 中的 <action> <argument> <name> 字段。
  • in arg values: 输入参数值,具体的可以通过 ,可以通过 服务描述文件<SCPDURL> <action> <relatedStateVariable> 提到的状态变量来得知值得类型。
  • urn:schemas-upnp-org:service:serviceType:v:对应该 设备描述文件 相应服务的 <serviceType 字段。

动作响应(UPnP Action Response-Succes)

收到控制点发来的动作调用请求后,设备上的服务必须执行动作调用。,并在 30s 内响应。如果需要超过 30s 才能完成执行的动作,则可以先返回一个应答消息,等动作执行完成再利用事件机制返回动作响应。

  • actionNameResponse: 响应的动作名称
  • arugumentName: 当动作带有输出变量时必选,输出变量名称
  • out arg values: 输出变量名称值

动作错误响应(UPnP Action Response-Succes)

如果处理动作过程中出现错误,则返回一个一下格式的错误响应。

  • faultcode: SOAP规定使用元素,调用动作遇到的错误类型,一般为s:Client。
  • faultstring: SOAP规定使用元素,值必须为 UPnPError。
  • detail: SOAP规定使用元素,错误的详细描述信息。
  • UPnPError: UPnP规定元素。
  • errorCode: UPnP规定元素,整数。详见下表。
  • errorDescription: UPnP规定元素,简短错误描述。
errorCode errorDescription 描述
401 Invalid Action 这个服务中没有该名称的动作
402 Invalid Args 参数数据错误 not enough in args, too many in arg, no in arg by that name, one or more in args 之一
403 Out of Sycs 不同步
501 Action Failed 可能在当前服务状态下返回,以避免调用此动作
600 ~ 699 TBD 一般动作错误,由 UPnP 论坛技术委员会定义
700 ~ 799 TBD 面向标准动作的特定错误,由 UPnP 论坛工作委员会定义
800 ~ 899 TBD 面向非标准动作的特定错误,由 UPnP 厂商会定义

投屏基本命令及其响应

所有命令以发向 基于DLNA实现iOS,Android投屏:SSDP发现设备 发现的设备。除了网址以外,其余部分均不需要修改。

所有动作请求使用 POST 请求发送,并且请求Header均如下所示,其中:

  • control URL: 基于DLNA实现iOS,Android投屏:SSDP发现设备 中提到的 设备描述文件urn:upnp-org:serviceId:AVTransport 服务的 <controlURL>
  • HOST: 上述服务器的根地址和端口号。
  • urn:schemas-upnp-org:service:serviceType:v:对应相应设备的 设备描述文件 相应服务的 <serviceType 字段。
  • actionName: 需要调用动作的名称,对应相应服务的 服务描述文件<SCPDURL> 中的 <action><name> 字段。

下面请求和响应均忽略Header,参数列表中列出Header的SOAPACTION值

设置播放资源URI

动作请求

设置当前播放视频动作统一名称为 SetAVTransportURI 。 需要传递参数有

  • InstanceID:设置当前播放时期时为 0 即可。
  • CurrentURI: 播放资源URI
  • CurrentURIMetaData: 媒体meta数据,可以为空
  • Header_SOAPACTION: “urn:upnp-org:serviceId:AVTransport#SetAVTransportURI”

有些设备传递播放URI后就能直接播放,有些设备设置URI后需要发送播放命令,可以在接收到 SetAVTransportURIResponse 响应后调用播放动作来解决。

响应

播放

动作请求

播放视频动作统一名称为 Play 。 需要传递参数有

  • InstanceID:设置当前播放时期时为 0 即可。
  • Speed:播放速度,默认传 1 。
  • Header_SOAPACTION: “urn:upnp-org:serviceId:AVTransport#Pause”

响应

暂停

动作请求

暂停视频动作统一名称为 Pause 。 需要传递参数有

  • InstanceID:设置当前播放时期时为 0 即可。
  • Header_SOAPACTION: “urn:upnp-org:serviceId:AVTransport#Pause”

响应

获取播放进度

动作请求

获取播放进度动作统一名称为 GetPositionInfo 。 需要传递参数有

  • InstanceID:设置当前播放时期时为 0 即可。
  • MediaDuration: 可以为空。
  • Header_SOAPACTION: “urn:upnp-org:serviceId:AVTransport#MediaDuration”

响应

获取播放进度响应中包含了比较多的信息,其中我们主要关心的有一下三个:

  • TrackDuration: 目前播放视频时长
  • RelTime: 真实播放时长
  • AbsTime: 相对播放时长

注:目前为止还没发现 RelTime AbsTime 和不一样的情况,选用 RelTime 就ok。

跳转至特定进度或视频

动作请求

跳转到特定的进度或者特定的视频(多个视频播放情况),需要调用 Seek 动作,传递参数有:

  • InstanceID: 一般为 0 。
  • Unit:REL_TIME(跳转到某个进度)或 TRACK_NR(跳转到某个视频)。
  • Target: 目标值,可以是 00:02:21 格式的进度或者整数的 TRACK_NR。
  • Header_SOAPACTION: “urn:upnp-org:serviceId:AVTransport#Seek”

响应

iOS实现

需要用到库

  1. AEXML – 轻量 XML 库,用于构造和解析XML

构造动作XML

首先利用 AEXML 构造动作 XML 部分。由于所有动作结构相似,写了个构造方法

根据不同动作构造 XML ,比如 传递URI播放动作

发送动作请求

解析响应

解析请求响应

1 2 收藏 评论

关于作者:BrikerMan

简介还没来得及写 :) 个人主页 · 我的文章

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部