ptzoptics-node-server/app/_helpers/cameraHelper.js

181 lines
4.7 KiB
JavaScript

/*jshint esversion: 6 */
const path = require('path');
const http = require('http');
const tcpPortUsed =require('tcp-port-used');
const db = require(path.resolve(__dirname, './db.js'));
const Camera = db.Camera;
module.exports = {
getDeviceModel,
checkPortUse,
createNewCameraStreamPort
};
async function checkPortUse(port) {
return tcpPortUsed.check(port, '127.0.0.1')
.then((inuse) => {
return inuse;
})
.catch(err => {
throw err;
});
}
async function getDeviceModel(ip) {
const options = {
hostname: ip,
path: '/cgi-bin/param.cgi?get_serial_number',
method: 'GET'
};
return sendCgiReq(options)
.then((res) => {
const rawData = res.toString().replace(/\n/g, '').toUpperCase();
return calcCamModel(rawData, rawData.substring(0, 1), rawData.substring(0, 2))
.then(res => {
return res;
})
.catch(err => {
throw err;
});
})
.catch(err => {
throw err;
});
}
async function calcCamModel(serial, first_letter, twoFirst_letter) {
let model = '';
// Check 12x
if (["1", "A", "B", "C", "D", "N", "O"].includes(first_letter)) {
model = "PT12X-";
(first_letter === "1") ? model += serial.slice(3, 6) + "-XX-" + serial.slice(8, 10) + checkPoe(serial.slice(10)) : model += newSerialAnsBuilder(serial);
}
// Check 20x
if (["2", "E", "F", "G", "H", "P", "Q"].includes(first_letter) && twoFirst_letter !== "PT" ) {
model = "PT20X-";
(first_letter === "2") ? model += serial.slice(3, 6) + "-XX-" + serial.slice(8, 10) + checkPoe(serial.slice(10)) : model += newSerialAnsBuilder(serial);
}
// Check 30x
if (["W", "X", "R", "S"].includes(first_letter)) {
model = "PT30X-" + newSerialAnsBuilder(serial);
}
// Check zcams
if (["J", "U", "I", "T"].includes(first_letter)) {
(["J", "U"].includes(first_letter)) ? model = "PT20X-ZCAM-" : model = "PTVL-ZCAM";
}
if ('PT' == twoFirst_letter) {
(serial.slice(0, 4) === "PTVL") ? model = "PTVL-ZCAM-" : model = "PT20X-ZCAM-";
}
return [model, serial];
}
function newSerialAnsBuilder(serial) {
let ans = '';
switch(serial.substring(0, 1)) {
// 12X
case "A":
case "B":
ans = "SDI-XX-G2" + checkPoe(serial.slice(1));
break;
case "C":
case "D":
ans = "USB-XX-G2";
break;
case "N":
case "O":
ans = "SDI-XX-G2 POE";
break;
// 20X
case "E":
case "F":
ans = "SDI-XX-G2" + checkPoe(serial.slice(1));
break;
case "G":
case "H":
ans = "USB-XX-G2";
break;
case "P":
case "Q":
ans = "SDI-XX-G2 POE";
break;
// 30X
case "W":
case "X":
ans = "SDI-XX-G2 POE";
break;
case "R":
case "S":
ans = "NDI-XX-G2";
break;
}
return ans;
}
function checkPoe (serialNum) {
if (serialNum <= "B1025000") {
return '';
} else if (serialNum >= "B1025001" && serialNum <= "D0129000") {
return "-POE";
} else if(serialNum >= "D0129001") {
return "-POE";
}
}
async function createNewCameraStreamPort() {
let port = 5000;
let cameraStreamPorts;
try {
// Returns all saved camera stream ports
cameraStreamPorts = await currentCameraStreamPorts();
} catch(err) {
throw err;
}
while (cameraStreamPorts.includes(port)) {
++port;
}
return port;
}
async function currentCameraStreamPorts() {
return Camera.find().select('streamPort').lean()
.then((cameras) => {
return cameras.map((camera) => {
return camera.streamPort;
});
})
.catch((err) => {
throw err;
});
}
function sendCgiReq(options) {
return new Promise(function(resolve, reject) {
const req = http.request(options, (res) => {
let rawData = '';
res.setEncoding('utf8');
res.on('data', (chunk) => {
rawData += chunk;
});
res.on('end', () => {
resolve(rawData);
});
});
req.on('error', function(err) {
reject(err);
});
req.end();
});
}