我试图使用python3 zeep包执行onvif命令,并使大多数命令正常工作。但由于我是新来的,不熟悉onvif (特别是PTZ ),我还没能让它开始工作。我会提供我试过的代码:
import time
from zeep import Client
from zeep.wsse.username import UsernameToken
ptz_wsdl = "D:\Projects\camera\zeep\wsdl\ptz.wsdl"
ip = "192.168.1.12"
port = "2020"
username = "onviftest"
password = "onviftest"
xaddr = "http://"+ip+":"+port+"/onvif/ptz_service"
ptz_client = Client(wsdl=ptz_wsdl, wsse=UsernameToken(username, password, use_digest=True))
ptz = ptz_client.create_service("{http://www.onvif.org/ver20/ptz/wsdl}PTZBinding", xaddr)
token = ptz.GetConfigurations()[0]["token"]
node = ptz.GetNodes()[0]
move = ptz.ContinuousMove(token, velocity)
time.sleep(5)
print(move)和GetNodes()输出:
{
'Name': 'PTZNODE',
'SupportedPTZSpaces': {
'AbsolutePanTiltPositionSpace': [
{
'URI': 'http://www.onvif.org/ver10/tptz/PanTiltSpaces/PositionGenericSpace',
'XRange': {
'Min': -170.0,
'Max': 170.0
},
'YRange': {
'Min': -32.0,
'Max': 35.0
}
}
],
'AbsoluteZoomPositionSpace': [],
'RelativePanTiltTranslationSpace': [
{
'URI': 'http://www.onvif.org/ver10/tptz/PanTiltSpaces/TranslationGenericSpace',
'XRange': {
'Min': -170.0,
'Max': 170.0
},
'YRange': {
'Min': -32.0,
'Max': 35.0
}
}
],
'RelativeZoomTranslationSpace': [],
'ContinuousPanTiltVelocitySpace': [
{
'URI': 'http://www.onvif.org/ver10/tptz/PanTiltSpaces/VelocityGenericSpace',
'XRange': {
'Min': -1.0,
'Max': 1.0
},
'YRange': {
'Min': -1.0,
'Max': 1.0
}
}
],
'ContinuousZoomVelocitySpace': [],
'PanTiltSpeedSpace': [
{
'URI': 'http://www.onvif.org/ver10/tptz/PanTiltSpaces/GenericSpeedSpace',
'XRange': {
'Min': 0.0,
'Max': 0.0
}
}
],
'ZoomSpeedSpace': [],
'Extension': None,
'_attr_1': None
},
'MaximumNumberOfPresets': 8,
'HomeSupported': True,
'AuxiliaryCommands': [],
'Extension': None,
'token': 'PTZNODETOKEN',
'FixedHomePosition': None,
'_attr_1': {
}
}如你所见,这款相机支持连续移动.我的代码不完整(速度对象需要x、y和空间),因为我尝试了各种创建速度对象的方法,结果总是有一些错误。可以在代码中添加什么来使其工作?我的python可能不如我还在学习,因为我只知道javascript,但由于我的ST板,我现在不得不为onvif命令编写python。
如有任何帮助,我们将不胜感激:)
更新:我尝试了下面的代码,没有移动的相机和区域没有任何。
from zeep import Client
from zeep.wsse.username import UsernameToken
ptz_wsdl = "D:\Projects\camera\zeep\wsdl\ptz.wsdl"
media_wsdl = "D:\Projects\camera\zeep\wsdl\media.wsdl"
ip = "192.168.1.12"
port = "2020"
username = "onviftest"
password = "onviftest"
xaddr = "http://"+ip+":"+port+"/onvif/ptz_service"
media_client = Client(wsdl=media_wsdl, wsse=UsernameToken(username, password, use_digest=True))
media = media_client.create_service("{http://www.onvif.org/ver10/media/wsdl}MediaBinding", xaddr)
ptz_client = Client(wsdl=ptz_wsdl, wsse=UsernameToken(username, password, use_digest=True))
ptz = ptz_client.create_service("{http://www.onvif.org/ver20/ptz/wsdl}PTZBinding", xaddr)
profile = media.GetProfiles()[0]
ptz_config = ptz.GetConfigurationOptions(profile.PTZConfiguration.token)
velocity = {
"PanTilt": {
"x": ptz_config.Spaces.ContinuousPanTiltVelocitySpace[0].XRange.Max,
"y": ptz_config.Spaces.ContinuousPanTiltVelocitySpace[0].YRange.Max,
"space": ptz_config.Spaces.ContinuousPanTiltVelocitySpace[0].URI,
},
# "Zoom": None
}
res = ptz.ContinuousMove(profile.token, velocity )
print(res)发布于 2022-06-10 21:13:09
经过多次尝试,我才能让它发挥作用:
from zeep import Client
from zeep.wsse.username import UsernameToken
ptz_wsdl = "D:\Projects\camera\zeep\wsdl\ptz.wsdl"
media_wsdl = "D:\Projects\camera\zeep\wsdl\media.wsdl"
ip = "192.168.1.12"
port = "2020"
username = "onviftest"
password = "onviftest"
xaddr = "http://"+ip+":"+port+"/onvif/ptz_service"
media_client = Client(wsdl=media_wsdl, wsse=UsernameToken(
username, password, use_digest=True))
media = media_client.create_service(
"{http://www.onvif.org/ver10/media/wsdl}MediaBinding", xaddr)
ptz_client = Client(wsdl=ptz_wsdl, wsse=UsernameToken(
username, password, use_digest=True))
ptz = ptz_client.create_service(
"{http://www.onvif.org/ver20/ptz/wsdl}PTZBinding", xaddr)
profile = media.GetProfiles()[0]
ptz_config = ptz.GetConfigurationOptions(profile.PTZConfiguration.token)
velocity = {
"PanTilt": {
"x": ptz_config.Spaces.ContinuousPanTiltVelocitySpace[0].XRange.Min,
"y": ptz_config.Spaces.ContinuousPanTiltVelocitySpace[0].YRange.Min,
},
}
ptz.ContinuousMove(profile.token, Velocity=velocity)发布于 2022-06-10 12:06:51
希望这能有所帮助
ptz_request = {"ProfileToken": media_profile.PTZConfiguration.token,
"Velocity": {"PanTilt": {"y": 0.0,
"x": 0
},
"Zoom": -1.0
},
}
ptz.ContinuousMove(ptz_request)https://stackoverflow.com/questions/72567143
复制相似问题