这是我的代码:
function getIPAddress(url) {
var v4 = '[\\d]{1-3}';
var v4d = '\\.';
var v4complete = v4+v4d+v4+v4d+v4+v4d+v4
var v6 = '[\\da-fA-F]{0-4}';
var v6d = ':';
var v6complete = v6+v6d+v6+v6d+v6+v6d+v6+v6d+v6+v6d+v6+v6d+v6+v6d+v6;
var regex = new RegExp('(' + v4complete + '(\\:\d+){0,1}|'
+ '::|::1|'
+ '\\[::\\]:\\d+|\\[::1\\]|'
+ v6complete + '|'
+ '\\[' + v6complete + '\\]' + ')', 'g');
return url.match(regex);
}
var HOSTNAME = getIPAddress(localStorage.getItem('ipaddress')),
PORT = 80,
USERNAME = localStorage.getItem('ipusername'),
PASSWORD = localStorage.getItem('ippassword'),
STOP_DELAY_MS = 50;
var Cam = require('./lib/onvif').Cam;
var keypress = require('keypress');
var camera = new Cam({
hostname : HOSTNAME,
username : USERNAME,
password : PASSWORD,
port : PORT,
timeout : 10000
}, this.CamFunc = function (err) {
if (err) {
console.log(err);
return;
}
var cam_obj = this;
var preset_names = [];
var preset_tokens = [];
cam_obj.getStreamUri({
protocol : 'RTSP'
}, // Completion callback function
// This callback is executed once we have a StreamUri
function (err, stream, xml) {
if (err) {
console.log(err);
return;
} else {
console.log('------------------------------');
console.log('Host: ' + HOSTNAME + ' Port: ' + PORT);
console.log('Stream: = ' + stream.uri);
console.log('------------------------------');
// start processing the keyboard
read_and_process_keyboard();
}
}
);
cam_obj.getPresets({}, // use 'default' profileToken
// Completion callback function
// This callback is executed once we have a list of presets
function (err, stream, xml) {
if (err) {
console.log("GetPreset Error "+err);
return;
} else {
// loop over the presets and populate the arrays
// Do this for the first 9 presets
console.log("GetPreset Reply");
var count = 1;
for(var item in stream) {
var name = item; //key
var token = stream[item]; //value
// It is possible to have a preset with a blank name so generate a name
if (name.length == 0) name='no name ('+token+')';
preset_names.push(name);
preset_tokens.push(token);
// Show first 9 preset names to user
if (count < 9) {
console.log('Press key '+count+ ' for preset "' + name + '"');
count++;
}
}
}
}
);
});
var stop_timer;
var ignore_keypress = false;
function read_and_process_keyboard() {
// listen for the "keypress" events
keypress(process.stdin);
process.stdin.setRawMode(true);
process.stdin.resume();
console.log('');
console.log('Use Cursor Keys to move camera. + and - to zoom. q to quit');
// keypress handler
process.stdin.on('keypress', function (ch, key) {
/* Exit on 'q' or 'Q' or 'CTRL C' */
if ((key && key.ctrl && key.name == 'c')
|| (key && key.name == 'q')) {
process.exit();
}
if (ignore_keypress) {
return;
}
if (key) {
console.log('got "keypress"',key.name);
} else {
if (ch)console.log('got "keypress character"',ch);
}
if (key && key.name == 'up') move(0,1,0,'up');
else if (key && key.name == 'down') move(0,-1,0,'down');
else if (key && key.name == 'left') move(-1,0,0,'left');
else if (key && key.name == 'right') move(1,0,0,'right');
else if (ch && ch == '-') move(0,0,-1,'zoom out');
else if (ch && ch == '+') move(0,0,1,'zoom in');
// On English keyboards '+' is "Shift and = key"
// Accept the "=" key as zoom in
else if (ch && ch == '=') move(0,0,1,'zoom in');
else if (ch && ch>='1' && ch <='9') goto_preset(ch);
});
}
function goto_preset(number) {
if (number > preset_names.length) {
console.log ("No preset " + number);
return;
}
console.log('sending goto preset command '+preset_names[number-1]);
camera.CamFunc().cam_obj.gotoPreset({ preset : preset_tokens[number-1] } ,
// completion callback function
function (err, stream, xml) {
if (err) {
console.log(err);
} else {
console.log('goto preset command sent ');
}
});
}
function move(x_speed, y_speed, zoom_speed, msg) {
// Step 1 - Turn off the keyboard processing (so keypresses do not buffer up)
// Step 2 - Clear any existing 'stop' timeouts. We will re-schedule a new 'stop' command in this function
// Step 3 - Send the Pan/Tilt/Zoom 'move' command.
// Step 4 - In the callback from the PTZ 'move' command we schedule the ONVIF Stop command to be executed after a short delay and re-enable the keyboard
// Pause keyboard processing
ignore_keypress = true;
// Clear any pending 'stop' commands
if (stop_timer) clearTimeout(stop_timer);
// Move the camera
console.log('sending move command ' + msg);
camera.cam_obj.continuousMove({x : x_speed,
y : y_speed,
zoom : zoom_speed } ,
// completion callback function
function (err, stream, xml) {
if (err) {
console.log(err);
} else {
console.log('move command sent '+ msg);
// schedule a Stop command to run in the future
stop_timer = setTimeout(stop,STOP_DELAY_MS);
}
// Resume keyboard processing
ignore_keypress = false;
});
}
function stop() {
// send a stop command, stopping Pan/Tilt and stopping zoom
console.log('sending stop command');
camera.cam_obj.stop({panTilt: true, zoom: true},
function (err,stream, xml){
if (err) {
console.log(err);
} else {
console.log('stop command sent');
}
});
}
function PanRight() {
move(1,0,0,'right');
}
function PanLeft() {
move(-1,0,0,'left');
}
function TiltUp() {
move(0,1,0,'up');
}
function TiltDown() {
move(0,-1,0,'down');
}
function AdjustSpeed(speed){
x_speed = speed;
y_speed = speed;
}
function PanFront() {
goto_preset(1);
}
function PanBack() {
goto_preset(8);
}
function TiltCenter() {
goto_preset(1);
}
function Stop() {
stop();
}
// exported methods for the script.js and other scripts
module.exports = {
// flashlight: Flashlight,
// laser: Laser,
panright: PanRight,
panleft : PanLeft,
tiltup: TiltUp,
tiltdown: TiltDown,
panfront: PanFront,
panback: PanBack,
adjustspeed: AdjustSpeed,
tiltcenter: TiltCenter,
stop: Stop
}
问题是我正在尝试从相机对象内部的功能CamFunc中访问cam_obj。我什至无法弄清楚为什么即使尝试了几次更改才能使我无法访问CamFunc方法。
谁能告诉我如何访问属于对象的函数内部的对象?我对javascript比较陌生
答案 0 :(得分:0)
在var相机的构造中,您似乎正在设置this.CamFunc参数通常会到达的位置。也许尝试不设置this.CamFunc而直接传递函数?或者也许在照相机对象之外设置this.CamFunc并将函数传递进来?不确定相机对象如何处理自身内部的功能
答案 1 :(得分:0)
天哪,我知道了。这是最终的解决方案:
function getIPAddress(url) {
var regex = /[0-9]{1,3}(.[0-9]{1,3})(.[0-9]{1,3})(.[0-9]{1,3})/g;
return url.match(regex);
}
var HOSTNAME = getIPAddress(localStorage.getItem('ipaddress'))[0],
PORT = 80,
USERNAME = localStorage.getItem('ipusername'),
PASSWORD = localStorage.getItem('ippassword'),
STOP_DELAY_MS = 50;
var Cam = require('./lib/onvif').Cam;
var keypress = require('keypress');
var cam_obj;
new Cam({
hostname : HOSTNAME,
username : USERNAME,
password : PASSWORD,
port : PORT,
timeout : 10000
}, function CamFunc(err) {
if (err) {
console.log(err);
return;
}
cam_obj = this;
cam_obj.getStreamUri({
protocol : 'RTSP'
}, // Completion callback function
// This callback is executed once we have a StreamUri
function (err, stream, xml) {
if (err) {
console.log(err);
return;
} else {
console.log('------------------------------');
console.log('Host: ' + HOSTNAME + ' Port: ' + PORT);
console.log('Stream: = ' + stream.uri);
console.log('------------------------------');
// start processing the keyboard
read_and_process_keyboard();
}
}
);
cam_obj.getPresets({}, // use 'default' profileToken
// Completion callback function
// This callback is executed once we have a list of presets
function (err, stream, xml) {
if (err) {
console.log("GetPreset Error "+err);
return;
} else {
// loop over the presets and populate the arrays
// Do this for the first 9 presets
console.log("GetPreset Reply");
var count = 1;
for(var item in stream) {
var name = item; //key
var token = stream[item]; //value
// It is possible to have a preset with a blank name so generate a name
if (name.length == 0) name='no name ('+token+')';
preset_names.push(name);
preset_tokens.push(token);
// Show first 9 preset names to user
if (count < 9) {
console.log('Press key '+count+ ' for preset "' + name + '"');
count++;
}
}
}
}
);
});
var stop_timer;
var ignore_keypress = false;
var preset_names = [];
var preset_tokens = [];
function read_and_process_keyboard() {
// listen for the "keypress" events
keypress(process.stdin);
process.stdin.setRawMode(true);
process.stdin.resume();
console.log('');
console.log('Use Cursor Keys to move camera. + and - to zoom. q to quit');
// keypress handler
process.stdin.on('keypress', function (ch, key) {
/* Exit on 'q' or 'Q' or 'CTRL C' */
if ((key && key.ctrl && key.name == 'c')
|| (key && key.name == 'q')) {
process.exit();
}
if (ignore_keypress) {
return;
}
if (key) {
console.log('got "keypress"',key.name);
} else {
if (ch)console.log('got "keypress character"',ch);
}
if (key && key.name == 'up') move(0,1,0,'up');
else if (key && key.name == 'down') move(0,-1,0,'down');
else if (key && key.name == 'left') move(-1,0,0,'left');
else if (key && key.name == 'right') move(1,0,0,'right');
else if (ch && ch == '-') move(0,0,-1,'zoom out');
else if (ch && ch == '+') move(0,0,1,'zoom in');
// On English keyboards '+' is "Shift and = key"
// Accept the "=" key as zoom in
else if (ch && ch == '=') move(0,0,1,'zoom in');
else if (ch && ch>='1' && ch <='9') goto_preset(ch);
});
}
function move(x_speed, y_speed, zoom_speed, msg) {
// Step 1 - Turn off the keyboard processing (so keypresses do not buffer up)
// Step 2 - Clear any existing 'stop' timeouts. We will re-schedule a new 'stop' command in this function
// Step 3 - Send the Pan/Tilt/Zoom 'move' command.
// Step 4 - In the callback from the PTZ 'move' command we schedule the ONVIF Stop command to be executed after a short delay and re-enable the keyboard
// Pause keyboard processing
ignore_keypress = true;
// Clear any pending 'stop' commands
if (stop_timer) clearTimeout(stop_timer);
// Move the camera
console.log('sending move command ' + msg);
cam_obj.continuousMove({x : x_speed,
y : y_speed,
zoom : zoom_speed } ,
// completion callback function
function (err, stream, xml) {
if (err) {
console.log(err);
} else {
console.log('move command sent '+ msg);
// schedule a Stop command to run in the future
stop_timer = setTimeout(stop,STOP_DELAY_MS);
}
// Resume keyboard processing
ignore_keypress = false;
});
}
function stop() {
// send a stop command, stopping Pan/Tilt and stopping zoom
console.log('sending stop command');
cam_obj.stop({panTilt: true, zoom: true},
function (err,stream, xml){
if (err) {
console.log(err);
} else {
console.log('stop command sent');
}
});
}
function goto_preset(number) {
if (number > preset_names.length) {
console.log ("No preset " + number);
return;
}
console.log('sending goto preset command '+preset_names[number-1]);
cam_obj.gotoPreset({ preset : preset_tokens[number-1] } ,
// completion callback function
function (err, stream, xml) {
if (err) {
console.log(err);
} else {
console.log('goto preset command sent ');
}
});
}
function PanRight() {
move(1,0,0,'right');
}
function PanLeft() {
move(-1,0,0,'left');
}
function TiltUp() {
move(0,1,0,'up');
}
function TiltDown() {
move(0,-1,0,'down');
}
function AdjustSpeed(speed){
x_speed = speed;
y_speed = speed;
}
function PanFront() {
goto_preset(1);
}
function PanBack() {
goto_preset(8);
}
function TiltCenter() {
goto_preset(1);
}
function Stop() {
stop();
}
// exported methods for the script.js and other scripts
module.exports = {
// flashlight: Flashlight,
// laser: Laser,
panright: PanRight,
panleft : PanLeft,
tiltup: TiltUp,
tiltdown: TiltDown,
panfront: PanFront,
panback: PanBack,
adjustspeed: AdjustSpeed,
tiltcenter: TiltCenter,
stop: Stop
}
感谢您的帮助!