2014-03-08 02:19:24 +00:00
|
|
|
#!/usr/bin/python
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
|
|
import argparse
|
|
|
|
import re
|
|
|
|
import sys
|
2014-03-08 13:38:56 +00:00
|
|
|
import httplib
|
2014-03-08 02:19:24 +00:00
|
|
|
|
|
|
|
from chaosc.simpleOSCServer import SimpleOSCServer
|
|
|
|
|
|
|
|
|
|
|
|
class OSC2CamServer(SimpleOSCServer):
|
|
|
|
"""OSC filtering/transcoding middleware
|
|
|
|
"""
|
|
|
|
|
|
|
|
def __init__(self, args, cams):
|
2014-03-08 13:38:56 +00:00
|
|
|
"""ctor for a osc udp 2 ptz ip cam bridge
|
2014-03-08 02:19:24 +00:00
|
|
|
|
2014-03-08 13:38:56 +00:00
|
|
|
starts the server, creates http connections to specified cams
|
2014-03-08 02:19:24 +00:00
|
|
|
|
2014-03-08 13:38:56 +00:00
|
|
|
:param args: return value of argparse.parse_args
|
|
|
|
:type args: namespace object
|
|
|
|
|
|
|
|
:param cams: return value of argparse.parse_args
|
|
|
|
:type cams: list of 2 item tuples
|
2014-03-08 02:19:24 +00:00
|
|
|
"""
|
|
|
|
|
2014-03-08 13:38:56 +00:00
|
|
|
SimpleOSCServer.__init__(self, ("", args.port))
|
2014-03-08 02:19:24 +00:00
|
|
|
|
2014-03-08 13:38:56 +00:00
|
|
|
self.set_url = "/cgi-bin/admin/"
|
|
|
|
self.get_url = "/cgi-bin/view/"
|
|
|
|
self.ptz_ctl_url = "/cgi-bin/operator/ptzset"
|
|
|
|
self.ptz_config_url = "/cgi-bin/operator/ptzconfig"
|
|
|
|
self.connections = [httplib.HTTPConnection(host, port) for host, port in cams]
|
2014-03-08 02:19:24 +00:00
|
|
|
self.resetCams()
|
|
|
|
|
|
|
|
def resetCams(self):
|
2014-03-08 13:38:56 +00:00
|
|
|
""" configures each ip cam"""
|
|
|
|
|
2014-03-08 02:19:24 +00:00
|
|
|
for connection in self.connections:
|
2014-03-08 13:38:56 +00:00
|
|
|
connection.request("GET", "%sparam?action=update&Image.I0.MJPEG.Resolution=640x480" % self.set_url)
|
|
|
|
conn_result = connection.getresponse()
|
|
|
|
print conn_result.status, conn_result.reason
|
|
|
|
connection.request("GET", "%sparam?action=update&Image.I0.Appearance.Compression=75" % self.set_url)
|
|
|
|
conn_result = connection.getresponse()
|
|
|
|
print conn_result.status, conn_result.reason
|
|
|
|
connection.request("GET", "%sparam?action=update&Image.I0.MJPEG.FPS=25" % self.set_url)
|
|
|
|
conn_result = connection.getresponse()
|
|
|
|
print conn_result.status, conn_result.reason
|
2014-03-08 02:19:24 +00:00
|
|
|
|
|
|
|
|
2014-03-08 13:38:56 +00:00
|
|
|
def move_cam(self, cam_id, args):
|
|
|
|
""" moves given ip cam"""
|
|
|
|
|
2014-03-08 02:19:24 +00:00
|
|
|
direction = args[0]
|
|
|
|
if direction in ("home", "up", "down", "left", "right", "upleft", "upright", "downleft", "downright", "repeat", "stop"):
|
2014-03-08 13:38:56 +00:00
|
|
|
connection = self.connections[cam_id]
|
|
|
|
connection.request("GET", "%s?move=%s" % (self.ptz_ctl_url, direction))
|
|
|
|
conn_result = connection.getresponse()
|
|
|
|
print conn_result.status, conn_result.reason
|
|
|
|
|
2014-03-08 02:19:24 +00:00
|
|
|
|
2014-03-08 13:38:56 +00:00
|
|
|
def use_cam_preset(self, cam_id, args):
|
|
|
|
""" says given ip cam to use a predefined position preset"""
|
2014-03-08 02:19:24 +00:00
|
|
|
|
|
|
|
presetno = args[0]
|
2014-03-08 13:38:56 +00:00
|
|
|
connection = self.connections[cam_id]
|
|
|
|
connection.request("GET", "%s?gotoserverpresetno=%d" % (self.ptz_ctl_url, presetno))
|
|
|
|
conn_result = connection.getresponse()
|
|
|
|
print conn_result.status, conn_result.reason
|
2014-03-08 02:19:24 +00:00
|
|
|
|
|
|
|
|
2014-03-08 13:38:56 +00:00
|
|
|
def set_cam_preset(self, cam_id, args):
|
|
|
|
""" saves the actual position of given ip cam to a preset"""
|
|
|
|
|
2014-03-08 02:19:24 +00:00
|
|
|
presetno = args[0]
|
2014-03-08 13:38:56 +00:00
|
|
|
connection = self.connections[cam_id]
|
|
|
|
connection.request("GET", "%s?setserverpresetno=%d&home=yes" % (self.ptz_config_url, presetno))
|
|
|
|
conn_result = connection.getresponse()
|
|
|
|
print conn_result.status, conn_result.reason
|
|
|
|
|
2014-03-08 02:19:24 +00:00
|
|
|
|
2014-03-08 13:38:56 +00:00
|
|
|
def zoom_cam(self, cam_id, args):
|
|
|
|
""" tells given ip cam to zoom in or out"""
|
2014-03-08 02:19:24 +00:00
|
|
|
|
|
|
|
direction = None
|
|
|
|
arg = args[0]
|
|
|
|
if arg == "out":
|
|
|
|
direction = 0
|
|
|
|
elif arg == "in":
|
|
|
|
direction = 1
|
2014-03-08 13:38:56 +00:00
|
|
|
connection = self.connections[cam_id]
|
|
|
|
connection.request("GET", "%s?zoom=%s" % (self.ptz_ctl_url, direction))
|
|
|
|
conn_result = connection.getresponse()
|
|
|
|
print conn_result.status, conn_result.reason
|
2014-03-08 02:19:24 +00:00
|
|
|
|
|
|
|
|
2014-03-08 13:38:56 +00:00
|
|
|
def toggle_night_view(self, cam_id, args):
|
|
|
|
""" toggles the night view function of given ip cam"""
|
|
|
|
|
2014-03-08 02:19:24 +00:00
|
|
|
arg = args[0]
|
|
|
|
state = None
|
|
|
|
if arg == "on":
|
|
|
|
state = "auto"
|
|
|
|
else:
|
|
|
|
state = "off"
|
2014-03-08 13:38:56 +00:00
|
|
|
|
|
|
|
connection = self.connections[cam_id]
|
|
|
|
connection.request("GET", "%sparam?action=update&Image.I0.Appearance.NightMode=%s" % (self.set_url, state))
|
|
|
|
conn_result = connection.getresponse()
|
|
|
|
print conn_result.status, conn_result.reason
|
2014-03-08 02:19:24 +00:00
|
|
|
|
|
|
|
|
|
|
|
def dispatchMessage(self, osc_address, typetags, args, packet, client_address):
|
2014-03-08 13:38:56 +00:00
|
|
|
""" dispatches parsed osc messages to the ip cam command methods"""
|
2014-03-08 14:08:25 +00:00
|
|
|
|
|
|
|
cam_id = args.pop(0)
|
|
|
|
if osc_address == "/moveCam":
|
|
|
|
self.move_cam(cam_id, args)
|
|
|
|
elif osc_address == "/setCamPreset":
|
|
|
|
self.set_cam_preset(cam_id, args)
|
|
|
|
elif osc_address == "/useCamPreset":
|
|
|
|
self.use_cam_preset(cam_id, args)
|
|
|
|
elif osc_address == "/zoomCam":
|
|
|
|
self.zoom_cam(cam_id, args)
|
|
|
|
elif osc_address == "/toggleNightView":
|
|
|
|
self.toggle_night_view(cam_id, args)
|
2014-03-08 02:19:24 +00:00
|
|
|
|
|
|
|
|
|
|
|
def main():
|
2014-03-08 13:38:56 +00:00
|
|
|
parser = argparse.ArgumentParser(prog='osc2cam')
|
|
|
|
parser.add_argument('-p', "--port", required=True,
|
2014-03-08 02:19:24 +00:00
|
|
|
type=int, help='my port')
|
|
|
|
|
|
|
|
args = parser.parse_args(sys.argv[1:])
|
|
|
|
|
|
|
|
|
|
|
|
cams = [
|
2014-03-08 13:38:56 +00:00
|
|
|
("192.168.1.51", args.port + 1),
|
|
|
|
("192.168.1.52", args.port + 2),
|
|
|
|
("192.168.1.53", args.port + 3),
|
2014-03-08 02:19:24 +00:00
|
|
|
]
|
|
|
|
|
2014-03-08 13:38:56 +00:00
|
|
|
cams = [
|
|
|
|
("localhost", args.port + 1),
|
|
|
|
("localhost", args.port + 2),
|
|
|
|
("localhost", args.port + 3),
|
|
|
|
]
|
|
|
|
|
|
|
|
|
2014-03-08 02:19:24 +00:00
|
|
|
server = OSC2CamServer(args, cams)
|
2014-03-08 13:38:56 +00:00
|
|
|
server.serve_forever()
|
|
|
|
|