地磁

var ALINK_ID = "10001";
var ALINK_VERSION = "1.00";
var binaryDataBuf = [100];

function decodeErrorHandle(binaryData, errCode) {
    // just a sample to notify error
    var serverTime = dateFormat("yyyy-MM-dd hh:mm:ss", new Date());
    var params = new Object();
    params['HexContext'] = bytes2HexString(binaryData);
    params['ServerTime'] = serverTime;
    params['ErrorCode'] = errCode;

    var jsonMap = new Object();
    jsonMap['version'] = ALINK_VERSION;
    jsonMap['id'] = ALINK_ID;
    jsonMap['params'] = params;
    jsonMap['method'] = 'thing.event.ErrorFrameEvent.post';
    return jsonMap;
}


function decodeCmdResponse(binaryData) {
    var params = new Object();
    var result = 0;
    var unixtime = ((binaryData[4] | ((binaryData[5] & 0xFFFFFFFF) << 8) | ((binaryData[6] & 0xFFFFFFFF) << 16) | ((binaryData[7] & 0xFFFFFFFF) << 24)));
    if (unixtime < 1517457661) {
        unixtime = parseInt(new Date().getTime() / 1000);
    }
    if ((binaryData[3] & 0xFF) == 0x83) {
        if (binaryData[2] < 6) {
            result = 5;
        } else {
            result = (binaryData[8] & 0xFF);
        }
    } 
    else
    if ((binaryData[3] & 0xFF) == 0x81 || (binaryData[3] & 0xFF) == 0x82) {
        if (binaryData[2] < 7) {
            result = 5;
        } else {
            result = (binaryData[9] & 0xFF);
        }
    } 
    else {
        result = 5;
    }
    params['CommandRsp'] = result;
    params['UnixTime'] = unixtime;

    var jsonMap = new Object();
    jsonMap['version'] = ALINK_VERSION;
    jsonMap['id'] = ALINK_ID;
    jsonMap['params'] = params;
    jsonMap['method'] = 'thing.event.CommandRspEvent.post';
    return jsonMap;
}


