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++, PKT_TYPE_SLAVE_LIST: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_OPEN_DELAY:len++, //power_total_t SUB_TYPE_POWER_CLOSE_DELAY:len++, SUB_TYPE_PARAS_SYS:len++, SUB_TYPE_PARAS_MODBUS:len++, SUB_TYPE_PARAS_MISC:len++, SUB_TYPE_PARAS_PROD:len++, SUB_TYPE_PARAS_SERV:len++, SUB_TYPE_PARAS_NETWORK: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++, } }(); const IP_MODE=function(){ var len = 0; return { IP_MODE_DHCP:len++, IP_MODE_STATIC:len++, } }(); const IP_VER=function(){ var len = 0; return { IP_VER_ERR:len++, IP_VER_V4:len++, IP_VER_V6:len++, } }(); const MODBUS_MODE=function(){ var len = 0; return { MODBUS_MASTER:len++, MODBUS_SLAVE:len++, } }(); const LANG_ID=function(){ var len = 0; return { LANG_ID_CHINESE:len++, LANG_ID_ENGLISH:len++, LANG_ID_RUSSIAN:len++, LANG_ID_SPANISH:len++, LANG_ID_PORTYGYESE:len++, LANG_ID_GERMAN:len++, LANG_ID_FRENCH:len++, LANG_ID_ITALIAN:len++, LANG_ID_JAPANESE:len++, LANG_ID_MAX:len++, } }(); /////////////////////////////////////////////////////// function array_to_string(data){ const decoder = new TextDecoder(); return decoder.decode(new Uint8Array(data)); } function array_set(array,str,offset){ const encoder = new TextEncoder(); // ĬÈÏ'utf-8'±àÂë const buffer = encoder.encode(str); array.set(buffer); array.fill(offset, buffer.length); } 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; case PKT_TYPE.PKT_TYPE_ALARM: hdr.alarmd = BIN.alarmd.b2j(data); break; case PKT_TYPE.PKT_TYPE_SLAVE_LIST: hdr.slaves = 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.addr = tmp.getUint8(0,true); length += 1; 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(length,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_ver(bin) { var tmp, length=0; this.ver = array_to_string(bin.slice(length,16)); length += 16; this.addr = array_to_string(bin.slice(length,32)); length += 32; this.len = length; } function bin_to_sys(bin) { var tmp, length=0; tmp = new DataView(bin, length); this.lang = tmp.getUint8(0,true); length += 1; tmp = new DataView(bin, length); this.tzone = tmp.getInt8(0,true); length += 1; this.len = length; } function bin_to_modbus(bin) { var tmp, length=0; tmp = new DataView(bin, length); this.mode = 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.baud = tmp.getUint32(0,true); length += 4; this.len = length; } function bin_to_misc(bin) { var tmp, length=0; tmp = new DataView(bin, length); this.watchdog = tmp.getUint8(0,true); length += 1; tmp = new DataView(bin, length); this.fliptime = tmp.getUint32(0,true); length += 4; tmp = new DataView(bin, length); this.led = tmp.getUint8(0,true); length += 1; tmp = new DataView(bin, length); this.beep = tmp.getUint8(0,true); length += 1; tmp = new DataView(bin, length); this.rotate = tmp.getUint16(0,true); length += 2; this.len = length; } function bin_to_prod(bin) { var tmp, length=0; tmp = new DataView(bin, length); this.id = tmp.getUint8(0,true); length += 1; this.pname = array_to_string(bin.slice(length,32)); length += 32; this.pnumber = array_to_string(bin.slice(length,32)); length += 32; this.status = array_to_string(bin.slice(length,32)); length += 32; this.name = array_to_string(bin.slice(length,32)); length += 32; this.number = array_to_string(bin.slice(length,32)); length += 32; this.date = array_to_string(bin.slice(length,32)); length += 32; this.batch = array_to_string(bin.slice(length,32)); length += 32; tmp = new DataView(bin, length); this.type = tmp.getUint8(0,true); length += 1; tmp = new DataView(bin, length); this.samptime = tmp.getUint32(0,true); length += 4; tmp = new DataView(bin, length); this.savetime = tmp.getUint32(0,true); length += 4; tmp = new DataView(bin, length); this.ph_group = tmp.getUint16(0,true); length += 2; tmp = new DataView(bin, length); this.ch_delay = tmp.getUint16(0,true); length += 2; this.len = length; } function bin_to_serv(bin) { var tmp, length=0; this.name = array_to_string(bin.slice(length,256)); length += 256; this.site = array_to_string(bin.slice(length,256)); length += 256; this.mail = array_to_string(bin.slice(length,256)); length += 256; this.addr = array_to_string(bin.slice(length,256)); length += 256; this.tele = array_to_string(bin.slice(length,32)); length += 32; this.len = length; } function bin_to_network(bin) { var tmp, length=0; tmp = new DataView(bin, length); this.mode = tmp.getUint8(0,true); length += 1; this.ipaddr = array_to_string(bin.slice(length,48)); length += 48; this.mask = array_to_string(bin.slice(length,48)); length += 48; this.gateway = array_to_string(bin.slice(length,48)); length += 48; this.dns1 = array_to_string(bin.slice(length,48)); length += 48; this.dns2 = array_to_string(bin.slice(length,48)); length += 48; 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 bin_to_paras(bin) { var tmp, length=0; this.lang = new bin_to_sys(bin.slice(length)); length += this.lang.len; this.ver = new bin_to_ver(bin.slice(length)); length += this.ver.len; this.cas = new bin_to_modbus(bin.slice(length)); length += this.cas.len; this.misc = new bin_to_misc(bin.slice(length)); length += this.misc.len; this.prod = new bin_to_prod(bin.slice(length)); length += this.prod.len; this.serv = new bin_to_serv(bin.slice(length)); length += this.serv.len; this.network = new bin_to_network(bin.slice(length)); length += this.network.len; this.len = length; } function bin_to_slist(bin) { var tmp, length=0; tmp = new DataView(bin, length); this.cnt = tmp.getUint8(0,true); length += 1; this.addr = []; tmp = new DataView(bin, length); for(var i=0; i0 && h.dlen==data.byteLength) { switch(h.type) { case PKT_TYPE.PKT_TYPE_POWER_CH: { var tmp=[],length=0; for(var i=0;; i++) { tmp[i] = new bin_to_powerc(data.slice(length)); length += tmp[i].len; if(length >= data.byteLength) { break; } } h.powerc = tmp; } break; case PKT_TYPE.PKT_TYPE_POWER_TOTAL: h.powert = new bin_to_powert(data); break; case PKT_TYPE.PKT_TYPE_ALARM: h.alarmd = new bin_to_alarm(data); break; case PKT_TYPE.PKT_TYPE_SLAVE_LIST: h.alarmd = new bin_to_slist(data); break; case PKT_TYPE.PKT_TYPE_PARAS: h.paras = new bin_to_paras(data); break; default : console.log("wrong hdr type: "+h.type); break; } } return h; }; ////////////////////////////////////////// function LOG(){ var data = []; for(var i= 1,len=arguments.length;iERROR: '+ evt.data); } }