const MAGIC=0xdead; const PKT_TYPE=function(){ var len = 0; return { PKT_TYPE_ACK:len++, PKT_TYPE_PARAS:len++, PKT_TYPE_POWER_CH:len++, //power_ch_t PKT_TYPE_POWER_TOTAL:len++, //power_total_t PKT_TYPE_POWER_RESET:len++, PKT_TYPE_CH_ALL:len++, PKT_TYPE_SCAN:len++, PKT_TYPE_FACTORY:len++, PKT_TYPE_ALARM:len++, PKT_TYPE_SENSOR:len++, PKT_TYPE_BREAKER:len++, PKT_TYPE_STAT:len++, PKT_TYPE_MESG:len++, PKT_TYPE_FILE:len++, } }(); const SUB_TYPE=function(){ var len = 0; return { SUB_TYPE_POWER_SWITCH:len++, SUB_TYPE_POWER_ALARM:len++, SUB_TYPE_POWER_THRESHOLD:len++, //power_ch_t SUB_TYPE_POWER_START_DELAY:len++, //power_total_t SUB_TYPE_POWER_STOP_DELAY:len++, } }(); const PDU_TYPE=function(){ var len = 0; return { PDU_AC_I1O1:len++, PDU_DC_I1O1:len+=2, PDU_AC_I3O3:len++, PDU_AC_I3O1:len++, PDU_AC_I3O1_H:len++, } }(); const ALARM_ACT=function(){ var len = 1; return { ALARM_ACT_CLOSE_CH:len++, ALARM_ACT_MESG:len++, ALARM_ACT_CLOSE_CHALL:len++, } }(); /////////////////////////////////////////////////////// function array_to_string(data){ const decoder = new TextDecoder(); return decoder.decode(new Uint8Array(data)); } function string_to_array(data,len){ const encoder = new TextEncoder(); // ĬÈÏ'utf-8'±àÂë const buffer = encoder.encode(data); const fixedArray = new Uint8Array(len); fixedArray.set(buffer); fixedArray.fill(0, buffer.length); return fixedArray.buffer; } function array_cat(a1,a2){ var tlen=a1.byteLength+a2.byteLength; var buffer = new ArrayBuffer(tlen); var vw = new Uint8Array(buffer); var vw1 = new Uint8Array(a1); for(var i=0; i0) { switch(hdr.type) { case PKT_TYPE.PKT_TYPE_POWER_CH: hdr.powerc = new bin_to_powerc(data); break; case PKT_TYPE.PKT_TYPE_POWER_TOTAL: hdr.powert = BIN.powert.b2j(data); break; case PKT_TYPE.PKT_TYPE_ALARM: hdr.alarmd = BIN.alarmd.b2j(data); break; default : console.log("wrong hdr type: "+hdr.type); } } return hdr; } /////////////////////////////////////////////////// function bin_to_hdr(bin) { var tmp, length=0; tmp = new DataView(bin, length); this.magic = tmp.getUint16(0,true); length += 2; tmp = new DataView(bin, length); this.type = tmp.getUint8(0,true); length += 1; tmp = new DataView(bin, length); this.subtype = tmp.getUint8(0,true); length += 1; tmp = new DataView(bin, length); this.nack = tmp.getUint8(0,true); length += 1; tmp = new DataView(bin, length); this.flag = tmp.getUint8(0,true); length += 4; tmp = new DataView(bin, length); this.dlen = tmp.getUint32(0,true); length += 4; this.len = length; } function bin_to_info(bin) { var tmp, length=0; this.name = array_to_string(bin.slice(0,32)); length += 32; tmp = new DataView(bin, length); this.type = tmp.getUint8(0,true); length += 1; tmp = new DataView(bin, length); this.addr = tmp.getUint8(0,true); length += 1; tmp = new DataView(bin, length); this.ch = tmp.getUint8(0,true); length += 1; tmp = new DataView(bin, length); this.sch = tmp.getUint8(0,true); length += 1; tmp = new DataView(bin, length); this.ph_id = tmp.getUint8(0,true); length += 1; tmp = new DataView(bin, length); this.ph_val = tmp.getUint8(0,true); length += 1; tmp = new DataView(bin, length); this.start_delay = tmp.getUint32(0,true); length += 4; tmp = new DataView(bin, length); this.stop_delay = tmp.getUint32(0,true); length += 4; this.len = length; } function bin_to_power(bin) { var tmp, length=0; tmp = new DataView(bin, length); this.voltage = tmp.getFloat32(0,true); length += 4; tmp = new DataView(bin, length); this.current = tmp.getFloat32(0,true); length += 4; tmp = new DataView(bin, length); this.power = tmp.getFloat32(0,true); length += 4; tmp = new DataView(bin, length); this.freq = tmp.getFloat32(0,true); length += 4; tmp = new DataView(bin, length); this.factor = tmp.getFloat32(0,true); length += 4; tmp = new DataView(bin, length); this.consump = tmp.getFloat32(0,true); length += 4; tmp = new DataView(bin, length); this.active = tmp.getFloat32(0,true); length += 4; tmp = new DataView(bin, length); this.reactive = tmp.getFloat32(0,true); length += 4; tmp = new DataView(bin, length); this.ph_out = tmp.getUint8(0,true); length += 1; tmp = new DataView(bin, length); this.status = tmp.getUint8(0,true); length += 1; tmp = new DataView(bin, length); this.nwire = tmp.getUint8(0,true); length += 1; this.len = length; } function bin_to_alarm(bin) { var tmp, length=0; tmp = new DataView(bin, length); this.v_upper = tmp.getUint8(0,true); length += 1; tmp = new DataView(bin, length); this.v_lower = tmp.getUint8(0,true); length += 1; tmp = new DataView(bin, length); this.c_upper = tmp.getUint8(0,true); length += 1; tmp = new DataView(bin, length); this.p_upper = tmp.getUint8(0,true); length += 1; tmp = new DataView(bin, length); this.w_upper = tmp.getUint8(0,true); length += 1; tmp = new DataView(bin, length); this.ph_loss = tmp.getUint8(0,true); length += 1; this.len = length; } function bin_to_thrval(bin) { var tmp, length=0; tmp = new DataView(bin, length); this.en = tmp.getUint8(0,true); length += 1; tmp = new DataView(bin, length); this.val = tmp.getFloat32(0,true); length += 4; tmp = new DataView(bin, length); this.act = tmp.getUint8(0,true); length += 1; this.act_para = []; tmp = new DataView(bin, length); for(var i=0; i<14; i++) { this.act_para[i] = tmp.getUint8(i,true); } length += 14; this.len = length; } function bin_to_thr(bin) { var tmp, length=0; this.v_upper = new bin_to_thrval(bin.slice(length)); length += this.v_upper.len; this.v_lower = new bin_to_thrval(bin.slice(length)); length += this.v_lower.len; this.c_upper = new bin_to_thrval(bin.slice(length)); length += this.c_upper.len; this.p_upper = new bin_to_thrval(bin.slice(length)); length += this.p_upper.len; this.w_upper = new bin_to_thrval(bin.slice(length)); length += this.w_upper.len; this.len = length; } function bin_to_powerc(bin) { var tmp, bin2, length=0; this.info = new bin_to_info(bin); length += this.info.len; this.power = []; for(var i=0; i<3; i++) { this.power[i] = new bin_to_power(bin.slice(length)); length += this.power[i].len; } this.thr = new bin_to_thr(bin.slice(length)); length += this.thr.len; this.alarm = new bin_to_alarm(bin.slice(length)); length += this.alarm.len; tmp = new DataView(bin, length); this.time = tmp.getUint32(0,true); length += 4; tmp = new DataView(bin, length); this.pbrd = tmp.getUint32(0,true); length += 4; this.len = length; } function bin_to_total(bin) { var tmp, length=0; tmp = new DataView(bin, length); this.voltage = tmp.getFloat32 (0,true); length += 4; tmp = new DataView(bin, length); this.current = tmp.getFloat32(0,true); length += 4; tmp = new DataView(bin, length); this.power = tmp.getFloat32(0,true); length += 4; tmp = new DataView(bin, length); this.freq = tmp.getFloat32(0,true); length += 4; tmp = new DataView(bin, length); this.factor = tmp.getFloat32(0,true); length += 4; tmp = new DataView(bin, length); this.consump = tmp.getFloat32(0,true); length += 4; tmp = new DataView(bin, length); this.active = tmp.getFloat32(0,true); length += 4; tmp = new DataView(bin, length); this.reactive = tmp.getFloat32(0,true); length += 4; this.len = length; } function bin_to_powert(bin) { var tmp, length=0; tmp = new DataView(bin, length); this.type = tmp.getUint8(0,true); length += 1; this.total = []; for(var i=0; i<3; i++) { this.total[i] = new bin_to_total(bin.slice(length)); length += this.total[i].len; } this.len = length; } function bin_to_alarmd(bin) { var tmp, length=0; tmp = new DataView(bin, length); this.ch = tmp.getUint8(0,true); length += 1; this.alarm = new bin_to_alarm(bin.slice(length)); length += this.alarm.len; tmp = new DataView(bin, length); this.time = tmp.getUint32(0,true); length += 4; this.len = length; } /////////////////////////////////////////////////// function hdr_to_bin(js) { var tmp, length=0; var buffer = new ArrayBuffer(js.len); tmp = new DataView(buffer, length); tmp.setUint16(0,js.magic,true); length += 2; tmp = new DataView(buffer, length); tmp.setUint8(0,js.type,true); length += 1; tmp = new DataView(buffer, length); tmp.setUint8(0,js.subtype,true); length += 1; tmp = new DataView(buffer, length); tmp.setUint8(0,js.nack,true); length += 1; tmp = new DataView(buffer, length); tmp.setUint32(0,js.flag,true); length += 4; tmp = new DataView(buffer, length); tmp.setUint32(0,js.dlen,true); length += 4; return buffer; } function info_to_bin(js) { var tmp, length=0; var name = string_to_array(js.name, 32); var buffer = new ArrayBuffer(js.len-name.byteLength); tmp = new DataView(buffer, length); tmp.setUint8(0,js.type,true); length += 1; tmp = new DataView(buffer, length); tmp.setUint8(0,js.addr,true); length += 1; tmp = new DataView(buffer, length); tmp.setUint8(0,js.ch,true); length += 1; tmp = new DataView(buffer, length); tmp.setUint8(0,js.sch,true); length += 1; tmp = new DataView(buffer, length); tmp.setUint8(0,js.ph_id,true); length += 1; tmp = new DataView(buffer, length); tmp.setUint8(0,js.ph_val,true); length += 1; tmp = new DataView(buffer, length); tmp.setUint32(0,js.start_delay,true); length += 4; tmp = new DataView(buffer, length); tmp.setUint32(0,js.stop_delay,true); length += 4; return array_cat(name,buffer); } function power_to_bin(js) { var tmp, length=0; var buffer = new ArrayBuffer(js.len); tmp = new DataView(buffer, length); tmp.setFloat32(0,js.voltage,true); length += 4; tmp = new DataView(buffer, length); tmp.setFloat32(0,js.current,true); length += 4; tmp = new DataView(buffer, length); tmp.setFloat32(0,js.power,true); length += 4; tmp = new DataView(buffer, length); tmp.setFloat32(0,js.freq,true); length += 4; tmp = new DataView(buffer, length); tmp.setFloat32(0,js.factor,true); length += 4; tmp = new DataView(buffer, length); tmp.setFloat32(0,js.consump,true); length += 4; tmp = new DataView(buffer, length); tmp.setFloat32(0,js.active,true); length += 4; tmp = new DataView(buffer, length); tmp.setFloat32(0,js.reactive,true); length += 4; tmp = new DataView(buffer, length); tmp.setUint8(0,js.ph_put,true); length += 1; tmp = new DataView(buffer, length); tmp.setUint8(0,js.status,true); length += 1; tmp = new DataView(buffer, length); tmp.setUint8(0,js.nwire,true); length += 1; return buffer; } function alarm_to_bin(js) { var tmp, length=0; var buffer = new ArrayBuffer(js.len); tmp = new DataView(buffer, length); tmp.setUint8(0,js.v_upper,true); length += 1; tmp = new DataView(buffer, length); tmp.setUint8(0,js.v_lower,true); length += 1; tmp = new DataView(buffer, length); tmp.setUint8(0,js.c_upper,true); length += 1; tmp = new DataView(buffer, length); tmp.setUint8(0,js.p_upper,true); length += 1; tmp = new DataView(buffer, length); tmp.setUint8(0,js.w_upper,true); length += 1; tmp = new DataView(buffer, length); tmp.setUint8(0,js.ph_loss,true); length += 1; return buffer; } function thrval_to_js(js) { var tmp, length=0; var buffer = new ArrayBuffer(js.len); tmp = new DataView(buffer, length); tmp.setUint8(0,js.en,true); length += 1; tmp = new DataView(buffer, length); tmp.setFloat32(0,js.val,true); length += 4; tmp = new DataView(buffer, length); tmp.getUint8(0,js.act,true); length += 1; tmp = new DataView(buffer, length); for(var i=0; i<14; i++) { tmp.setUint8(i,js.act_para[i],true); } length += 14; return buffer; } function thr_to_bin(js) { var bin,tmp, length=0; bin = thrval_to_js(js.v_upper); tmp = thrval_to_js(js.v_lower); bin = array_cat(bin, tmp); tmp = thrval_to_js(js.c_upper); bin = array_cat(bin, tmp); tmp = thrval_to_js(js.p_upper); bin = array_cat(bin, tmp); tmp = thrval_to_js(js.w_upper); bin = array_cat(bin, tmp); return bin; } function powerc_to_bin(js) { var bin,tmp, length=0; bin = new info_to_bin(js.info); for(var i=0; i<3; i++) { tmp = new power_to_bin(js.power[i]); bin = array_cat(bin, tmp); } tmp = new thr_to_bin(js.thr); bin = array_cat(bin, tmp); tmp = new alarm_to_bin(js.alarm); bin = array_cat(bin, tmp); var buf = new ArrayBuffer(8); tmp = new DataView(buf, 0); tmp.setUint32(0,js.time,true); tmp.setUint32(4,js.pbrd,true); bin = array_cat(bin, buf); return bin; } function total_to_bin(js) { var tmp, length=0; var buffer = new ArrayBuffer(js.len); tmp = new DataView(buffer, length); tmp.setFloat32(0,js.voltage,true); length += 4; tmp = new DataView(buffer, length); tmp.setFloat32(0,js.current,true); length += 4; tmp = new DataView(buffer, length); tmp.setFloat32(0,js.power,true); length += 4; tmp = new DataView(buffer, length); tmp.setFloat32(0,js.freq,true); length += 4; tmp = new DataView(buffer, length); tmp.setFloat32(0,js.factor,true); length += 4; tmp = new DataView(buffer, length); tmp.setFloat32(0,js.consump,true); length += 4; tmp = new DataView(buffer, length); tmp.setFloat32(0,js.factor,true); length += 4; tmp = new DataView(buffer, length); tmp.setFloat32(0,js.active,true); length += 4; tmp = new DataView(buffer, length); tmp.setFloat32(0,js.reactive,true); length += 4; return buffer; } function powert_to_bin(js) { var tmp,bin2,length=0; var bin = new ArrayBuffer(1); tmp = new DataView(bin, length); tmp.setUint8(0,js.type,true); length += 4; for(var i=0; i<3; i++) { bin2 = total_to_bin(js.total[i]); bin = array_cat(bin, bin2); } return bin; } function alarmd_to_bin(js) { var tmp, length=0; var bin,buffer = new ArrayBuffer(1); tmp = new DataView(buffer, 0); tmp.setUint8(0,js.ch,true); var alarm = alarm_to_bin(js.alarm); bin = array_cat(buffer, alarm); buffer = new ArrayBuffer(4); tmp = new DataView(buffer, 0); tmp.setUint32(0,js.time,true); return array_cat(bin, buffer); } ////////////////////////////////////////////////////////////// var XXX ={}; XXX.hdr = function() { this.j2b = function (js) { var tmp; switch(js.type){ case PKT_TYPE.PKT_TYPE_POWER_CH: tmp = BIN.powerc.j2b(js.powerc); break; case PKT_TYPE.PKT_TYPE_POWER_TOTAL: tmp = BIN.powert.j2b(js.powert); break; case PKT_TYPE.PKT_TYPE_ALARM: tmp = BIN.alarm.j2b(js.alarmd); break; default: return tmp; } js.dlen = tmp.byteLength; var hdr = new hdr_to_bin(js); return array_cat(hdr,tmp); }; this.b2j = function (bin) { var tmp; var hdr = new bin_to_hdr(bin); if(hdr.nack == 1){ //tmp = myBinary.ack.bin2js(bin,this.hdr.len,true); //myLog('log',tmp); //var data = tmp.data; } var data = bin.slice(hdr.len); if(data.byteLength>0 && hdr.dlen==data.byteLength) { switch(hdr.type) { case PKT_TYPE.PKT_TYPE_POWER_CH: hdr.powerc = BIN.powerc.b2j(data); break; case PKT_TYPE.PKT_TYPE_POWER_TOTAL: hdr.powert = BIN.powert.b2j(data); break; case PKT_TYPE.PKT_TYPE_ALARM: hdr.alarmd = BIN.alarmd.b2j(data); break; default : console.log("wrong hdr type: "+hdr.type); } } return hdr; } }; XXX.paras=function() { this.j2b = function (js) { } this.b2j = function (bin) { } }; XXX.powerc=function() { this.j2b = function (js) { return new powerc_to_bin(js); } this.b2j = function (bin) { var tmp=[],length=0; for(var i=0;; i++) { tmp[i] = new bin_to_powerc(bin.slice(length)); length += tmp[i].len; if(length >= bin.byteLength) { break; } } return tmp; } }; XXX.powert=function() { this.j2b = function (js) { return new powert_to_bin(js); } this.b2j = function (bin) { return new bin_to_powert(bin); } }; XXX.alarmd=function() { this.j2b = function (js) { return new alarmd_to_bin(js); } this.b2j = function (bin) { return new bin_to_alarmd(bin); } }; var BIN=new function() { this.hdr = new XXX.hdr(); this.paras = new XXX.paras(); this.powerc = new XXX.powerc(); this.powert = new XXX.powert(); this.alarmd = new XXX.alarmd(); }(); ////////////////////////////////////////// function LOG(){ var data = []; for(var i= 1,len=arguments.length;iERROR: '+ evt.data); } }