// Decode as Data Report
function decodeDataReport(binaryData) {
    var servertime = dateFormat("yyyy-MM-dd hh:mm:ss", new Date());
    var unixtime = ((binaryData[4] | ((binaryData[5] & 0xFFFFFFFF) << 8) | ((binaryData[6] & 0xFFFFFFFF) << 16) | ((binaryData[7] & 0xFFFFFFFF) << 24)));
    if (unixtime < 1517457661) {
        unixtime = parseInt(new Date().getTime() / 1000);
    }
    var frame_type = binaryData[3];
    var data_len = binaryData[2];

    if (frame_type == 0x01) {
        if (data_len == 0x11) {
            var params = new Object();
            params['MagneticState'] = binaryData[8];
            params['CarEventCount'] = (binaryData[9] | ((binaryData[10] & 0xFFFF) << 8));
            var x = (binaryData[11] | ((binaryData[12] & 0xFFFF) << 8));
            var y = (binaryData[13] | ((binaryData[14] & 0xFFFF) << 8));
            var z = (binaryData[15] | ((binaryData[16] & 0xFFFF) << 8));
            params['Xaxis'] = x > 32768 ? x - 65535 : x;
            params['Yaxis'] = y > 32768 ? y - 65535 : y;
            params['Zaxis'] = z > 32768 ? z - 65535 : z;
            params['Voltage'] = (binaryData[17] | ((binaryData[18] & 0xFFFF) << 8));
            params['Temperature'] = binaryData[19];
            params['ServerTime'] = servertime;
            params['UnixTime'] = unixtime;
            params['HexContext'] = bytes2HexString(binaryData);

            var jsonMap = new Object();
            jsonMap['version'] = ALINK_VERSION;
            jsonMap['id'] = ALINK_ID;
            jsonMap['params'] = params;
            //jsonMap['method'] = 'thing.event.NotifyEvent.post';
            jsonMap['method'] = 'thing.event.property.post';
            return jsonMap;
        } else {
            return decodeErrorHandle(binaryDatas, 5);
        }
    }
    else
    if (frame_type == 0x02) {
        if (data_len == 0x21) {
            var params = new Object();
            params['MagneticState'] = binaryData[8];
            params['CarEventCount'] = (binaryData[9] | ((binaryData[10] & 0xFFFF) << 8));
            var x = (binaryData[11] | ((binaryData[12] & 0xFFFF) << 8));
            var y = (binaryData[13] | ((binaryData[14] & 0xFFFF) << 8));
            var z = (binaryData[15] | ((binaryData[16] & 0xFFFF) << 8));
            params['Xaxis'] = x > 32768 ? x - 65535 : x;
            params['Yaxis'] = y > 32768 ? y - 65535 : y;
            params['Zaxis'] = z > 32768 ? z - 65535 : z;
            params['Voltage'] = (binaryData[17] | ((binaryData[18] & 0xFFFF) << 8));
            params['Temperature'] = binaryData[19];
            //params['EventType'] = binaryData[20];
            params['ServerTime'] = servertime;
            params['UnixTime'] = unixtime;
            params['HexContext'] = bytes2HexString(binaryData);

            var jsonMap = new Object();
            jsonMap['version'] = ALINK_VERSION;
            jsonMap['id'] = ALINK_ID;
            jsonMap['params'] = params;
            jsonMap['method'] = 'thing.event.HeartbeatEvent.post';
            return jsonMap;
        } else {
            return decodeErrorHandle(binaryDatas, 6);
        }
    }
    else
    if (frame_type == 0x03) {
        if (data_len == 0x21) {
            var params = new Object();
            params['MagneticState'] = binaryData[8];
            params['CarEventCount'] = (binaryData[9] | ((binaryData[10] & 0xFFFF) << 8));
            var x = (binaryData[10] | ((binaryData[11] & 0xFFFF) << 8));
            var y = (binaryData[12] | ((binaryData[13] & 0xFFFF) << 8));
            var z = (binaryData[14] | ((binaryData[15] & 0xFFFF) << 8));
            //params['Xaxis'] = x > 32768 ? x - 65535 : x;
            //params['Yaxis'] = y > 32768 ? y - 65535 : y;
            //params['Zaxis'] = z > 32768 ? z - 65535 : z;
            params['Voltage'] = binaryData[16] * 100;
            params['Temperature'] = binaryData[17];
            params['EventType'] = binaryData[18];
            params['ServerTime'] = servertime;
            params['UnixTime'] = unixtime;
            params['HexContext'] = bytes2HexString(binaryData);

            var jsonMap = new Object();
            jsonMap['version'] = ALINK_VERSION;
            jsonMap['id'] = ALINK_ID;
            jsonMap['params'] = params;
            jsonMap['method'] = 'thing.event.ErrorEvent.post';
            return jsonMap;
        } else {
            return decodeErrorHandle(binaryDatas, 7);
        }
    }
    else
    if (frame_type == 0x04) {
        if (data_len == 0x17) {
            var params = new Object();
            params['HeartbeatCycle'] = binaryData[8];
            params['AlgorithmThreshold'] = binaryData[9];
            params['CaronDelay'] = binaryData[10];
            params['CaroffDelay'] = binaryData[11];
            params['FwVersion'] = binaryData[12];
            params['HwVersion'] = binaryData[13];
            params['RunTime'] = (binaryData[14] | ((binaryData[15] & 0xFFFFFFFF) << 8) | ((binaryData[16] & 0xFFFFFFFF) << 16) | ((binaryData[17] & 0xFFFFFFFF) << 24));
            //params['SuccessC'] = (binaryData[18] | ((binaryData[19] & 0xFFFF) << 8));
            //params['FailureC'] = (binaryData[20] | ((binaryData[21] & 0xFFFF) << 8));
            params['ServerTime'] = servertime;
            params['UnixTime'] = unixtime;
            params['HexContext'] = bytes2HexString(binaryData);

            var jsonMap = new Object();
            jsonMap['version'] = ALINK_VERSION;
            jsonMap['id'] = ALINK_ID;
            jsonMap['params'] = params;
            jsonMap['method'] = 'thing.event.ConfigInfo.post';
            return jsonMap;
        } else {
            return decodeErrorHandle(binaryDatas, 8);
        }
    }
    else
    if (frame_type == 0x05) {
        if (data_len >= 0x01) {
            var params = new Object();
            params['ServerTime'] = servertime;
            params['UnixTime'] = unixtime;
            params['HexContext'] = bytes2HexString(binaryData);

            var jsonMap = new Object();
            jsonMap['version'] = ALINK_VERSION;
            jsonMap['id'] = ALINK_ID;
            jsonMap['params'] = params;
            jsonMap['method'] = 'thing.event.ThroughtPutEvent.post';
            return jsonMap;
        } else {
            return decodeErrorHandle(binaryDatas, 9);
        }
    }
}


