var authMsg = "DIRM010042100000000000011223344350512345678901D6";
var authResult = authorize({}, authMsg, {}, {});
console.log("***", authResult);
function authorize(session, payload, metadata, deviceConfig) {
function byteToString(arr) {
if (typeof arr === 'string') {
return arr;
}
var str = '',
_arr = arr;
for (var i = 0; i < _arr.length; i++) {
var one = _arr[i].toString(2),
v = one.match(/^1+?(?=0)/);
if (v && one.length == 8) {
var bytesLength = v[0].length;
var store = _arr[i].toString(2).slice(7 - bytesLength);
for (var st = 1; st < bytesLength; st++) {
store += _arr[st + i].toString(2).slice(2);
}
str += String.fromCharCode(parseInt(store, 2));
i += bytesLength - 1;
} else {
str += String.fromCharCode(_arr[i]);
}
}
return str;
};
function formatDate(date, fmt) {
let obj = {
'y': date.getFullYear(), // 年份,注意必须用getFullYear
'M': date.getMonth() + 1, // 月份,注意是从0-11
'd': date.getDate(), // 日期
'H': date.getHours(), // 24小时制
'h': date.getHours() % 12 === 0 ? 12 : date.getHours() % 12, // 12小时制
'm': date.getMinutes(), // 分钟
's': date.getSeconds(), // 秒
//'S': date.getMilliseconds() // 毫秒
};
for (let i in obj) {
fmt = fmt.replace(new RegExp(i + '+', 'g'), function (m) {
let val = String(obj[i]);
for (let j = 0, len = val.length; j < m.length - len; j++) {
val = '0' + val;
}
return m.length === 1 ? val : val.substring(val.length - m.length);
});
}
return fmt;
};
function getCheckSum(payload) {
var checkSum = 0;
for (i = 0; i < payload.length; i++) {
checkSum = checkSum + parseInt(payload[i]);
}
return checkSum & 0xff;
};
var result = {};
var payloadStr = byteToString(payload);
console.log(payloadStr);
if (payloadStr.length < 30) {
console.log("payloadStr.length<30,auth failed");
return result;
}
var funcCode = payloadStr.slice(10, 12);
if (funcCode != "10") {
return result;
}
var snum = payloadStr.slice(12, 16);
var deviceId = payloadStr.slice(16, 31);
var imei = payloadStr.slice(31, 46);
result.auth = true;
result.sn = deviceId;
result.category = "AM01";
var timeNow = formatDate(new Date, "yyyyMMddHHmmss");
var bodyStr = "0027" + funcCode + snum + "1" + timeNow;
var bodyStr_ascii = [];
for (i = 0; i < bodyStr.length; i++) {
bodyStr_ascii[i] = bodyStr[i].charCodeAt();
}
var checksum = getCheckSum(bodyStr_ascii).toString(16).toUpperCase();
var ack = "DIRS01" + bodyStr + checksum;
result.ack = ack;
return result;
}
//var str = "DIRM0100440500020000000112233443505123456789011544";//心跳
var str = "DIRM010121090003000000011223344049D4ABA22202210281634530ADB3B922202210281634531ADB3B922202210281634532ADB3B9222022102816345337E";//考勤记录
var result = decode({}, str, {}, {});
console.log(result);
function decode(session, payload, metadata, deviceConfig) {
function byteToString(arr) {
if (typeof arr === 'string') {
return arr;
}
var str = '',
_arr = arr;
for (var i = 0; i < _arr.length; i++) {
var one = _arr[i].toString(2),
v = one.match(/^1+?(?=0)/);
if (v && one.length == 8) {
var bytesLength = v[0].length;
var store = _arr[i].toString(2).slice(7 - bytesLength);
for (var st = 1; st < bytesLength; st++) {
store += _arr[st + i].toString(2).slice(2);
}
str += String.fromCharCode(parseInt(store, 2));
i += bytesLength - 1;
} else {
str += String.fromCharCode(_arr[i]);
}
}
return str;
};
function formatDate(date, fmt) {
let obj = {
'y': date.getFullYear(), // 年份,注意必须用getFullYear
'M': date.getMonth() + 1, // 月份,注意是从0-11
'd': date.getDate(), // 日期
'H': date.getHours(), // 24小时制
'h': date.getHours() % 12 === 0 ? 12 : date.getHours() % 12, // 12小时制
'm': date.getMinutes(), // 分钟
's': date.getSeconds(), // 秒
//'S': date.getMilliseconds() // 毫秒
};
for (let i in obj) {
fmt = fmt.replace(new RegExp(i + '+', 'g'), function (m) {
let val = String(obj[i]);
for (let j = 0, len = val.length; j < m.length - len; j++) {
val = '0' + val;
}
return m.length === 1 ? val : val.substring(val.length - m.length);
});
}
return fmt;
};
function getCheckSum(payload) {
var checkSum = 0;
for (i = 0; i < payload.length; i++) {
checkSum = checkSum + parseInt(payload[i]);
}
return checkSum & 0xff;
};
var result = {};
var payloadStr = byteToString(payload);
console.log(payloadStr);
if (payloadStr.length < 30) {
console.log("payloadStr.length<30,auth failed");
return result;
}
var funcCode = payloadStr.slice(10, 12);
if (funcCode == "05") {
var snum = payloadStr.slice(12, 16);
var deviceId = payloadStr.slice(16, 31);
var imei = payloadStr.slice(31, 46);
result.sn = deviceId;
result.category = "AM01";
var timeNow = formatDate(new Date, "yyyyMMddHHmmss");
var bodyStr = "0027" + funcCode + snum + "1" + timeNow;
var bodyStr_ascii = [];
for (i = 0; i < bodyStr.length; i++) {
bodyStr_ascii[i] = bodyStr[i].charCodeAt();
}
var checksum = getCheckSum(bodyStr_ascii).toString(16).toUpperCase();
var ack = "DIRS01" + bodyStr + checksum;
result.ack = ack;
return result;
} else if (funcCode == "09") {
var snum = payloadStr.slice(12, 16);
var deviceId = payloadStr.slice(16, 31);
result.sn = deviceId;
result.category = "AM01";
var timeNow = formatDate(new Date, "yyyyMMddHHmmss");
var bodyStr = "0013" + funcCode + snum + "1" + timeNow;
var bodyStr_ascii = [];
for (i = 0; i < bodyStr.length; i++) {
bodyStr_ascii[i] = bodyStr[i].charCodeAt();
}
var checksum = getCheckSum(bodyStr_ascii).toString(16).toUpperCase();
var ack = "DIRS01" + bodyStr + checksum;
result.ack = ack;
//var cardNumLow = payload[16];
//var cardNumHeight = payload[15];
var cardNum = Number(payloadStr.slice(31, 33));
console.log(cardNum);
var separator = ",";
var separatorAt = "@";
var cardInfos = "";
if (cardNum > 0) {
if (payload.length < (17 + 23 * cardNum)) {
console.log("payload.length < 17 + 22 * cardNum,failed");
return {};
}
var curNum = 0;
for (var i = 33; i < payloadStr.length && curNum < cardNum; i += 23) {
curNum++;
let cardId = payloadStr.slice(i, i + 8);
let startTime = payloadStr.slice(i + 8, i + 22);
let optType = payloadStr.slice(i + 22, i + 23);
cardInfos += cardId + separator + startTime + separator + optType + separatorAt;
}
if (cardInfos.length > 1) {
cardInfos = cardInfos.slice(0, cardInfos.length - 1);
}
}
var event = {};
event.event = "ReportAttendanceRecords";
event.level = "info";
event.msg = "ReportAttendanceRecords event";
event.meta = {
"sn": deviceId,
"cardNum": cardNum,
"cardInfos": cardInfos,
};
result.event = event;
console.log(event);
return result;
} else {
return result;
}
return result;
}
console