首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Zeep中使用OnVif PullPoint服务

在Zeep中使用OnVif PullPoint服务
EN

Stack Overflow用户
提问于 2018-12-31 16:33:33
回答 2查看 1.5K关注 0票数 1

我很难尝试订阅标准IP相机中的OnVif拉点服务。

我使用的SOAP客户机是Zeep https://python-zeep.readthedocs.io/en/master/index.html

Zeep似乎构建了错误的xml数据,但我可能错了(由于我对SOAP的了解有限)。让我们看看这个例子:

代码语言:javascript
复制
from zeep.client import Client, CachingClient, Settings
from zeep.wsse.username import UsernameToken
import zeep.helpers

import logging.config

# # Put Zeep into verbose mode
logging.config.dictConfig({
    'version': 1,
    'formatters': {
        'verbose': {
            'format': '%(name)s: %(message)s'
        }
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'verbose',
        },
    },
    'loggers': {
        'zeep.transports': {
            'level': 'DEBUG',
            'propagate': True,
            'handlers': ['console'],
        },
    }
})

ip="192.168.0.134"; user="admin"; passwd="123456"; port=80 # My home cam 1.  Now you know its username and password.  :)

settings = Settings()
settings.strict = False
settings.xml_huge_tree = True

# # WSDL File
url = "https://www.onvif.org/ver10/events/wsdl/event.wsdl"

# # *** Events Service ***
xaddr = "http://"+ip+"/onvif/events_service"
print("creating a soap client with url = ", url)
zeep_client_events = CachingClient(wsdl=url, wsse=UsernameToken(user, passwd, use_digest=True), settings=settings)
print("soap client created")
print("binding to service")
ws_client_events = zeep_client_events.create_service("{http://www.onvif.org/ver10/events/wsdl}EventBinding", xaddr)
print("service OK")

# # *** PullPoint Service ***
xaddr = "http://"+ip+"/onvif/events_service"
print("creating a soap client with url = ", url)
zeep_client_pp = CachingClient(wsdl=url, wsse=UsernameToken(user, passwd, use_digest=True), settings=settings)
print("soap client created")
print("binding to service")
ws_client_pp = zeep_client_pp.create_service("{http://www.onvif.org/ver10/events/wsdl}PullPointSubscriptionBinding", xaddr)
print("service bound")

res = ws_client_events.CreatePullPointSubscription()

# # could see the namespaces like this:
# zeep_client_pp.namespaces

# # could create PullMessages' parameters like this:
# pm = zeep_client_pp.get_element("ns7:PullMessages")()

# So, this call never works
ws_client_pp.PullMessages(MessageLimit=1, Timeout="PT1S")

根据摄像机的不同,这总是导致“没有响应的远程结束关闭连接”,或者其他情况下,服务器发送一条该值无效的消息。

当将Zeep放入详细模式并检查SOAP消息体(也用Wireshark确认了这一点)时,如下所示:

代码语言:javascript
复制
<soap-env:Body>
    <ns0:PullMessages xmlns:ns0="http://www.onvif.org/ver10/events/wsdl">
        <ns0:Timeout>P%P</ns0:Timeout>
        <ns0:MessageLimit>1</ns0:MessageLimit>
    </ns0:PullMessages>
</soap-env:Body>

因此,字符串"PT1S“似乎没有进入消息体,但是仍然存在"P%P”!

如何说服泽普在适当的时间内插入正确的时间?

请不要告诉我用“”。当然,我先这样做了,然后最后提出了这个问题(用于pullpoint服务的的例子不起作用)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-26 15:39:56

必须属于isodate.Duration.类这解决了问题:

代码语言:javascript
复制
import isodate
Timeout = isodate.Duration(seconds=10)
票数 2
EN

Stack Overflow用户

发布于 2019-06-18 09:18:23

注意,events.wsdl中使用的日期时间似乎是XML类型。在Python中,时间增量从datetime起就支持它。

代码语言:javascript
复制
import datetime
timeout = datetime.timedelta(seconds=100)

ws_client_pp.PullMessages(MessageLimit=1, Timeout=timeout)

以上应用于zeep,生成正确的请求。100 s是PT1M40S.

无论如何,我无法使用我的相机前进,但现在的持续时间是以适当的方式设置的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53989525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档