参考リンク:
ONVIFセキュリティカメラに基づいてA、のpython3制御
セキュリティカメラを使用してTP-LINK
インストール
python3では、インストールがあるpip install onvif-zeep
コントロールを達成するために
第二に、実現
カメラは、次のを持っていることを確認する能力を持って、それはもはやデバイスかどうかを判断する能力を持っていません。
機器、制御機器、カメラ映像コンテンツ解析へのアクセスへのアクセスを実現
行われる変更、である、あなたのカメラのユーザー名とパスワードを入力
デフォルトのアカウントとパスワードONVIF
admin
と9999
(書いていない空字符串
)を実行することができます。。。
class PlcVisionSDK:
def __init__(self, kwargs_dict):
self.name = ' admin' # 自己设备的名称
self.password = '9999 ' # 自己设备的密码
self.mul_ip = "239.255.255.250"
self.mul_port = 3702
self.kwargs_dict = kwargs_dict
def zeep_pythonvalue(self, xmlvalue):
return xmlvalue
1、機器が発見されました
使用UDPマルチキャスト、IPカメラへのアクセスおよびPORT
def discovery_dev(self):
local_ip = self.kwargs_dict['local_ip']
xml_str = """
<?xml version="1.0" encoding="utf-8"?>
<Envelope xmlns:dn="http://www.onvif.org/ver10/network/wsdl" xmlns="http://www.w3.org/2003/05/soap-envelope">
<Header>
<wsa:MessageID xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing">
uuid:a8098c1a-f86e-11da-bd1a-00112444be1e'
</wsa:MessageID>
<wsa:To xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing">
urn:schemas-xmlsoap-org:ws:2005:04:discovery
</wsa:To>
<wsa:Action xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing">
http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe
</wsa:Action>
</Header>
<Body>
<Probe xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/ws/2005/04/discovery">
<Types>
dn:NetworkVideoTransmitter
</Types>
<Scopes />
</Probe>
</Body>
</Envelope>
"""
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 255)
s.bind((local_ip, self.mul_port))
s.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP,
socket.inet_aton(self.mul_ip) + socket.inet_aton(local_ip))
s.setblocking(False)
s.sendto(xml_str.encode(), (self.mul_ip, self.mul_port))
while True:
data, address = s.recvfrom(65535)
content = data.decode()
a = re.search(re.compile(r"<wsdd:XAddrs>(.*?)</wsdd:XAddrs>", re.S), str(content))
if a:
b = a.group()
ip, port = b.split('/')[2].split(':')[0: 2]
return str(ip), port
図2に示すように、絶対的な移動
この方法は、AbsoluteMoveに対応します
得られたIPとポートによれば、絶対的な制御動作。
def move(self):
# 需要的参数
plc_ip = self.kwargs_dict['plc_ip']
plc_port = int(self.kwargs_dict['plc_port'])
pan = self.kwargs_dict['pan'] if self.kwargs_dict.get('pan') else 0
tilt = self.kwargs_dict['tilt'] if self.kwargs_dict.get('tilt') else 0
zoom = self.kwargs_dict['zoom'] if self.kwargs_dict.get('zoom') else 0
pan_speed = self.kwargs_dict['pan_speed'] if self.kwargs_dict.get('pan_speed') else 1
tilt_speed = self.kwargs_dict['tilt_speed'] if self.kwargs_dict.get('tilt_speed') else 1
zoom_speed = self.kwargs_dict['zoom_speed'] if self.kwargs_dict.get('zoom_speed') else 1
mycam = ONVIFCamera(plc_ip, plc_port, self.name, self.password)
media = mycam.create_media_service()
ptz = mycam.create_ptz_service()
zeep.xsd.simple.AnySimpleType.pythonvalue = self.zeep_pythonvalue
media_profile = media.GetProfiles()[0]
request = ptz.create_type('GetConfigurationOptions')
request.ConfigurationToken = media_profile.PTZConfiguration.token
request = ptz.create_type('AbsoluteMove')
request.ProfileToken = media_profile.token
ptz.Stop({'ProfileToken': media_profile.token})
if request.Position is None:
request.Position = ptz.GetStatus({'ProfileToken': media_profile.token}).Position
if request.Speed is None:
request.Speed = ptz.GetStatus({'ProfileToken': media_profile.token}).Position
request.Position.PanTilt.x = pan
request.Speed.PanTilt.x = pan_speed
request.Position.PanTilt.y = tilt
request.Speed.PanTilt.y = tilt_speed
request.Position.Zoom = zoom
request.Speed.Zoom = zoom_speed
ptz.AbsoluteMove(request)
return 'finish'
3、相対運動
方法相当RelativeMove
そして、相対的な動きを制御する、取得したIP PORTに基づきます。
def relative_move(self):
# 需要的参数
plc_ip = self.kwargs_dict['plc_ip']
plc_port = int(self.kwargs_dict['plc_port'])
re_pan = self.kwargs_dict['re_pan'] if self.kwargs_dict.get('re_pan') else 0
re_tilt = self.kwargs_dict['re_tilt'] if self.kwargs_dict.get('re_tilt') else 0
re_zoom = self.kwargs_dict['re_zoom'] if self.kwargs_dict.get('re_zoom') else 0
mycam = ONVIFCamera(plc_ip, plc_port, self.name, self.password)
media = mycam.create_media_service()
ptz = mycam.create_ptz_service()
zeep.xsd.simple.AnySimpleType.pythonvalue = self.zeep_pythonvalue
media_profile = media.GetProfiles()[0]
profile_token = media_profile.token
relative_move = ptz.create_type('RelativeMove')
relative_move.ProfileToken = profile_token
if relative_move.Translation is None:
relative_move.Translation = ptz.GetStatus({'ProfileToken': profile_token}).Position
if relative_move.Speed is None:
relative_move.Speed = ptz.GetStatus({'ProfileToken': profile_token}).Position
relative_move.Translation.PanTilt.x = re_pan
relative_move.Translation.PanTilt.y = re_tilt
relative_move.Translation.Zoom = re_zoom
try:
ptz.RelativeMove(relative_move)
except Exception as e:
return '已经无法再移动了'
return 'finish'
4、見つかったRTSPアドレス
方法相当GetStreamUri
def get_rtsp(self):
plc_ip = self.kwargs_dict['plc_ip']
plc_port = int(self.kwargs_dict['plc_port'])
mycam = ONVIFCamera(plc_ip, plc_port, self.name, self.password)
media = mycam.create_media_service()
zeep.xsd.simple.AnySimpleType.pythonvalue = self.zeep_pythonvalue
media_profile = media.GetProfiles()
token = media_profile[0].token
# 实例化GetStreamUri对象
obj = media.create_type('GetStreamUri')
obj.StreamSetup = {'Stream': 'RTP-Unicast', 'Transport': {'Protocol': 'RTSP'}}
obj.ProfileToken = token
res_uri = media.GetStreamUri(obj)['Uri']
return res_uri
再生したいRTSPのコンテンツは、その後、OpenCVのOKを使用して直接分析します。