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
今日推荐
周排行