/**
 * decode api
 * 
 * 示例数据:
 * 传入参数 ->
 * 7FFE110145AF345B0310007F10910DE80B330E1E
 * 输出结果 ->
 * {"method":"thing.event.property.post", "id":"10001","params":{"LockerState":0,"MagneticState":1,"Xaxis":-31,"Yaxis":698,"Zaxis":-240,"Voltage":3.6,"HexContext":"7FFE0E01FD3E345B0001E1FFBA0210FF24"}, "version":"1.00"}
 * 
 * 示例数据:
 * 传入参数 ->
 * 7FFE2102953C355B001100FDFF2100B5FF3C0E1E006AFC93FF0082B54D092A0172008E80
 * 输出结果 ->
 * {"method":"thing.event.HeartbeatEvent.post","id":"10001","params":{"HexContext":"7ffe2102953c355b001100fdff2100b5ff3c0e1e006afc93ff0082b54d092a0172008e80","Temperature":30,"MagneticState":0,"UnixTime":1530215573,"Voltage":3644,"Zaxis":-74,"CarEventCount":17,"Xaxis":-2,"ServerTime":"2018-07-23 17:28:39","Yaxis":33},"version":"1.00"}
 *
 */
function rawDataToProtocol(binaryData) {
    var uint8Array = new Uint8Array(binaryData.length);
    for (var i = 0; i < binaryData.length; i++) {
        uint8Array[i] = binaryData[i] & 0xFF;
        binaryDataBuf[i] = binaryData[i] & 0xFF;
    }

    // error frame lenth
    var frame_len = binaryData.length;
    if (binaryData.length < 9) {
        return decodeErrorHandle(uint8Array, 1);
    }
    // error frame head
    var frame_fix_head = ((uint8Array[1] & 0xFF)) | (((uint8Array[0] & 0xFF)) << 8);
    if (frame_fix_head != 0x7FFE) {
        return decodeErrorHandle(uint8Array, 2);
    }
    // error data lenth
    var data_len = (uint8Array[2] & 0xFF);
    if (data_len != (frame_len - 3)) {
        return decodeErrorHandle(uint8Array, 3);
    }

    /**
     * 01 -- 上行 | 业务数据
     * 02 -- 上行 | 告警数据
     * 03 -- 上行 | 心跳数据
     * 04 -- 上行 | 配置信息
     * 05 -- 上行 | 透传数据
     * 
     * 
     * 81 -- 下行 | 控制命令
     * 82 -- 下行 | 设置配置
     * 83 -- 下行 | 透传数据
     * 
     */
    var params = {};
    var jsonMap = new Object();
    var frame_type = (uint8Array[3] & 0xFF);
    if ((frame_type == 0x01) || (frame_type == 0x02) || (frame_type == 0x03) || (frame_type == 0x04) || (frame_type == 0x05)) {
        // event data report
        return decodeDataReport(uint8Array);
    } else if ((frame_type == 0x81) || (frame_type == 0x82) || (frame_type == 0x83)) {
        // command response
        return decodeCmdResponse(uint8Array);
    }
    else {
        return decodeErrorHandle(uint8Array, 4);
    }
    jsonMap['version'] = ALINK_VERSION;
    jsonMap['id'] = ALINK_ID;
    jsonMap['params'] = params;
    return jsonMap;
}



// Encode Error Handle
function encodeErrorHandle(errCode) {
    var payloadArray = [];

    // head
    payloadArray = payloadArray.concat(0x7F);
    payloadArray = payloadArray.concat(0xFE);

    // lenth
    payloadArray = payloadArray.concat(0x06);

    // type
    payloadArray = payloadArray.concat(0x80);

    // timestamp
    var timestamp = new Date().getTime() / 1000;
    payloadArray = payloadArray.concat((timestamp >>  0) & 0xFF);
    payloadArray = payloadArray.concat((timestamp >>  8) & 0xFF);
    payloadArray = payloadArray.concat((timestamp >> 16) & 0xFF);
    payloadArray = payloadArray.concat((timestamp >> 24) & 0xFF);

    // error code
    payloadArray = payloadArray.concat(errCode);
    return payloadArray;
}


