【问题标题】:SOAP implementation of UPnP architectureUPnP 架构的 SOAP 实现
【发布时间】:2016-10-07 05:15:07
【问题描述】:

我正在尝试实现 UPnP AV 控制点。我完成了架构的描述阶段。为了从浏览操作中获取服务器的内容,我使用如下 CURL 命令。

curl -o response.xml -H "Host: 192.168.1.47:2869" -H "Content-Type: text/xml; Charset="UTF-8"" -H "SOAPAction: "http://192.168.1.47:2869/upnphost/udhisapi.dll?content=uuid:67240e36-10e0-45f6-9c4b-e18cdd53360e"" -d @request.xml -X POST http://192.168.1.47:2869/upnphost/udhisapi.dll?control=uuid:99261858-3c45-41b5-87fd-3f30b4700005+urn:upnp-org:serviceId:ContentDirectory

SOAPAction 下的 URL 是服务器的服务描述 url。 POST 后的 URL 是服务器的控制 URL。

我的 request.xml 如下:

   <?xml version = "1.0" encoding="utf-8"?>
   <s:Envelope
        xmlns:s = "http://schemas.xmlsoap.org/soap/envelope">
        s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding">
        <s:Body>
           <u:Browse xmlns:u="urn:schemas-upnp-org:Service:ContentDirectory:1">
                   <ObjectID>"0"</ObjectID>
                   <BrowseFlag>"BrowseDirectChildren"</BrowseFlag>
                   <Filter>"*"</Filter>
                   <StartingIndex>0</StartingIndex>
                   <RequestedCount>3</RequestedCount>
                   <SortCriteria>""</SortCriteria>

           </u:Browse>
    </s:Body>
    </s:Envelope>

`

我得到的响应 XML 不包含我需要的正文内容。响应xml是:

    <s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <s:Body>
       <s:Fault>
           <faultcode>s:Client</faultcode>
           <faultstring>UPnPError</faultstring>
           <detail>
              <UPnPError>
                  <errorCode>401</errorCode>
                   <errorDescription>Invalid Action</errorDescription>
              </UPnPError>
           </detail>
    </s:Fault>
    </s:Body>
    </s:Envelope>

如何获取服务器的内容。

【问题讨论】:

    标签: xml linux curl soap upnp


    【解决方案1】:

    Soapaction 应该是您要调用的操作的完全指定标识符。您正在向服务描述发送 URL。以下应该会更好:

    SOAPACTION: "urn:schemas-upnp-org:service:ContentDirectory:1#Browse"
    

    您的 xml 也可能无效,尖括号似乎不匹配。我还会检查 Browse 参数值的引用:我相信它们都不应该被引用。

    【讨论】:

    • 我改变了soapaction。现在我的错误是无效的参数。
    • 查看用于包围s:envelope 的“”及其属性。似乎有一个额外的'>'。
    • 检查 ContentDirectory 规范:我猜 BrowseFlag 值(在您的情况下为 BrowseDirectChildren)不应被引用,因为它不是字符串而是枚举。
    • @jku BrowseFlag 是一个字符串。在这种情况下,枚举只是一个带有 allowedValueList 的字符串,它定义了一组可接受的字符串输入。
    • simonc 是正确的。我猜它看起来不对的原因是不应该引用任何变量值。
    猜你喜欢
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-03
    • 2015-07-08
    相关资源
    最近更新 更多