wiegand-control
Version:
Communicate with wiegand door access controller.
162 lines (161 loc) • 5.82 kB
JavaScript
;
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
var moment_1 = __importDefault(require("moment"));
require("moment-timezone");
var funcNames_1 = __importDefault(require("./funcNames"));
function parseData(data) {
var funcCode = "0x" +
data
.slice(1, 2)
.toString("hex")
.toUpperCase();
var serial = data.readUInt32LE(4);
var payload = data.slice(8);
return __assign({ serial: serial }, payloadParser(funcCode, payload));
}
exports.parseData = parseData;
function payloadParser(funcCode, payload) {
switch (funcCode) {
case "0x20":
var types = ["none", "card", "open", "alert"];
var index = payload.readUInt32LE(0);
var type = payload.readUInt8(4);
var allow = payload.readUInt8(5);
var door = payload.readUInt8(6);
var inOut = payload.readUInt8(7);
var cardNo = payload.readUInt32LE(8);
var time = payload.slice(12, 19);
// console.log("[DEBUG] Card No. hex is: ", payload.slice(8, 12));
return {
funcName: funcNames_1.default[funcCode],
index: index,
type: types[type],
allow: !!allow,
door: door,
inOut: inOut === 1 ? "in" : "out",
cardNo: cardNo,
time: parseBcdDate(time)
};
case "0x32":
var date = payload.slice(0, 7);
return {
funcName: funcNames_1.default[funcCode],
date: !!parseBcdDate(date)
};
case "0x40":
return {
funcName: funcNames_1.default[funcCode],
success: payload.readUInt8(0)
};
case "0x50":
return {
funcName: funcNames_1.default[funcCode],
success: !!payload.readUInt8(0)
};
case "0x52":
return {
funcName: funcNames_1.default[funcCode],
success: !!payload.readUInt8(0)
};
case "0x54":
return {
funcName: funcNames_1.default[funcCode],
success: !!payload.readUInt8(0)
};
case "0x5A":
return {
funcName: funcNames_1.default[funcCode],
cardNo: payload.readUInt32LE(0) || null,
from: payload.slice(4, 8).toString("hex"),
to: payload.slice(8, 12).toString("hex")
};
case "0x90":
return {
funcName: funcNames_1.default[funcCode],
success: !!payload.readUInt8(0)
};
case "0x92":
return {
funcName: funcNames_1.default[funcCode],
ip: hexToIp(payload.slice(0, 4).toString("hex")),
port: payload.readUInt16LE(4),
interval: payload.readUInt8(6)
};
case "0x94":
return {
funcName: funcNames_1.default[funcCode],
ip: hexToIp(payload.slice(0, 4).toString("hex")),
subNet: hexToIp(payload.slice(4, 8).toString("hex")),
gateway: hexToIp(payload.slice(8, 12).toString("hex")),
mac: (payload
.slice(12, 18)
.toString("hex")
.toUpperCase()
.match(/.{1,2}/g) || []).join(":"),
version: +payload.slice(18, 20).toString("hex") / 100,
release: payload.slice(20, 24).toString("hex")
};
case "0x96":
return {
funcName: funcNames_1.default[funcCode],
ip: hexToIp(payload.slice(0, 4).toString("hex")),
subNet: hexToIp(payload.slice(4, 8).toString("hex")),
gateway: hexToIp(payload.slice(8, 12).toString("hex"))
};
default:
return {
funcName: "Unknown (" + funcCode + ")",
data: payload
};
}
}
exports.payloadParser = payloadParser;
function parseBcdDate(bcd) {
// console.log("BCD Date:", bcd);
return moment_1.default
.tz(bcd.toString("hex"), "YYYYMMDDHHmmss", "Asia/Shanghai")
.toDate();
}
exports.parseBcdDate = parseBcdDate;
function buildBcdDate(date) {
var str = moment_1.default(date)
.tz("Asia/Shanghai")
.format("YYYYMMDDHHmmss");
return Buffer.from(str, "hex");
}
exports.buildBcdDate = buildBcdDate;
function hexStringToDecArray(hexString) {
var matches = hexString.match(/.{1,2}/g);
if (!matches) {
return [];
}
return matches.map(function (byteString) { return parseInt(byteString, 16); });
}
exports.hexStringToDecArray = hexStringToDecArray;
function decArrayToHexString(decArray) {
var hex = decArray.map(function (d) { return d.toString(16).padStart(2, "0"); }).join("");
return hex;
}
exports.decArrayToHexString = decArrayToHexString;
function ipToHex(ip) {
return decArrayToHexString(ip.split(".").map(function (d) { return +d; }));
}
exports.ipToHex = ipToHex;
function hexToIp(hex) {
return hexStringToDecArray(hex).join(".");
}
exports.hexToIp = hexToIp;