diff --git a/misc/onvif/getRtspUrls.js b/misc/onvif/getRtspUrls.js new file mode 100644 index 00000000..8e25b258 --- /dev/null +++ b/misc/onvif/getRtspUrls.js @@ -0,0 +1,61 @@ +const onvif = require('onvif'); + +// Extract command-line arguments +const args = process.argv.slice(2); // Skip the first two elements +if (args.length != 3) { + console.error('Usage: node getRtspUrls.js '); + process.exit(1); +} +const HOST_PORT = args[0]; // IP address and port (optional) +const USERNAME = args[1]; // Username +const PASSWORD = args[2]; // Password + +// Split HOST_PORT by ':' to separate IP and port +const [HOST, PORT] = HOST_PORT.split(':'); + +// Default ONVIF port if not specified +const DEFAULT_PORT = 80; + +// Validate input arguments +if (!HOST || !USERNAME || !PASSWORD) { + console.error('Usage: node getRtspUrls.js '); + process.exit(1); +} + +// Connect to the ONVIF camera +const camera = new onvif.Cam({ + hostname: HOST, + username: USERNAME, + password: PASSWORD, + port: PORT || DEFAULT_PORT, // Use the specified port or default if not provided +}, function(err) { + if (err) { + return console.error(err); + } + + // Get all the available media profiles + this.getProfiles((err, profiles) => { + if (err) { + return console.error(err); + } + + // Fetch and output RTSP URLs for each profile + const rtspUrls = profiles.map(profile => { + return new Promise((resolve, reject) => { + this.getStreamUri({protocol: 'RTSP', profileToken: profile.token}, (err, stream) => { + if (err) { + reject(err); + } else { + resolve({profileName: profile.name, rtspUri: stream.uri}); + } + }); + }); + }); + + Promise.all(rtspUrls) + .then(urls => { + console.log(JSON.stringify(urls, null, 2)); + }) + .catch(error => console.error(error)); + }); +}); diff --git a/www/ajax/addip.php b/www/ajax/addip.php index 13af5144..3c89acec 100644 --- a/www/ajax/addip.php +++ b/www/ajax/addip.php @@ -69,18 +69,25 @@ public function postCheckOnvifPort() $pass = Inp::post('pass'); $onvif_addr = $ip.":".$port; - $p = @popen("/usr/lib/bluecherry/onvif_tool \"{$onvif_addr}\" \"{$user}\" \"{$pass}\" get_stream_urls", "r"); - - if (!$p){ - data::responseJSON($stat, $msg); - exit; + $json_out = shell_exec("node /usr/share/bluecherry/onvif/getRtspUrls.js " . escapeshellarg($onvif_addr) .' '. escapeshellarg($user) .' '. escapeshellarg($pass)); + if ($json_out) { + $urls = json_decode($json_out, /*associative=*/true); + $main_stream = $urls[0]['rtspUri']; + $sub_stream = $urls[1]['rtspUri']; + } else { + $p = @popen("/usr/lib/bluecherry/onvif_tool " . escapeshellarg($onvif_addr) .' '. escapeshellarg($user) .' '. escapeshellarg($pass). " get_stream_urls", "r"); + + if (!$p){ + data::responseJSON($stat, $msg); + exit; + } + + $media_service = fgets($p); + $main_stream = fgets($p); + $sub_stream = fgets($p); + pclose($p); } - - $media_service = fgets($p); - $main_stream = fgets($p); - $sub_stream = fgets($p); - pclose($p); - if ($media_service && $main_stream){ + if ($main_stream) { $stat = 6; $msg = AIP_CHECK_ONVIF_SUCCESS; diff --git a/www/ajax/discoverCameras.php b/www/ajax/discoverCameras.php index 012f7787..83cb8021 100644 --- a/www/ajax/discoverCameras.php +++ b/www/ajax/discoverCameras.php @@ -313,24 +313,32 @@ public function postAdd() foreach ($passwords as $pass_arr) { foreach ($pass_arr as $login => $password) { $onvif_username = $login; - $onvif_password = $password; + $onvif_password = $password; + try { - $p = @popen("/usr/lib/bluecherry/onvif_tool \"{$onvif_addr}\" \"{$onvif_username}\" \"{$onvif_password}\" get_stream_urls", "r"); - if (!$p) - break; - - $media_service = fgets($p); - if (!$media_service) - { - $err['onvif_ip'][] = $ip; - break(2); - } - $main_stream = fgets($p); - $sub_stream = fgets($p); - pclose($p); + $json_out = shell_exec("node /usr/share/bluecherry/onvif/getRtspUrls.js " . escapeshellarg($onvif_addr) .' '. escapeshellarg($onvif_username) .' '. escapeshellarg($onvif_password)); + if ($json_out) { + $urls = json_decode($json_out, /*associative=*/true); + $main_stream = $urls[0]['rtspUri']; + $sub_stream = $urls[1]['rtspUri']; + } else { + $p = @popen("/usr/lib/bluecherry/onvif_tool " . escapeshellarg($onvif_addr) .' '. escapeshellarg($onvif_username) .' '. escapeshellarg($onvif_password). " get_stream_urls", "r"); + if (!$p) + break; + + $media_service = fgets($p); + if (!$media_service) + { + $err['onvif_ip'][] = $ip; + break(2); + } + $main_stream = fgets($p); + $sub_stream = fgets($p); + pclose($p); + } if ($main_stream) - { + { $password_ch = true; $media_uri = trim($main_stream);