// Encode As Data Response
function encodeDataRsp(binaryData) {
    var payloadArray = [];

    // head
    payloadArray = payloadArray.concat(0x7F);
    payloadArray = payloadArray.concat(0xFE);

    // lenth
    payloadArray = payloadArray.concat(0x06);

    if (binaryData[2] >= 4) {
        // type 
        payloadArray = payloadArray.concat(binaryData[3]);
        // timestamp
        payloadArray = payloadArray.concat(binaryData[4]);
        payloadArray = payloadArray.concat(binaryData[5]);
        payloadArray = payloadArray.concat(binaryData[6]);
        payloadArray = payloadArray.concat(binaryData[7]);
    } else {
        payloadArray = payloadArray.concat(0x00);
        payloadArray = payloadArray.concat(0x00);
        payloadArray = payloadArray.concat(0x00);
        payloadArray = payloadArray.concat(0x00);
        payloadArray = payloadArray.concat(0x00);
    }
    payloadArray = payloadArray.concat(0x00);
    return payloadArray;
}


/**
 * encode api
 * 
 * 示例数据:
 * 传入参数 ->
 * {"method":"thing.service.NormalSet", "id":"10001", "version":"1.00", "params":{"CommandId":1}}
 * 输出结果 ->
 * 0x7efe0681a661505b01
 * 
 * 传入参数 ->
 * {"method":"thing.service.ConfigSetting", "id":"10001", "version":"1.00", "params":{"HeartbeatCycle":180,"AlgorithmThreshold":100,"CaronDelay":20,"CaroffDelay":10,"AutoLock":1,"AutoDelay":10}}
 * 输出结果 ->
 * 0x7efe10811377505b0ab464140affff00000000
 */
function protocolToRawData(json) {
    var id = json['id'];
    var method = json['method'];
    var version = json['version'];
    var code = json['code'];
    var message = json['message'];
    var payloadArray = [];

    // TODO: this is a common decode rsp
    if ( code == 200 && message == 'success' ) {
        //return encodeDataRsp(binaryDataBuf);
    }

    // TODO: only decode the method = 'thing.service.NormalSet'
    if (method == 'thing.service.NormalSet' ) {
        var params = json['params'];
        var commandid = params['CommandId'];
        // head
        payloadArray = payloadArray.concat(0x7F);
        payloadArray = payloadArray.concat(0xFE);

        // lenth
        payloadArray = payloadArray.concat(0x06);

        // type
        payloadArray = payloadArray.concat(0x81);

        // timestamp
        var timestamp = new Date().getTime() / 1000;
        payloadArray = payloadArray.concat((timestamp >> 0) & 0xFF);
        payloadArray = payloadArray.concat((timestamp >> 8) & 0xFF);
        payloadArray = payloadArray.concat((timestamp >>16) & 0xFF);
        payloadArray = payloadArray.concat((timestamp >>24) & 0xFF);

        // commandid
        if (commandid != null) {
            payloadArray = payloadArray.concat(commandid);
        } else {
            payloadArray = payloadArray.concat(0x00); 
        }
        return payloadArray;
    }
    else
    if (method == 'thing.service.ConfigSetting') {
        var params = json['params'];
        var period = params['HeartbeatCycle'];
        var threshold = params['AlgorithmThreshold'];
        var caron = params['CaronDelay'];
        var caroff = params['CaroffDelay'];
        var autolock = params['AutoLock'];
        var autodelay = params['AutoDelay'];

        // head
        payloadArray = payloadArray.concat(0x7F);
        payloadArray = payloadArray.concat(0xFE);

        // lenth
        payloadArray = payloadArray.concat(0x10);

        // type
        payloadArray = payloadArray.concat(0x81);

        // timestamp
        var timestamp = new Date().getTime() / 1000;
        payloadArray = payloadArray.concat((timestamp >>  0) & 0xFF);
        payloadArray = payloadArray.concat((timestamp >>  8) & 0xFF);
        payloadArray = payloadArray.concat((timestamp >> 16) & 0xFF);
        payloadArray = payloadArray.concat((timestamp >> 24) & 0xFF);

        // fixed
        payloadArray = payloadArray.concat(0x0A);

        // period
        if (period != null) {
            payloadArray = payloadArray.concat(period);
        } else {
            payloadArray = payloadArray.concat(0xFF);
        }
        // threshold
        if (threshold != null) {
            payloadArray = payloadArray.concat(threshold);
        } else {
            payloadArray = payloadArray.concat(0xFF);
        }
        // caron
        if (caron != null) {
            payloadArray = payloadArray.concat(caron);
        } else {
            payloadArray = payloadArray.concat(0xFF);
        }
        // caroff
        if (caroff != null) {
            payloadArray = payloadArray.concat(caroff);
        } else {
            payloadArray = payloadArray.concat(0xFF);
        }
        // autolock
        if (autolock != null) {
            payloadArray = payloadArray.concat(autolock);
        } else {
            payloadArray = payloadArray.concat(0xFF);
        }
        // autodelay
        if (autodelay != null) {
            payloadArray = payloadArray.concat(autodelay);
        } else {
            payloadArray = payloadArray.concat(0xFF);
        }
        // keyid
        payloadArray = payloadArray.concat(0x00);
        payloadArray = payloadArray.concat(0x00);
        // value
        payloadArray = payloadArray.concat(0x00);
        payloadArray = payloadArray.concat(0x00);
        return payloadArray;
    }
    else
    if ( method == 'thing.service.ThroughtPut') {
        var params = json['params'];
        var hexcontext = params['HexContext'];
        if ((hexcontext.length % 2) == 0 && hexcontext.length <= 200 && hexcontext.length >= 2) {
            // head
            payloadArray = payloadArray.concat(0x7F);
            payloadArray = payloadArray.concat(0xFE);

            // lenth
            payloadArray = payloadArray.concat(0x05 + ( hexcontext.length / 2 ));

            // type
            payloadArray = payloadArray.concat(0x83);

            // timestamp
            var timestamp = new Date().getTime() / 1000;
            payloadArray = payloadArray.concat((timestamp >> 0) & 0xFF);
            payloadArray = payloadArray.concat((timestamp >> 8) & 0xFF);
            payloadArray = payloadArray.concat((timestamp >> 16) & 0xFF);
            payloadArray = payloadArray.concat((timestamp >> 24) & 0xFF);

            // throughtput data
            payloadArray = payloadArray.concat(hexString2Bytes(hexcontext));
            return payloadArray;
        } else {
            // head
            payloadArray = payloadArray.concat(0x7F);
            payloadArray = payloadArray.concat(0xFE);

            // lenth
            payloadArray = payloadArray.concat(0x06);

            // type
            payloadArray = payloadArray.concat(0x83);

            // timestamp
            var timestamp = new Date().getTime() / 1000;
            payloadArray = payloadArray.concat((timestamp >>  0) & 0xFF);
            payloadArray = payloadArray.concat((timestamp >>  8) & 0xFF);
            payloadArray = payloadArray.concat((timestamp >> 16) & 0xFF);
            payloadArray = payloadArray.concat((timestamp >> 24) & 0xFF);

            // throughtput data
            payloadArray = payloadArray.concat(0x00);
            return payloadArray;
        }
    }
    else {
        return encodeErrorHandle(1);
    }
}


