node-cam
Version:
A node js module for controlling ip based cameras
300 lines (290 loc) • 16.5 kB
JavaScript
var http = require('http');
var querystring = require('querystring');
var fs = require('fs');
var mkdirp = require('mkdirp');
module.exports = function camera(config, cb){
var camera = {};
config = config || {};
camera.settings = {
name: '',
host: '',
port: -1,
user: '',
pass: ''
}
if('directories' in config){
camera.settings.directories = {};
for(key in config.directories){
mkdirp(config.directories[key], function (err) {
if (err){
}
else {
camera.settings.directories[key] = config.directories[key];
}
});
}
}
for( var key in config ) {
camera.settings[key] = config[key];
}
if( typeof cb == 'function' ) {
cb(settings);
}
//Exposed functions
camera.snapshot = function(filepath, cb){
if (!filepath){
var filepath = camera.settings.directories['images'] + "/" + Date.now() + ".jpg";
}
else if( !cb && typeof filepath == 'function' ) {
var cb = filepath
var filepath = camera.settings.directories['images'] + "/" + Date.now() + ".jpg";
}
snapPicture2(filepath, cb, this)
};
return camera;
}
/*******************************************************************
*************************** cam-specific ***************************
********************************************************************/
getImageSetting = function(cb){cb({success:false,message:'not implemented'})}
setBrightness = function(cb){cb({success:false,message:'not implemented'})}
setContrast = function(cb){cb({success:false,message:'not implemented'})}
setHue = function(cb){cb({success:false,message:'not implemented'})}
setSaturation = function(cb){cb({success:false,message:'not implemented'})}
setSharpness = function(cb){cb({success:false,message:'not implemented'})}
resetImageSetting = function(cb){cb({success:false,message:'not implemented'})}
getMirrorAndFlipSetting = function(cb){cb({success:false,message:'not implemented'})}
mirrorVideo = function(cb){cb({success:false,message:'not implemented'})}
flipVideo = function(cb){cb({success:false,message:'not implemented'})}
getRatio = function(cb){cb({success:false,message:'not implemented'})}
setRatio = function(cb){cb({success:false,message:'not implemented'})}
getH264FrmRefMode = function(cb){cb({success:false,message:'not implemented'})}
setH264FrmRefMode = function(cb){cb({success:false,message:'not implemented'})}
getScheduleRecordStreamChn = function(cb){cb({success:false,message:'not implemented'})}
setScheduleRecordStreamChn = function(cb){cb({success:false,message:'not implemented'})}
setPwrFreq = function(cb){cb({success:false,message:'not implemented'})}
getVideoStreamParam = function(cb){cb({success:false,message:'not implemented'})}
setVideoStreamParam = function(cb){cb({success:false,message:'not implemented'})}
getSubVideoStreamParam = function(cb){cb({success:false,message:'not implemented'})}
setSubVideoStreamParam = function(cb){cb({success:false,message:'not implemented'})}
getMainVideoStreamType = function(cb){cb({success:false,message:'not implemented'})}
getSubVideoStreamType = function(cb){cb({success:false,message:'not implemented'})}
setMainVideoStreamType = function(cb){cb({success:false,message:'not implemented'})}
setSubStreamFormat = function(cb){cb({success:false,message:'not implemented'})}
GetMJStream = function(cb){cb({success:false,message:'not implemented'})}
getOSDSetting = function(cb){cb({success:false,message:'not implemented'})}
setOSDSetting = function(cb){cb({success:false,message:'not implemented'})}
getOsdMaskArea = function(cb){cb({success:false,message:'not implemented'})}
setOsdMaskArea = function(cb){cb({success:false,message:'not implemented'})}
getOSDMask = function(cb){cb({success:false,message:'not implemented'})}
setOSDMask = function(cb){cb({success:false,message:'not implemented'})}
getMotionDetectConfig = function(cb){cb({success:false,message:'not implemented'})}
setMotionDetectConfig = function(cb){cb({success:false,message:'not implemented'})}
setLocalAlarmRecordConfig = function(cb){cb({success:false,message:'not implemented'})}
getLocalAlarmRecordConfig = function(cb){cb({success:false,message:'not implemented'})}
getSnapConfig = function(cb){cb({success:false,message:'not implemented'})}
setSnapConfig = function(cb){cb({success:false,message:'not implemented'})}
getScheduleSnapConfig = function(cb){cb({success:false,message:'not implemented'})}
setScheduleSnapConfig = function(cb){cb({success:false,message:'not implemented'})}
snapPicture = function(cb){cb({success:false,message:'not implemented'})}
snapPicture2 = function( filepath, cb, camera ) {
talk({
path: '/cgi-bin/CGIProxy.fcgi?',
encoding:'binary',
fields: {
cmd: "snapPicture2"
},
settings: camera.settings,
callback: function(binary_data) {
if(filepath) {
fs.writeFile( filepath, binary_data, 'binary', function( err ) {
if(err) {
throw err
if( typeof cb == 'function' ) {
cb(false);
}
} else {
if( typeof cb == 'function' ) {
cb(filepath);
}
}
})
} else {
if( typeof cb == 'function' ) {
cb(binary_data);
}
}
}
})
}
getRecordList = function(cb){cb({success:false,message:'not implemented'})}
getRecordList2 = function(cb){cb({success:false,message:'not implemented'})}
reloadRecordindex = function(cb){cb({success:false,message:'not implemented'})}
getAlarmRecordConfig = function(cb){cb({success:false,message:'not implemented'})}
setAlarmRecordConfig = function(cb){cb({success:false,message:'not implemented'})}
getRecordPath = function(cb){cb({success:false,message:'not implemented'})}
getScheduleRecordConfig = function(cb){cb({success:false,message:'not implemented'})}
setScheduleRecordConfig = function(cb){cb({success:false,message:'not implemented'})}
setIOAlarmConfig = function(cb){cb({success:false,message:'not implemented'})}
getIOAlarmConfig = function(cb){cb({success:false,message:'not implemented'})}
clearIOAlarmOutput = function(cb){cb({success:false,message:'not implemented'})}
setPCAudioAlarmCfg = function(cb){cb({success:false,message:'not implemented'})}
getPCAudioAlarmCfg = function(cb){cb({success:false,message:'not implemented'})}
getMultiDevList = function(cb){cb({success:false,message:'not implemented'})}
getMultiDevDetailInfo = function(cb){cb({success:false,message:'not implemented'})}
addMultiDev = function(cb){cb({success:false,message:'not implemented'})}
delMultiDev = function(cb){cb({success:false,message:'not implemented'})}
addAccount = function(cb){cb({success:false,message:'not implemented'})}
delAccount = function(cb){cb({success:false,message:'not implemented'})}
changePassword = function(cb){cb({success:false,message:'not implemented'})}
changeUserName = function(cb){cb({success:false,message:'not implemented'})}
changeUserNameAndPwdTogether = function(cb){cb({success:false,message:'not implemented'})}
logIn = function(cb){cb({success:false,message:'not implemented'})}
logOut = function(cb){cb({success:false,message:'not implemented'})}
getSessionList = function(cb){cb({success:false,message:'not implemented'})}
getUserList = function(cb){cb({success:false,message:'not implemented'})}
usrBeatHeart = function(cb){cb({success:false,message:'not implemented'})}
ptzMoveUp = function(cb){cb({success:false,message:'not implemented'})}
ptzMoveDown = function(cb){cb({success:false,message:'not implemented'})}
ptzMoveLeft = function(cb){cb({success:false,message:'not implemented'})}
ptzMoveRight = function(cb){cb({success:false,message:'not implemented'})}
ptzMoveTopLeft = function(cb){cb({success:false,message:'not implemented'})}
ptzMoveTopRight = function(cb){cb({success:false,message:'not implemented'})}
ptzMoveBottomLeft = function(cb){cb({success:false,message:'not implemented'})}
ptzMoveBottomRight = function(cb){cb({success:false,message:'not implemented'})}
ptzStopRun = function(cb){cb({success:false,message:'not implemented'})}
ptzReset = function(cb){cb({success:false,message:'not implemented'})}
getPTZSpeed = function(cb){cb({success:false,message:'not implemented'})}
setPTZSpeed = function(cb){cb({success:false,message:'not implemented'})}
getPTZPresetPointList = function(cb){cb({success:false,message:'not implemented'})}
ptzAddPresetPoint = function(cb){cb({success:false,message:'not implemented'})}
ptzDeletePresetPoint = function(cb){cb({success:false,message:'not implemented'})}
ptzGotoPresetPoint = function(cb){cb({success:false,message:'not implemented'})}
ptzGetCruiseMapList = function(cb){cb({success:false,message:'not implemented'})}
ptzGetCruiseMapInfo = function(cb){cb({success:false,message:'not implemented'})}
ptzSetCruiseMap = function(cb){cb({success:false,message:'not implemented'})}
ptzDelCruiseMap = function(cb){cb({success:false,message:'not implemented'})}
ptzStartCruise = function(cb){cb({success:false,message:'not implemented'})}
ptzStopCruise = function(cb){cb({success:false,message:'not implemented'})}
setCruiseTime = function(cb){cb({success:false,message:'not implemented'})}
getCruiseTime = function(cb){cb({success:false,message:'not implemented'})}
setCruiseTimeCustomed = function(cb){cb({success:false,message:'not implemented'})}
getCruiseTimeCustomed = function(cb){cb({success:false,message:'not implemented'})}
setCruiseLoopCnt = function(cb){cb({success:false,message:'not implemented'})}
getCruiseLoopCnt = function(cb){cb({success:false,message:'not implemented'})}
setCruiseCtrlMode = function(cb){cb({success:false,message:'not implemented'})}
getCruiseCtrlMode = function(cb){cb({success:false,message:'not implemented'})}
setCruisePrePointLingerTime = function(cb){cb({success:false,message:'not implemented'})}
getCruisePrePointLingerTime = function(cb){cb({success:false,message:'not implemented'})}
zoomIn = function(cb){cb({success:false,message:'not implemented'})}
zoomOut = function(cb){cb({success:false,message:'not implemented'})}
zoomStop = function(cb){cb({success:false,message:'not implemented'})}
getZoomSpeed = function(cb){cb({success:false,message:'not implemented'})}
setZoomSpeed = function(cb){cb({success:false,message:'not implemented'})}
setPTZSelfTestMode = function(cb){cb({success:false,message:'not implemented'})}
getPTZSelfTestMode = function(cb){cb({success:false,message:'not implemented'})}
setPTZPrePointForSelfTest = function(cb){cb({success:false,message:'not implemented'})}
getPTZPrePointForSelfTest = function(cb){cb({success:false,message:'not implemented'})}
set485Info = function(cb){cb({success:false,message:'not implemented'})}
get485Info = function(cb){cb({success:false,message:'not implemented'})}
getIPInfo = function(cb){cb({success:false,message:'not implemented'})}
setIpInfo = function(cb){cb({success:false,message:'not implemented'})}
refreshWifiList = function(cb){cb({success:false,message:'not implemented'})}
getWifiList = function(cb){cb({success:false,message:'not implemented'})}
setWifiSetting = function(cb){cb({success:false,message:'not implemented'})}
getWifiConfig = function(cb){cb({success:false,message:'not implemented'})}
getPortInfo = function(cb){cb({success:false,message:'not implemented'})}
setPortInfo = function(cb){cb({success:false,message:'not implemented'})}
getUPnPConfig = function(cb){cb({success:false,message:'not implemented'})}
setUPnPConfig = function(cb){cb({success:false,message:'not implemented'})}
getDDNSConfig = function(cb){cb({success:false,message:'not implemented'})}
setDDNSConfig = function(cb){cb({success:false,message:'not implemented'})}
setFtpConfig = function(cb){cb({success:false,message:'not implemented'})}
getFtpConfig = function(cb){cb({success:false,message:'not implemented'})}
testFtpServer = function(cb){cb({success:false,message:'not implemented'})}
getSMTPConfig = function(cb){cb({success:false,message:'not implemented'})}
setSMTPConfig = function(cb){cb({success:false,message:'not implemented'})}
smtpTest = function(cb){cb({success:false,message:'not implemented'})}
setP2PEnable = function(cb){cb({success:false,message:'not implemented'})}
getP2PEnable = function(cb){cb({success:false,message:'not implemented'})}
setP2PPort = function(cb){cb({success:false,message:'not implemented'})}
getP2PPort = function(cb){cb({success:false,message:'not implemented'})}
getP2PInfo = function(cb){cb({success:false,message:'not implemented'})}
getPPPoEConfig = function(cb){cb({success:false,message:'not implemented'})}
setPPPoEConfig = function(cb){cb({success:false,message:'not implemented'})}
setSystemTime = function(cb){cb({success:false,message:'not implemented'})}
getSystemTime = function(cb){cb({success:false,message:'not implemented'})}
openInfraLed = function(cb){cb({success:false,message:'not implemented'})}
closeInfraLed = function(cb){cb({success:false,message:'not implemented'})}
getInfraLedConfig = function(cb){cb({success:false,message:'not implemented'})}
setInfraLedConfig = function(cb){cb({success:false,message:'not implemented'})}
getScheduleInfraLedConfig = function(cb){cb({success:false,message:'not implemented'})}
setScheduleInfraLedConfig = function(cb){cb({success:false,message:'not implemented'})}
getDevState = function(cb){cb({success:false,message:'not implemented'})}
getDevName = function(cb){cb({success:false,message:'not implemented'})}
setDevName = function(cb){cb({success:false,message:'not implemented'})}
getDevInfo = function(cb){cb({success:false,message:'not implemented'})}
getProductModel = function(cb){cb({success:false,message:'not implemented'})}
getProductModelName = function(cb){cb({success:false,message:'not implemented'})}
getProductLanguage = function(cb){cb({success:false,message:'not implemented'})}
getProductSensorType = function(cb){cb({success:false,message:'not implemented'})}
getProductWifiType = function(cb){cb({success:false,message:'not implemented'})}
getProductSdFlag = function(cb){cb({success:false,message:'not implemented'})}
getProductOutdoorFlag = function(cb){cb({success:false,message:'not implemented'})}
getProductPtFlag = function(cb){cb({success:false,message:'not implemented'})}
getProductZoomFlag = function(cb){cb({success:false,message:'not implemented'})}
getProductRs485Flag = function(cb){cb({success:false,message:'not implemented'})}
getProductIoAlarmFlag = function(cb){cb({success:false,message:'not implemented'})}
getProductOnvifFlag = function(cb){cb({success:false,message:'not implemented'})}
getProductP2pFlag = function(cb){cb({success:false,message:'not implemented'})}
getProductWpsFlag = function(cb){cb({success:false,message:'not implemented'})}
getProductAudioFlag = function(cb){cb({success:false,message:'not implemented'})}
getProductTalkFlag = function(cb){cb({success:false,message:'not implemented'})}
getProductAppVer = function(cb){cb({success:false,message:'not implemented'})}
getProductAllInfo = function(cb){cb({success:false,message:'not implemented'})}
getGeneratePubKey = function(cb){cb({success:false,message:'not implemented'})}
toolResetToFactory = function(cb){cb({success:false,message:'not implemented'})}
rebootSystem = function(cb){cb({success:false,message:'not implemented'})}
restoreToFactorySetting = function(cb){cb({success:false,message:'not implemented'})}
exportConfig = function(cb){cb({success:false,message:'not implemented'})}
ImportConfig = function(cb){cb({success:false,message:'not implemented'})}
FwUpgrade = function(cb){cb({success:false,message:'not implemented'})}
getFirewallConfig = function(cb){cb({success:false,message:'not implemented'})}
setFirewallConfig = function(cb){cb({success:false,message:'not implemented'})}
getLog = function(cb){cb({success:false,message:'not implemented'})}
// communicate
talk = function(args) {
if(!args.fields) {
args.fields = {};
}
if (!args.camera) {
args.camera = {};
}
args.fields.usr = args.settings.user;
args.fields.pwd = args.settings.pass;
path = args.path + querystring.stringify( args.fields )
// connect
var req = http.request({
host: args.settings.host,
port: args.settings.port,
path: path,
method: 'GET'
}, function( response ) {
// response
response.setEncoding( args.encoding ? args.encoding : 'utf8' );
var data = '';
response.on( 'data', function( chunk ) { data += chunk })
response.on( 'end', function() {
if( typeof args.callback == 'function' ) {
data = data.trim();
args.callback(data);
}
})
})
// fail
req.on( 'error', function( err ) {
camera.emit( 'connection-error', err );
})
// disconnect
req.end();
}