Commit c9620c5e by twb

Add new file

parent 4866dd4b
var UP_RAW_VERSION = 0x00;//上报的版本
var UP_RAW_CMD = 0x12;//上报的指令
var DOWN_RAW_VERSION = 0x00;//下发的版本
var DOWN_RAW_CMD = 0x11;//下发的指令
var UP_RAW_HEAD = 0xd0;//下发指令头部
var DOWN_RAW_HEAD = 0xd1;//上报指令头部
var THING_ATTRIBUTE_GET_CMD = 0x00,THING_ATTRIBUTE_GET = "thing.attribute.get";
var THING_ATTRIBUTE_SET_CMD = 0x01,THING_ATTRIBUTE_SET = "thing.attribute.set";
var THING_ATTRIBUTE_POST_CMD = 0x02,THING_ATTRIBUTE_POST = "thing.attribute.post";
var THING_ATTRIBUTE_ADJUST_CMD = 0x03,THING_ATTRIBUTE_ADJUST = "thing.attribute.adjust";
var THING_EVENT_POST_CMD = 0x04,THING_EVENT_POST = "thing.event.post";
var THING_SERVICE_INVOKE_CMD = 0x05,THING_SERVICE_INVOKE = "thing.service.invoke";
var THING_SERVICE_RESPONSE_CMD = 0x06,THING_SERVICE_RESPONSE = "thing.service.response";
var VERSION = '1.0.0';
var structStartId = 30;
var PP_TYPE = {
PROTOCOL_PROP_TYPE_BOOL: 0,
PROTOCOL_PROP_TYPE_INT8: 1,
PROTOCOL_PROP_TYPE_UINT8: 2,
PROTOCOL_PROP_TYPE_INT16: 3,
PROTOCOL_PROP_TYPE_UINT16: 4,
PROTOCOL_PROP_TYPE_INT32: 5,
PROTOCOL_PROP_TYPE_UINT32: 6,
PROTOCOL_PROP_TYPE_INT64: 7,
PROTOCOL_PROP_TYPE_UINT64: 8,
PROTOCOL_PROP_TYPE_FLOAT32: 9,
PROTOCOL_PROP_TYPE_FLOAT64: 10,
PROTOCOL_PROP_TYPE_STRING: 11,
PROTOCOL_PROP_TYPE_DATE: 12,
PROTOCOL_PROP_TYPE_STRUCT:13
};
var g_attrAry = [
"powerstate",
"mode",
"localRecipe",
"lefttime",
"ReserveLeftTime",
"keepWarmTime",
"errorCode",
"workstatus",
"Time",
"steamingTime",
"mixingTime",
"temperature",
"targetTemperature",
"workSwitch",
"cloudRecipeStatus",
"runTime",
"opreationName",
];
var g_attrTypeMap = {
powerstate:{
attrID:0,
protocolType:PP_TYPE.PROTOCOL_PROP_TYPE_BOOL
},
mode:{
attrID:1,
protocolType:PP_TYPE.PROTOCOL_PROP_TYPE_INT8,
swap:{//mcu属性值与天猫精灵属性值的映射关系
0:332,//待机模式:332
1:161,//清洗模式:161
2:503,//自动搅拌模式:503
3:492,//蒸煮模式:492
4:376,//煮沸模式:376
5:477,//辅食模式:477
6:494,//米糊模式:494
7:502,//全自动蒸煮搅拌模式:502
}
},
localRecipe:{
attrID:2,
protocolType:PP_TYPE.PROTOCOL_PROP_TYPE_INT8,
swap:{//mcu属性值与天猫精灵属性值的映射关系
0:0,//无:0
1:11,//宝宝粥:11
2:120,//米糊:120
3:369,//萝卜泥:369
4:370,//苹果泥:370
5:371,//香蕉泥:371
6:372,//土豆牛肉泥:372
7:373,//菠萝泥:373
8:374,//牛奶香蕉泥:374
9:375,//海鲜虾泥:375
10:376,//田园土豆泥:376
11:377,//菠菜南瓜泥:377
12:378,//淮山玉米泥:378
13:379,//冬瓜肉泥粥:379
14:380,//猪肝青菜粥:380
15:381,//牛肉燕麦粥:381
16:386,//果泥:386
17:387,//菜泥:387
18:388,//鱼泥:388
19:389,//瓜泥:389
20:390,//肉泥:390
21:18,//煮米饭:18
}
},
lefttime:{
attrID:3,
length:2,
protocolType:PP_TYPE.PROTOCOL_PROP_TYPE_INT64
},
ReserveLeftTime:{
attrID:4,
length:2,
protocolType:PP_TYPE.PROTOCOL_PROP_TYPE_INT64
},
keepWarmTime:{
attrID:5,
length:2,
protocolType:PP_TYPE.PROTOCOL_PROP_TYPE_FLOAT64,
precise:null
},
errorCode:{
attrID:6,
protocolType:PP_TYPE.PROTOCOL_PROP_TYPE_INT8
},
workstatus:{
attrID:7,
protocolType:PP_TYPE.PROTOCOL_PROP_TYPE_INT8,
swap:{//mcu属性值与天猫精灵属性值的映射关系
0:3,//待机:3
1:29,//工作:29
2:5,//预约:5
3:6,//保温:6
4:22,//预热:22
5:25,//加热:25
6:50,//缺水:50
7:89,//蒸食中:89
8:90,//蒸食完成:90
9:91,//搅拌中:91
10:92,//搅拌完成:92
}
},
Time:{
attrID:8,
length:2,
protocolType:PP_TYPE.PROTOCOL_PROP_TYPE_STRING
},
steamingTime:{
attrID:9,
protocolType:PP_TYPE.PROTOCOL_PROP_TYPE_INT64
},
mixingTime:{
attrID:10,
protocolType:PP_TYPE.PROTOCOL_PROP_TYPE_INT64
},
targetTemperature:{
attrID:11,
protocolType:PP_TYPE.PROTOCOL_PROP_TYPE_FLOAT64,
precise:null
},
temperature:{
attrID:12,
protocolType:PP_TYPE.PROTOCOL_PROP_TYPE_FLOAT64,
precise:null
},
workSwitch:{
attrID:13,
protocolType:PP_TYPE.PROTOCOL_PROP_TYPE_INT8,
swap:{//mcu属性值与天猫精灵属性值的映射关系
0:0,//关闭:0
1:1,//打开:1
2:2,//暂停:2
3:3,//继续:3
4:4,//寻找:4
}
},
cloudRecipeStatus:{
attrID:14,
protocolType:PP_TYPE.PROTOCOL_PROP_TYPE_INT8,
swap:{//mcu属性值与天猫精灵属性值的映射关系
0:0,//结束:0
1:1,//开始:1
}
},
runTime:{
attrID:15,
length:3,
protocolType:PP_TYPE.PROTOCOL_PROP_TYPE_INT64
},
opreationName:{
attrID:16,
protocolType:PP_TYPE.PROTOCOL_PROP_TYPE_STRING
},
};
var g_serviceArray = [];
var g_serviceDataMap = {
};
var g_eventArray = ["hardwareReset","cloudRecipeStepDoneEvent","deviceSideOperationEvent"];
var g_eventDataMap = {
hardwareReset:{
outputData:{
},
eventID:0,
outputArray:[]
},
cloudRecipeStepDoneEvent:{
outputData:{
},
eventID:1,
outputArray:[]
},
deviceSideOperationEvent:{
outputData:{
"opreationName": {
attrID:16,
size:1,
protocolType:PP_TYPE.PROTOCOL_PROP_TYPE_STRING
}
},
eventID:2,
outputArray:[
"opreationName"
]
},
};
var g_structDataMap = {
};
function protocolToRawData(json)
{
log('------------------------ protocolToRawData start ------------------------');
var params = json['params'];
var method = json['method'];
var id = json['id'];
var attrID = [0], v, string = '', charList = '', type = 0;
var attrKey = []
var payloadArray = [];
console.log('method',method,THING_ATTRIBUTE_GET,attrID,params)
if (method == THING_ATTRIBUTE_GET)
{
payloadArray.push(THING_ATTRIBUTE_GET_CMD); // GET BYTE -> 0x01
payloadArray = payloadArray.concat(buffer_uint32(id)); // ID UINT32 -> id
for (var i = 0; i < params.length; i++) {
attrID[i] = g_attrTypeMap[params[i]].attrID;
attrKey[i] = g_attrTypeMap[params[i]];
payloadArray.push(attrID);
log(params[i] + " " + attrID);
}
}
else if (method == THING_ATTRIBUTE_SET)
{
// payloadArray.push(THING_ATTRIBUTE_SET_CMD); //payload cmd
// payloadArray = payloadArray.concat(buffer_uint32(id)); // ID UINT32 -> id
// {
// var key = params[index];
// }
for (var key in params)
// for (var index = 0; index < params.length; index++)
{
// var key = params[index];
let index=Object.keys(params).indexOf(key);
log('g_attrTypeMap[key]',g_attrTypeMap,key)
type = g_attrTypeMap[key].protocolType;
attrID[index] = g_attrTypeMap[key].attrID ;
v = params[key].toString(10)
if(g_attrTypeMap[key].hasOwnProperty('swap')){
v = byte_swap(g_attrTypeMap[key].swap,v);
}
// if (type == PP_TYPE.PROTOCOL_PROP_TYPE_UINT16)
// {
// var strVal = [];
// var v_tostring = parseInt(v).toString(16);
// var v_repair = PrefixZero(v_tostring,4);
// var strVal1 = hex2int(v_repair.slice(0,2))
// var strVal2 = hex2int(v_repair.slice(2,4))
// payloadArray = payloadArray.concat(strVal1)
// payloadArray = payloadArray.concat(strVal2)
// // log("v_repair",v_repair)
// // log("payloadArray",payloadArray)
// }else{
// payloadArray = payloadArray.concat(v);
// }
if (type == PP_TYPE.PROTOCOL_PROP_TYPE_STRUCT)
{
var strVal = [];
var strJson = params[key];
var structMemb = g_structDataMap[key];
var itemData = structMemb.item;
var itemArray = structMemb.itemArray;
for (var i = 0; i < itemArray.length; i++)
{
var elemName = itemArray[i];
var item = itemData[elemName];
var ptype = item.protocolType;
/* string固定字节 */
if (ptype == PP_TYPE.PROTOCOL_PROP_TYPE_STRING)
{
string = unescape(encodeURIComponent(strJson[elemName]));
charList = string.split('');
var uint8Arrays = [];
for (var j = 0; j < charList.length; j++)
{
uint8Arrays.push(charList[j].charCodeAt(0));
}
for (; j < item.size; j++)
{
uint8Arrays.push(0);
}
strVal = strVal.concat(uint8Arrays);
}
else
{
v = buffer_dynamic(strJson[elemName], ptype);
// log(elemName + " : " + typeof(strJson[elemName]) + " " + strJson[elemName]);
// log(ptype + " " + attrID + " " + v.toString('hex'));
strVal = strVal.concat(v);
}
}
payloadArray.push(type);
payloadArray.push(attrID[index]);
payloadArray = payloadArray.concat(strVal);
continue;
}
if (key!='localRecipe') {
v = Number(v).toString(16)
}
payloadArray = payloadArray.concat(v);
log("v",v,key,payloadArray)
}
}
else if (method == THING_SERVICE_INVOKE)
{
payloadArray.push(THING_SERVICE_INVOKE_CMD); //payload cmd
payloadArray = payloadArray.concat(buffer_uint32(id)); // ID UINT32 -> id
var serviceName = json['serviceName'];
var inputData = params;
var serviceItem = g_serviceDataMap[serviceName];
var inputArray = serviceItem.inputArray;
var inputData = serviceItem.inputData;
payloadArray.push(serviceItem.serviceID);
for (var key in serviceItem.inputArray)
{
var strval = [];
var inputparamName = inputArray[key];
type = inputData[inputparamName].protocolType;
if (type == PP_TYPE.PROTOCOL_PROP_TYPE_STRING)
{
string = unescape(encodeURIComponent(inputData[inputparamName]));
charList = string.split('');
var uint8Array = [];
for (var j = 0; j < charList.length; j++)
{
uint8Array.push(charList[j].charCodeAt(0));
}
for (; j < params[key].size; j++)
{
uint8Array.push(0);
}
strval = strval.concat(uint8Array);
}
else
{
var value = buffer_dynamic(inputData[inputparamName], type);
log(key + " : " + value + " " + params[key]);
log(type + " " + " 0x" + value.toString('hex'));
strval = strval.concat(value);
}
payloadArray = payloadArray.concat(strval);
}
}
else
{
//do nothing
return;
}
var str = []
for (let i = 0; i < payloadArray.length; i++) {
if (payloadArray[i].length%2) {
payloadArray[i] = (Array(payloadArray[i].length+1).join(0) + payloadArray[i]).slice(-payloadArray[i].length-1);
}
}
// var a = payloadArray[0];
// if(a.length%2!=0){
// a = (Array(a.length+1).join(0) + a).slice(-a.length-1)
// }
// log('a===================',a)
// for(var i=0,len=a.length/2;i<len;i++) {
// str[i] = a.substr(i*2,2);
// payloadArray[i] = str[i];
// }
log('payloadArray',payloadArray,attrID)
let retBufferLength=1;
for (const attrkey of attrID) {
log('attrkey',attrkey)
if (attrkey==4) {
retBufferLength=retBufferLength+3
}else if (attrkey==15) {
retBufferLength=retBufferLength+4
}else{
retBufferLength=retBufferLength+2
}
}
log('retBufferLength',retBufferLength,attrID)
var retBuffer = new Uint8Array(retBufferLength); //head length ver cmd payload checksum
//var dv = new DataView(retBuffer.buffer, 0);
// retBuffer[0] = id; //云端tid
// retBuffer[1] = attrID; //attrID
// retBuffer[0] = attrID; //attrID
// log("v1",retBuffer)
// for (var i = 0; i < payloadArray.length; i++){
// payloadArray[i] = parseInt(payloadArray[i],16)
// retBuffer[i + 1] = payloadArray[i];
// }
log("v1",attrID)
log("v1",payloadArray)
let attr_id=0
var messageLength=0;
var arrtLength=0;
retBuffer[0] = id;
for (var i = 0; i < attrID.length; i++){
retBuffer[i+arrtLength+1] = parseInt(attrID[i],16);
// retBuffer[i+arrtLength+1] = attrID[i];
// payloadArray[i] = parseInt(payloadArray[i],16)
log("payloadArray[i]================", attrID[i], payloadArray[i],payloadArray[i].length)
if (payloadArray[i].length/2>1) {
for (let j = 0; j < payloadArray[i].length/2; j++) {
if(attrID[i]==15) {
retBuffer[i+arrtLength+j+3] = parseInt(payloadArray[i].substr(j*2,2),16);
} else {
retBuffer[i+arrtLength+j+2] = parseInt(payloadArray[i].substr(j*2,2),16);
}
}
}else{
if (attrID[i]==4) {
retBuffer[i+arrtLength+2] = parseInt(0,16);
retBuffer[i+arrtLength+3] = parseInt(payloadArray[i],16);
} else if(attrID[i]==15) {
retBuffer[i+arrtLength+2] = parseInt(0,16);
retBuffer[i+arrtLength+3] = parseInt(0,16);
retBuffer[i+arrtLength+4] = parseInt(payloadArray[i],16);
} else {
retBuffer[i+arrtLength+2] = parseInt(payloadArray[i],16);
}
}
// retBuffer[i+messageLength + 1] = payloadArray[i];
if (attrID[i]==4) {
arrtLength++
}
attr_id++
arrtLength++
// log("payloadArray[i]",arrtLength)
// if (i==arrtLength) {
// retBuffer[i] = attrID[attr_id];
// if (attrID[attr_id]==4) {
// arrtLength=arrtLength+2
// }
// log("arrtLength1===========================",attrID[attr_id],arrtLength)
// attr_id++
// arrtLength++
// // payloadArray[i] = parseInt(payloadArray[i],16)
// // retBuffer[i+messageLength + 1] = payloadArray[i];
// // // messageLength++
// // if (attrID[i+messageLength]==4) {
// // messageLength= messageLength+2
// // } else {
// // messageLength++
// // }
// } else {
// log("arrtLength2++++++++++++++++++++++++++++++++",arrtLength)
// payloadArray[i] = parseInt(payloadArray[i],16)
// retBuffer[i] = payloadArray[i];
// }
}
// var messageLength=0;
// for (var i = 0; i < payloadArray.length; i++){
// log("i+messageLength",i+messageLength)
// log("payloadArray[i]",messageLength,payloadArray[messageLength])
// retBuffer[i+messageLength] = attrID[i+messageLength];
// payloadArray[i] = parseInt(payloadArray[i],16)
// retBuffer[i+messageLength + 1] = payloadArray[i];
// // messageLength++
// if (attrID[i+messageLength]==4) {
// messageLength= messageLength+2
// } else {
// messageLength++
// }
// // log("v1",retBuffer)
// }
log("3124124124124123",retBuffer)
// return [].slice.call(retBuffer);
let test = [].slice.call(retBuffer);
test.unshift(id);
return test;
}
//02属性 04事件
// var bytes = [0xC3,0x04,0x01,0x01];
// var bytes = [0xC3,0x04,0x01,0x01];
// var bytes = [0xC3,0x04,0x02,0x30,0x04];
// var bytes = [0xC3,0x02,0x01,0x03,0x00,0xff,0x01,0x01,0x86,0xa0,0x01,0x86,0x9f,0xff,0xff,0xff,0xff,0xc8,0x95];
// var test_printf = rawDataToProtocol(bytes)
// log(test_printf)
function rawDataToProtocol(bytes)
{
//log('------------------------ rawDataToProtocol start ------------------------');
var itype = 0;
var new_array = [];
var params = {};
new_array = [].slice.call(bytes);//转换为可操作的数组
log('new_array.length',new_array.length)
// var buffer = new Uint8Array(new_array.length);
var buffer = new Uint8Array(new_array.length - 1);
// for (var i = 0; i < new_array.length; i++)
// {
// buffer[i] = new_array[i] & 0xff;
// }
buffer[0] = new_array[0] & 0xff;
for (var i = 2; i < new_array.length; i++)
{
buffer[i - 1] = new_array[i] & 0xff;
}
var dv = new DataView(buffer.buffer, 0);
var c_id = buffer[0];//tid
var c_length = bytes.length-1;
var jsonMap = new Object();
var c_method = new_array[1];
var offset = 1; //payload data域
// var c_method = 2;
console.log('c_method',c_method,buffer)
if (c_method == THING_ATTRIBUTE_GET_CMD) //GET
{
jsonMap['method'] = THING_ATTRIBUTE_POST;
var params = {};
var loop = c_length;
if (loop == 0)
{
log('data input err.');
return null;
}
jsonMap['params'] = params;
}
else if (c_method == THING_ATTRIBUTE_POST_CMD) //report
{
params[g_attrAry[0]] = buffer[1];//powerstate
params[g_attrAry[1]] = json_swap(g_attrTypeMap.mode.swap,buffer[2]);//mode
params[g_attrAry[2]] = json_swap(g_attrTypeMap.localRecipe.swap,buffer[3]);//localRecipe
params[g_attrAry[3]] = dv.getUint16(4,0);//lefttime
params[g_attrAry[4]] = dv.getUint16(6,0);//ReserveLeftTime
params[g_attrAry[5]] = dv.getUint16(12,0);//keepWarmTime
params[g_attrAry[6]] = buffer[8];//errorCode
params[g_attrAry[7]] = json_swap(g_attrTypeMap.workstatus.swap,buffer[9]);//workstatus
params[g_attrAry[8]] = dv.getUint16(10,0);//Time
params[g_attrAry[9]] = buffer[14];//steamingTime
params[g_attrAry[10]] = buffer[15];//mixingTime
params[g_attrAry[11]] = buffer[16];//temperature
params[g_attrAry[12]] = buffer[17];//targetTemperature
console.log('temperature',g_attrAry[12],buffer[17]);
params[g_attrAry[13]] = buffer[18];//workSwitch
params[g_attrAry[14]] = buffer[19];//cloudRecipeStatus
jsonMap['method'] = THING_ATTRIBUTE_POST;
var loop = c_length;
if (loop == 0)
{
log('data input err');
return null;
}
jsonMap['params'] = params;
}
else if (c_method == THING_SERVICE_RESPONSE_CMD)//service
{
var serviceID = buffer[offset++];
var serviceName = g_serviceArray[serviceID];
var serviceData = g_serviceDataMap[serviceName];
var outputData = serviceItem.outputData;
var outputArray = serviceData.outputArray;
var outputDataJson = {};
for (var i = 0; i < outputArray.length; i++)
{
var itemName = outputArray[i];
var item = outputData[itemName];
itype = item.protocolType;
if (itype == PP_TYPE.PROTOCOL_PROP_TYPE_STRING)
{
var string_v = type_string(buffer, offset, item.size);
outputDataJson[itemName] = string_v.value;
offset += item.size;
}
else
{
var payloadObj = type_dynamic_with_param(buffer, dv, offset, itype, item.precise);
offset += payloadObj.length;
if (itype >= PP_TYPE.PROTOCOL_PROP_TYPE_BOOL && itype <= PP_TYPE.PROTOCOL_PROP_TYPE_UINT64)
{
outputDataJson[itemName] = parseInt(payloadObj.value.toString());
}
else
{
outputDataJson[itemName] = payloadObj.value;
}
}
}
jsonMap['method'] = THING_SERVICE_RESPONSE;
jsonMap['serviceName'] = serviceName;
jsonMap['params'] = outputDataJson;
}
else if (c_method == THING_EVENT_POST_CMD)
{
var evntID = buffer[offset++];
var eventName = g_eventArray[evntID];
log('eventName',eventName)
var eventItem = g_eventDataMap[eventName];
var outputData = eventItem.outputData;
var outputArray = eventItem.outputArray;
var outputDataJson = {};
for (var i = 0; i < outputArray.length; i++)
{
var itemName = outputArray[i];
var item = outputData[itemName];
itype = item.protocolType;
if (itype == PP_TYPE.PROTOCOL_PROP_TYPE_STRING)
{
console.log(buffer, offset, item);
var string_v = type_string(buffer, offset, item.size);
console.log(string_v);
outputDataJson[itemName] = string_v.value;
offset += item.size;
}
else
{
var payloadObj = type_dynamic_with_param(buffer, dv, offset, itype, item.precise);
offset += payloadObj.length;
if (itype >= PP_TYPE.PROTOCOL_PROP_TYPE_BOOL && itype <= PP_TYPE.PROTOCOL_PROP_TYPE_UINT64)
{
outputDataJson[itemName] = parseInt(payloadObj.value.toString());
}
else
{
outputDataJson[itemName] = payloadObj.value;
}
}
}
jsonMap['method'] = THING_EVENT_POST;
jsonMap['eventName'] = eventName;
jsonMap['params'] = outputDataJson;
}
else
{
//do nothing
return null;
}
jsonMap['id'] = '' + c_id;
jsonMap['version'] = VERSION;
log("finished: " + JSON.stringify(jsonMap));
log('------------------------ rawDataToProtocol end ------------------------');
return jsonMap;
}
function log(){
try{
console.log.apply(console, arguments);
} catch (e){
}
try{
print.apply(print, arguments);
} catch (e){
}
};
function json_swap(map,v){//byte->json
var _swap = {}
_swap = map[v]
return _swap
}
function byte_swap(map,v){//json->byte
var _swap = {}
for(var key in map){
_swap[map[key]] = key
}
_swap = _swap[v]
return _swap
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
function type_uint8(dv, offset) { return {"value":dv.getUint8(offset), "length":1};}
function type_int8(dv, offset) { return {"value":dv.getInt8(offset), "length":1};}
function type_uint16(dv, offset) { return {"value":dv.getUint16(offset), "length":2};}
function type_int16(dv, offset) { return {"value":dv.getInt16(offset), "length":2};}
function type_int32(dv, offset) { return {"value":dv.getInt32(offset), "length":4};}
function type_uint32(dv, offset) { return {"value":dv.getUint32(offset), "length":4};}
function type_int64(dv, offset)
{
var low = dv.getUint32(offset + 4);
var n = dv.getUint32(offset) * 4294967296.0 + low;
if (low < 0) n += 4294967296;
return {"value":n, "length":8};
}
function type_uint64(dv, offset)
{
var low = dv.getUint32(offset + 4);
var n = dv.getUint32(offset) * 4294967296.0 + low;
if (low < 0) n += 4294967296;
return {"value":n, "length":8};
}
function type_float(dv, offset)
{
return {"value":dv.getFloat32(offset), "length":4};
}
function type_double(dv, offset)
{
return {"value":dv.getFloat64(offset), "length":8};
}
function type_string(bytes, offset, length)
{
var value = String.fromCharCode.apply(null, bytes.subarray(offset, offset + length));
var endIndex = value.indexOf('\u0000', 0);
if (endIndex >= 0)
value = value.substr(0, endIndex);
return {"value":value, "length":length};
}
// [typeID -> byte] [attrID -> byte] [value -> dynamic]
// [typeID -> byte] [attrID -> byte] [length -> int16] [value -> dynamic]
function type_dynamic_with_param(bytes, dataview, offset, typeID, precise)
{
var tmpOffset = offset;
var value = null, v = 0;
if (typeID == PP_TYPE.PROTOCOL_PROP_TYPE_BOOL)
{
v = type_uint8(dataview, tmpOffset);
tmpOffset += v.length;
value = v.value;
}
else if (typeID == PP_TYPE.PROTOCOL_PROP_TYPE_INT8)
{
v = type_int8(dataview, tmpOffset);
tmpOffset += v.length;
value = v.value;
}
else if (typeID == PP_TYPE.PROTOCOL_PROP_TYPE_UINT8)
{
v = type_uint8(dataview, tmpOffset);
tmpOffset += v.length;
value = v.value;
}
else if (typeID == PP_TYPE.PROTOCOL_PROP_TYPE_INT16)
{
v = type_int16(dataview, tmpOffset);
tmpOffset += v.length;
value = v.value;
}
else if (typeID == PP_TYPE.PROTOCOL_PROP_TYPE_UINT16)
{
v = type_uint16(dataview, tmpOffset);
tmpOffset += v.length;
value = v.value;
}
else if (typeID == PP_TYPE.PROTOCOL_PROP_TYPE_INT32)
{
v = type_int32(dataview, tmpOffset);
tmpOffset += v.length;
value = v.value;
}
else if (typeID == PP_TYPE.PROTOCOL_PROP_TYPE_UINT32)
{
v = type_uint32(dataview, tmpOffset);
tmpOffset += v.length;
value = v.value;
}
else if (typeID == PP_TYPE.PROTOCOL_PROP_TYPE_FLOAT32)
{
v = type_float(dataview, tmpOffset);
tmpOffset += v.length;
value = parseFloat(v.value.toFixed(precise));
}
else if (typeID == PP_TYPE.PROTOCOL_PROP_TYPE_FLOAT64)
{
v = type_double(dataview, tmpOffset);
tmpOffset += v.length;
value = parseFloat(v.value.toFixed(precise));
}
else if (typeID == PP_TYPE.PROTOCOL_PROP_TYPE_STRING)
{
var strLength = type_int16(dataview, tmpOffset);
tmpOffset += strLength.length;
var string_v = type_string(bytes, tmpOffset, strLength.value);
value = string_v.value;
tmpOffset += string_v.length;
}
else if (typeID == PP_TYPE.PROTOCOL_PROP_TYPE_INT64)
{
var timestamp_v = type_int64(dataview, tmpOffset);
tmpOffset += timestamp_v.length;
value = timestamp_v.value;
}
else if (typeID == PP_TYPE.PROTOCOL_PROP_TYPE_UINT64)
{
var timestamp_v = type_uint64(dataview, tmpOffset);
tmpOffset += timestamp_v.length;
value = timestamp_v.value;
}
else if (typeID == PP_TYPE.PROTOCOL_PROP_TYPE_DATE)
{
var date_v = type_uint64(dataview, tmpOffset);
tmpOffset += date_v.length;
value = date_v.value.toString();
}
return {"value":value, "length":tmpOffset - offset};
}
function type_dynamic(bytes, dataview, offset)
{
var tmpOffset = new Number(offset);
var attrID = bytes[tmpOffset++];
var attribute = g_attrAry[attrID];
var typeID = g_attrTypeMap[attribute].protocolType;
var precise = 0;
var attrName = g_attrAry[attrID];
var attrItem = g_attrTypeMap[attrName];
if (typeID == PP_TYPE.PROTOCOL_PROP_TYPE_FLOAT32 || typeID == PP_TYPE.PROTOCOL_PROP_TYPE_FLOAT64)
{
precise = 2; //默认2位
}
var v = type_dynamic_with_param(bytes, dataview, tmpOffset, typeID, precise);
if (typeID >= PP_TYPE.PROTOCOL_PROP_TYPE_BOOL && typeID <= PP_TYPE.PROTOCOL_PROP_TYPE_UINT64)
{
return {"value":parseInt(v.value.toString()), "length":(2 + v.length), attrID:attrID};
}
else
{
return {"value":v.value, "length":(2 + v.length), attrID:attrID};
}
}
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_int8(value)
{
var uint8Array = new Uint8Array(1);
var dv = new DataView(uint8Array.buffer, 0);
dv.setInt8(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_uint16(value)
{
var uint8Array = new Uint8Array(2);
var dv = new DataView(uint8Array.buffer, 0);
dv.setUint16(0, value);
return [].slice.call(uint8Array);
}
function buffer_uint32(value)
{
var uint8Array = new Uint8Array(4);
var dv = new DataView(uint8Array.buffer, 0);
dv.setUint32(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_int64(value)
{
//Number.MAX_SAFE_INTEGER
var local_MAX_UINT32 = 0xFFFFFFFF;
var big = ~~(value / local_MAX_UINT32);
var low = (value % local_MAX_UINT32) - big;
var uint8Array = new Uint8Array(8);
var dv = new DataView(uint8Array.buffer, 0);
dv.setInt32(0, big);
dv.setInt32(4, low);
return [].slice.call(uint8Array);
}
function buffer_uint64(value)
{
//Number.MAX_SAFE_INTEGER
var local_MAX_UINT32 = 0xFFFFFFFF;
var big = ~~(value / local_MAX_UINT32);
var low = (value % local_MAX_UINT32) - big;
var uint8Array = new Uint8Array(8);
var dv = new DataView(uint8Array.buffer, 0);
dv.setUint32(0, big);
dv.setUint32(4, low);
return [].slice.call(uint8Array);
}
function buffer_float(value)
{
var uint8Array = new Uint8Array(4);
var dv = new DataView(uint8Array.buffer, 0);
dv.setFloat32(0, value);
return [].slice.call(uint8Array);
}
function buffer_double(value)
{
var uint8Array = new Uint8Array(8);
var dv = new DataView(uint8Array.buffer, 0);
dv.setFloat64(0, value);
return [].slice.call(uint8Array);
}
function buffer_string(value)
{
var string = unescape(encodeURIComponent(value));
var charList = string.split('');
var uint8Array = new Array();
for (var i = 0; i < charList.length; i++) {
uint8Array.push(charList[i].charCodeAt(0));
}
var byteLength = uint8Array.length;
return [].concat(buffer_int16(byteLength), uint8Array);
}
function buffer_dynamic(value, typeID)
{
if (typeID == PP_TYPE.PROTOCOL_PROP_TYPE_BOOL)
{
return buffer_uint8(value);
}
else if (typeID == PP_TYPE.PROTOCOL_PROP_TYPE_INT8)
{
return buffer_int8(value);
}
else if (typeID == PP_TYPE.PROTOCOL_PROP_TYPE_UINT8)
{
return buffer_uint8(value);
}
else if (typeID == PP_TYPE.PROTOCOL_PROP_TYPE_INT16)
{
return buffer_int16(value);
}
else if (typeID == PP_TYPE.PROTOCOL_PROP_TYPE_UINT16)
{
return buffer_uint16(value);
}
else if (typeID == PP_TYPE.PROTOCOL_PROP_TYPE_INT32)
{
return buffer_int32(value);
}
else if (typeID == PP_TYPE.PROTOCOL_PROP_TYPE_UINT32)
{
return buffer_uint32(value);
}
else if (typeID == PP_TYPE.PROTOCOL_PROP_TYPE_INT64)
{
return buffer_int64(value);
}
else if ((typeID == PP_TYPE.PROTOCOL_PROP_TYPE_UINT64)
|| (typeID == PP_TYPE.PROTOCOL_PROP_TYPE_DATE))
{
return buffer_uint64(value);
}
else if (typeID == PP_TYPE.PROTOCOL_PROP_TYPE_FLOAT32)
{
return buffer_float(value);
}
else if (typeID == PP_TYPE.PROTOCOL_PROP_TYPE_FLOAT64)
{
return buffer_double(value);
}
else if (typeID == PP_TYPE.PROTOCOL_PROP_TYPE_STRING)
{
return buffer_string(value);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment