PullMessages()始终返回“InvalidArgVal”

时间:2015-10-21 13:19:44

标签: events onvif

首先我创建一个PullPoint订阅然后订阅但是当我在响应中发送给uri时,PullMessages()命令总是得到相同的响应。你能看出问题是什么吗?

我的PullMessages()请求 -

<SOAP-ENV:Header>
<wsse:Security SOAP-ENV:mustUnderstand="true"><wsse:UsernameToken>
<wsu:Id="Id"><wsse:Username>admin</wsse:Username>
<wsse:Password=Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">cCMdBA6WisDrtJItFsSEbiQnifc=</wsse:Password>
<wsse:Nonce>HYwnVsldpikr+h8zuGsT9QTw8ec=</wsse:Nonce>
<wsu:Created>2015-10-21T12:59:09Z</wsu:Created></wsse:UsernameToken></wsse:Security>
<wsa5:Action SOAP-ENV:mustUnderstand="true">http://www.onvif.org/ver10/events/wsdl/PullPointSubscription/PullMessagesRequest</wsa5:Action></SOAP-ENV:Header>
<SOAP-ENV:Body><tev:PullMessages><tev:Timeout>PT00H00M05S</tev:Timeout>
<tev:MessageLimit>1</tev:MessageLimit></tev:PullMessages>
</SOAP-ENV:Body></SOAP-ENV:Envelope>

来自设备的响应 -

<s:Header>
<wsa:Action>http://www.w3.org/2005/08/addressing/soap/fault</wsa:Action></s:Header>
<s:Body><s:Fault><s:Code><s:Value>env:Sender</s:Value>
<s:Subcode><s:Value>ter:InvalidArgVal</s:Value></s:Subcode></s:Code>
<s:Reason><s:Text xml:lang="en">Argument Value Invalid</s:Text></s:Reason>
<s:Node>http://www.w3.org/2003/05/soap-envelope/node/ultimateReceiver</s:Node>
<s:Role>http://www.w3.org/2003/05/soap-envelope/role/ultimateReceiver</s:Role>
<s:Detail><wsrf-r:ResourceUnknownFault><wsrf-bf:Timestamp>2015-10-21T12:58:50.937248Z</wsrf-bf:Timestamp></wsrf-r:ResourceUnknownFault></s:Detail>
</s:Fault></s:Body></s:Envelope>

P.S。 - 如果您需要更多信息,请不要犹豫

3 个答案:

答案 0 :(得分:1)

问题可能是因为您的订阅期限已过期。

如何检查: 在wireshark中,看到几个初始的第一个PullMessage请求被成功返回或超时。 (您还可以通过在PullMessage响应对象中放置打印来检查响应)。 跟踪PullMessage响应中提供的终止时间参数。 稍后当您发送请求时,您可能会将其发送给过期的订阅管理器,因此相机会为您提供“InvalidArg”。

如何解决这个问题: 请记住,wsdl文档中的PullMessage描述并未说明每次收到PullMessage时相机都必须续订订阅。 大多数安讯士相机从未更新过它。因为他们严格遵循onvif标准。 那么,你可以做的是你可以使用订阅通知RENEW方法。您可以保留一个小于PullPointSubscription持续时间的计时器。在此计时器到期时,您可以发送BaseNotification方法的RENEW请求。这将更新PullPoint订阅管理器的订阅持续时间。

答案 1 :(得分:0)

问题在于我没有填补&#39;标题中的属性。

我发现最好的方法是观看来自&#34; Onvif设备管理器&#34; 在wireshark中查看我的代码中是否有不匹配的东西。

答案 2 :(得分:0)

在我的情况下,问题是由未完全填写的请求标题引起的,这类似于ArielY的情况。

工作请求必须与此类似:

POST /onvif/services HTTP/1.1
Host: >IpAddress<
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 930

<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
  <s:Header>
    <a:Action s:mustUnderstand="1">http://www.onvif.org/ver10/events/wsdl/PullPointSubscription/PullMessagesRequest</a:Action>
    <a:MessageID>urn:uuid:27577591-b1f2-4750-a705-5036364fefc9</a:MessageID>
    <Security>...</Security>
    <a:ReplyTo>
      <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
    </a:ReplyTo>
    <SubscriptionId a:IsReferenceParameter="true" xmlns="http://www.axis.com/2009/event" xmlns:dom0="http://www.axis.com/2009/event">41</SubscriptionId>
    <a:To s:mustUnderstand="1">http://>IpAddress</onvif/services</a:To>
  </s:Header>
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <PullMessages xmlns="http://www.onvif.org/ver10/events/wsdl">
      <Timeout>PT20S</Timeout>
      <MessageLimit>2</MessageLimit>
    </PullMessages>
  </s:Body>
</s:Envelope>

似乎只有可以省略的是ReplyTo标签。 起初我省略了Action,MessageId,ReplyTo和SubscriptionId。

编辑:对于某些摄像机,只能存在SubscriptionId。