From 3fd8f4addf3a2e74177cbaf1cd890a5ec535360a Mon Sep 17 00:00:00 2001 From: "Jan M. Hochstein" Date: Mon, 14 Jul 2014 20:59:36 +0200 Subject: [PATCH] Added basic ONVIF support views --- web/skins/classic/views/js/onvifprobe.js | 39 ++++ web/skins/classic/views/onvifprobe.php | 283 +++++++++++++++++++++++ 2 files changed, 322 insertions(+) create mode 100644 web/skins/classic/views/js/onvifprobe.js create mode 100644 web/skins/classic/views/onvifprobe.php diff --git a/web/skins/classic/views/js/onvifprobe.js b/web/skins/classic/views/js/onvifprobe.js new file mode 100644 index 000000000..f70765dda --- /dev/null +++ b/web/skins/classic/views/js/onvifprobe.js @@ -0,0 +1,39 @@ +function submitCamera( element ) +{ + var form = element.form; + form.target = opener.name; + form.view.value = 'monitor'; + form.submit(); + closeWindow.delay( 250 ); +} + +function gotoStep1( element ) +{ + var form = element.form; + form.target = self.name; + form.view.value = 'onvifprobe'; + form.step.value = '1'; + form.submit(); +} + +function gotoStep2( element ) +{ + var form = element.form; + form.target = self.name; + form.view.value = 'onvifprobe'; + form.step.value = '2'; + form.submit(); +} + +function configureButtons( element ) +{ + var form = element.form; + if(form.elements.namedItem("nextBtn")) { + form.nextBtn.disabled = (form.probe.selectedIndex==0) || + (form.username == "") || (form.username == null) || + (form.password == "") || (form.password == null); + } + if(form.elements.namedItem("saveBtn")) { + form.saveBtn.disabled = (form.probe.selectedIndex==0); + } +} diff --git a/web/skins/classic/views/onvifprobe.php b/web/skins/classic/views/onvifprobe.php new file mode 100644 index 000000000..075d22f24 --- /dev/null +++ b/web/skins/classic/views/onvifprobe.php @@ -0,0 +1,283 @@ + "Unknown ONVIF Camera", + 'monitor' => array( + 'Function' => "Monitor", + 'Type' => 'Ffmpeg', + 'Host' => $device_ep, + ), + ); + foreach ( preg_split('|,\s*|', $matches[2]) as $attr_val ) { + if( preg_match( '|(.+)=\'(.*)\'|', $attr_val, $tokens ) ) + { + if($tokens[1] == "hardware") { + $camera['model'] = $tokens[2]; + } + elseif($tokens[1] == "name") { + $camera['monitor']['Name'] = $tokens[2]; + } + elseif($tokens[1] == "location") { +// $camera['location'] = $tokens[2]; + } + + } + } + $cameras[$count ++] = $camera; + } + } + } + return( $cameras ); +} + +function probeProfiles( $device_ep, $username, $password ) +{ + $profiles = array(); + $count = 0; + if ( $lines = @execONVIF( "profiles $device_ep $username $password" ) ) + { + foreach ( $lines as $line ) + { + $line = rtrim( $line ); + if ( preg_match( '|^(.+),\s*(.+),\s*(.+),\s*(.+),\s*(.+),\s*(.+),\s*(.+)\s*$|', $line, $matches ) ) + { + $stream_uri = $matches[7]; + // add user@pass to URI + if( preg_match( '|^(\S+://)(.+)$|', $stream_uri, $tokens ) ) + { + $stream_uri = $tokens[1].$username.':'.$password.'@'.$tokens[2]; + } + + $profile = array( # 'monitor' part of camera + 'Type' => 'Ffmpeg', + 'Width' => $matches[4], + 'Height' => $matches[5], + 'MaxFPS' => $matches[6], + 'Path' => $stream_uri, + // local-only: + 'Profile' => $matches[1], + 'Name' => $matches[2], + 'Encoding' => $matches[3], + + ); + $profiles[$count ++] = $profile; + } + } + } + return( $profiles ); +} + + +//==== STEP 1 ============================================================ + +$focusWindow = true; + +xhtmlHeaders(__FILE__, $SLANG['MonitorProbe'] ); + +if( !isset($_REQUEST['step']) || ($_REQUEST['step'] == "1")) { + + $monitors = array(); + foreach ( dbFetchAll( "select Id, Name, Host from Monitors where Type = 'Remote' order by Host" ) as $monitor ) + { + if ( preg_match( '/^(.+)@(.+)$/', $monitor['Host'], $matches ) ) + { + //echo "1: ".$matches[2]." = ".gethostbyname($matches[2])."
"; + $monitors[gethostbyname($matches[2])] = $monitor; + } + else + { + //echo "2: ".$monitor['Host']." = ".gethostbyname($monitor['Host'])."
"; + $monitors[gethostbyname($monitor['Host'])] = $monitor; + } + } + + $detcameras = probeCameras( '' ); + foreach ( $detcameras as $camera ) + { + if ( preg_match( '|([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)|', $camera['monitor']['Host'], $matches ) ) + { + $ip = $matches[1]; + } + $host = $ip; +/* + if ( isset($monitors[$ip]) ) + { + $monitor = $monitors[$ip]; + $sourceString .= " (".$monitor['Name'].")"; + } + else + { + $sourceString .= " - ".$SLANG['Available']; + } + $cameras[$sourceDesc] = $sourceString; + } +*/ +// $sourceDesc = htmlspecialchars(serialize($camera['monitor'])); + $sourceDesc = base64_encode(serialize($camera['monitor'])); + $sourceString = $camera['model'].' @ '.$host; + $cameras[$sourceDesc] = $sourceString; + } + + if ( count($cameras) <= 0 ) + $cameras[0] = $SLANG['NoDetectedCameras']; + +?> + +
+ +
+
+ + + +

+ +

+

+ +

+

+ +

+

+ + +

+

+ + +

+
+ + +
+
+
+
+ + +$value ) + { + if ( isset($value) ) + { + $monitor[$name] = $value; + } + } + $camera['monitor'] = $monitor; + + //print $monitor['Host'].", ".$_REQUEST['username'].", ".$_REQUEST['password']."
"; + + $detprofiles = probeProfiles( $monitor['Host'], $_REQUEST['username'], $_REQUEST['password']); + foreach ( $detprofiles as $profile ) + { + $monitor = $camera['monitor']; + + $sourceString = "${profile['Name']} : ${profile['Encoding']}" . + " (${profile['Width']}x${profile['Height']} @ ${profile['MaxFPS']}fps)"; + // copy technical details + $monitor['Width'] = $profile['Width']; + $monitor['Height'] = $profile['Height']; + $monitor['MaxFPS'] = $profile['MaxFPS']; + $monitor['AlarmMaxFPS'] = $profile['AlarmMaxFPS']; + $monitor['Path'] = $profile['Path']; +// $sourceDesc = htmlspecialchars(serialize($monitor)); + $sourceDesc = base64_encode(serialize($monitor)); + $cameras[$sourceDesc] = $sourceString; + } + + if ( count($cameras) <= 0 ) + $cameras[0] = $SLANG['NoDetectedCameras']; + +?> + +
+ +
+
+ + + +

+ +

+

+ +

+
+ + + +
+
+
+
+ + +