// misc function
function hexString2Bytes(hexString) {
    var pos = 0;
    var len = hexString.length;
    if (len % 2 != 0) {
        return null;
    }

    len /= 2;
    var bytes = new Array();
    for (var i = 0; i < len; i++) {
        var s = hexString.substr(pos, 2);
        var v = parseInt(s, 16);
        bytes.push(v);
        pos += 2;
    }
    return bytes;
}


function bytes2HexString(bytes) {
    var hexString = "";
    for (var i = 0; i < bytes.length; i++) {
        var tmp = bytes[i].toString(16);
        if (tmp.length == 1) {
            tmp = "0" + tmp;
        }
        hexString += tmp;
    }
    return hexString;
}


function dateFormat(fmt, date) {
    var o = {
        "M+": date.getMonth() + 1,
        "d+": date.getDate(),
        "h+": date.getHours(),
        "m+": date.getMinutes(),
        "s+": date.getSeconds(),
        "q+": Math.floor((date.getMonth() + 3) / 3),
        "S": date.getMilliseconds()
    };
    if (/(y+)/.test(fmt))
        fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
    for (var k in o)
        if (new RegExp("(" + k + ")").test(fmt))
            fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
    return fmt;
}


// utils function
function buffer_uint8(value) {
    var uint8Array = new Uint8Array(1);
    var dv = new DataView(uint8Array.buffer, 0);
    dv.setUint8(0, value);
    return [].slice.call(uint8Array);
}

function buffer_int16(value) {
    var uint8Array = new Uint8Array(2);
    var dv = new DataView(uint8Array.buffer, 0);
    dv.setInt16(0, value);
    return [].slice.call(uint8Array);
}

function buffer_int32(value) {
    var uint8Array = new Uint8Array(4);
    var dv = new DataView(uint8Array.buffer, 0);
    dv.setInt32(0, value);
    return [].slice.call(uint8Array);
}

function buffer_float32(value) {
    var uint8Array = new Uint8Array(4);
    var dv = new DataView(uint8Array.buffer, 0);
    dv.setFloat32(0, value);
    return [].slice.call(uint8Array);
}

猜你喜欢

转载自www.cnblogs.com/zclaude/p/10542724.html
今日推荐