SOURCE



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 命令行工具 X clear

                    
>
console