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++, SUB_TYPE_PARAS_SNMP: len++, SUB_TYPE_PARAS_NTP: len++, SUB_TYPE_POWER_CONSUMER_CLEAR: len++, SUB_TYPE_PH_CFG: 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, offset); //array.fill(0, 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; i < a1.byteLength; i++) { vw[i] = vw1[i]; } var vw2 = new Uint8Array(a2); for (var i = 0; i < a2.byteLength; i++) { vw[i + a1.byteLength] = vw2[i]; } return buffer; } function mk_hdr_bin(addr, type, subtype, nack, flag, dlen) { var tmp, length = 0; var buffer = new ArrayBuffer(14); tmp = new DataView(buffer, length); var t = MAGIC; tmp.setUint16(0, t, true); //magic length += 2; tmp = new DataView(buffer, length); tmp.setUint8(0, addr, true); //addr length += 1; tmp = new DataView(buffer, length); tmp.setUint8(0, type, true); //type length += 1; tmp = new DataView(buffer, length); tmp.setUint8(0, subtype, true); //subtype length += 1; tmp = new DataView(buffer, length); tmp.setUint8(0, nack, true); //nack length += 1; tmp = new DataView(buffer, length); tmp.setUint32(0, flag, true); //flag length += 4; tmp = new DataView(buffer, length); tmp.setUint32(0, dlen, true); //dlen length += 4; return buffer; } function mk_hdr_obj(addr, type, subtype, nack, flag, dlen) { this.magic = MAGIC; this.addr = addr; this.type = type; this.subtype = subtype; this.flag = flag; this.dlen = dlen; } function pkt_to_bin(addr, type, subtype, nack, flag, js) { var tmp; var buffer = new mk_hdr_bin(addr, type, subtype, nack, flag, js.len); switch (type) { case PKT_TYPE.PKT_TYPE_POWER_CH: tmp = new powerc_to_bin(js); break; case PKT_TYPE.PKT_TYPE_POWER_TOTAL: tmp = new powert_to_bin(js); break; case PKT_TYPE.PKT_TYPE_ALARM: tmp = new alarm_to_bin(js); break; case PKT_TYPE.PKT_TYPE_PARAS: { switch (subtype) { case SUB_TYPE.SUB_TYPE_PARAS_SYS: { tmp = new sys_to_bin(js); } break; case SUB_TYPE.SUB_TYPE_PARAS_MODBUS: { tmp = new modbus_to_bin(js); } break; case SUB_TYPE.SUB_TYPE_PARAS_MISC: { tmp = new misc_to_bin(js); } break; case SUB_TYPE.SUB_TYPE_PARAS_PROD: { tmp = new prod_to_bin(js); } break; case SUB_TYPE.SUB_TYPE_PARAS_SERV: { tmp = new serv_to_bin(js); } break; case SUB_TYPE.SUB_TYPE_PARAS_NETWORK: { tmp = new network_to_bin(js); } break; case SUB_TYPE.SUB_TYPE_PARAS_SNMP: { tmp = new snmp_to_bin(js); } break; } } break; default: return tmp; } return array_cat(buffer, tmp); } function bin_to_pkt(bin) { var hdr = new bin_to_hdr(bin); var data = bin.slice(hdr.len); if (data.byteLength > 0) { 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.getUint32(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, 16)); length += 16; 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.getUint8(0, true); length += 1; tmp = new DataView(bin, length); this.stop_delay = tmp.getUint8(0, true); length += 1; this.len = length; } function bin_to_power(bin) { var tmp, length = 0; tmp = new DataView(bin, length); this.voltage = tmp.getUint16(0, true); length += 2; tmp = new DataView(bin, length); this.current = tmp.getUint16(0, true); length += 2; tmp = new DataView(bin, length); this.power = tmp.getUint32(0, true); length += 4; tmp = new DataView(bin, length); this.freq = tmp.getUint16(0, true); length += 2; tmp = new DataView(bin, length); this.factor = tmp.getUint8(0, true); length += 1; tmp = new DataView(bin, length); this.consump = tmp.getUint32(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); var val = tmp.getUint32(0, true); length += 4; this.l1_v_upper = (val & 0x1); this.l1_v_lower = (val & 0x2); this.l1_c_upper = (val & 0x4); this.l1_p_upper = (val & 0x8); this.l1_w_upper = (val & 0x10); this.l2_v_upper = (val & (1 << 8)); this.l2_v_lower = (val & (1 << 9)); this.l2_c_upper = (val & (1 << 10)); this.l2_p_upper = (val & (1 << 11)); this.l2_w_upper = (val & (1 << 12)); this.l3_v_upper = (val & (1 << 16)); this.l3_v_lower = (val & (1 << 17)); this.l3_c_upper = (val & (1 << 18)); this.l3_p_upper = (val & (1 << 19)); this.l3_w_upper = (val & (1 << 20)); this.ph_loss1 = (val & (1 << 24)); this.ph_loss2 = (val & (1 << 25)); this.ph_loss3 = (val & (1 << 26)); // this.v_upper = tmp.uint16_t(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.getUint16(0, true); length += 2; tmp = new DataView(bin, length); this.v_upper = tmp.getUint16(0, true); length += 2; tmp = new DataView(bin, length); this.v_lower = tmp.getUint16(0, true); length += 2; this.c_upper = tmp.getUint16(0, true); length += 2; this.p_upper = tmp.getUint32(0, true); length += 4; this.w_upper = tmp.getUint32(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; tmp = new DataView(bin, length); this.en = tmp.getUint8(0, true); length += 1; tmp = new DataView(bin, length); this.v_upper = tmp.getUint16(0, true); console.log(this.v_upper) length += 2; tmp = new DataView(bin, length); this.v_lower = tmp.getUint16(0, true); length += 2; tmp = new DataView(bin, length); this.c_upper = tmp.getUint16(0, true); length += 2; tmp = new DataView(bin, length); this.p_upper = tmp.getUint32(0, true); length += 4; tmp = new DataView(bin, length); this.w_upper = tmp.getUint32(0, true); length += 4; //this.thr = new bin_to_thrval(bin.slice(length)); //length += this.thr.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.sys_time = array_to_string(bin.slice(length, 32)); // length += 32; // // 版本号 // this.version_number = array_to_string(bin.slice(length, 10)); // length += 10; // 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, length + 48)); length += 48; this.gateway = array_to_string(bin.slice(length, length + 48)); length += 48; this.dns1 = array_to_string(bin.slice(length, length + 48)); length += 48; this.dns2 = array_to_string(bin.slice(length, length + 48)); length += 48; // this.dhcp = array_to_string(bin.slice(length, 48)); // length += 48; this.len = length; } function bin_2_sensor_info(bin) { var tmp, length = 0; tmp = new DataView(bin, length); this.name = array_to_string(bin.slice(length, 32)); length += 32; this.type = tmp.getUint8(length, true); length += 1; this.addr = tmp.getUint8(length, true); length += 1; this.num_val = tmp.getUint8(length, true); length += 1; this.status = tmp.getUint8(length, true); length += 1; this.check_count = tmp.getUint8(length, true); length += 1; this.len = length; } function bin_2_sensor_th(bin) { var tmp, length = 0; tmp = new DataView(bin, length); this.enable = tmp.getUint8(length, true); length += 1; this.thr_max = tmp.getFloat32(length, true); length += 4; this.thr_min = tmp.getFloat32(length, true); length += 4; this.act = tmp.getUint8(length, true); length += 1; this.para = bin.slice(length, length + 14); length += 14; this.len = length; } function bin_2_sensor(bin) { var tmp, length = 0; tmp = new DataView(bin, length); this.thr = new bin_2_sensor_th(bin); length += this.thr.len; this.s_alarm = tmp.getUint8(length, true); length += 1; this.val = tmp.getFloat32(length, true); length += 4; this.len = length; } function bin_to_sensorc(bin) { var length = 0; this.info = new bin_2_sensor_info(bin); length += this.info.len; this.sensor_val = []; for (var i = 0; i < 2; i++) { this.sensor_val[i] = new bin_2_sensor(bin.slice(length)); length += this.sensor_val[i].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.status = tmp.getUint8(0, true); length += 1; tmp = new DataView(bin, length); this.nwire = tmp.getUint8(0, true); length += 1; tmp = new DataView(bin, length); this.pbrd = tmp.getUint32(0, true); length += 4; // 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.snmp = new bin_to_snmp(bin.slice(length)); length += this.snmp.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; i < this.cnt; i++) { this.addr[i] = tmp.getUint8(i, true); } length += this.cnt; 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.addr, true); length += 1; 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, 16); 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.setUint8(0, js.start_delay, true); length += 1; tmp = new DataView(buffer, length); tmp.setUint8(0, js.stop_delay, true); length += 1; 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.setInt16(0, js.voltage * 10, true); length += 2; tmp = new DataView(buffer, length); tmp.setInt16(0, js.current, true); length += 2; tmp = new DataView(buffer, length); tmp.setInt32(0, js.power, true); length += 4; tmp = new DataView(buffer, length); tmp.setInt16(0, js.freq, true); length += 2; tmp = new DataView(buffer, length); tmp.setInt8(0, js.factor, true); length += 1; tmp = new DataView(buffer, length); tmp.setUint32(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 = 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_bin(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; 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.setUint16(0, js.v_upper, true); length += 2; tmp = new DataView(buffer, length); tmp.setUint16(0, js.v_lower, true); length += 2; tmp = new DataView(buffer, length); tmp.setUint16(0, js.c_upper, true); length += 2; tmp = new DataView(buffer, length); tmp.setUint32(0, js.p_upper, true); length += 4; tmp = new DataView(buffer, length); tmp.setUint32(0, js.w_upper, true); length += 4; // bin = thrval_to_bin(js.v_upper); // tmp = thrval_to_bin(js.v_lower); // bin = array_cat(bin, tmp); // tmp = thrval_to_bin(js.c_upper); // bin = array_cat(bin, tmp); // tmp = thrval_to_bin(js.p_upper); // bin = array_cat(bin, tmp); // tmp = thrval_to_bin(js.w_upper); // bin = array_cat(bin, tmp); return buffer; } //////////////////////////////// // function sys_to_bin(js) { // var tmp, length = 0; // var buffer = new ArrayBuffer(js.len); // tmp = new DataView(buffer, length); // tmp.setUint8(0, js.lang, true); // length += 1; // tmp = new DataView(buffer, length); // tmp.setInt8(0, js.tzone, true); // length += 1; // return buffer; // } function modbus_to_bin(js) { var tmp, length = 0; var buffer = new ArrayBuffer(js.len); tmp = new DataView(buffer, length); tmp.setUint8(0, js.mode, true); length += 1; tmp = new DataView(buffer, length); tmp.setUint8(0, js.addr, true); length += 1; tmp = new DataView(buffer, length); tmp.setUint32(0, js.baud, true); length += 4; return buffer; } function misc_to_bin(js) { var tmp, length = 0; var buffer = new ArrayBuffer(js.len); tmp = new DataView(buffer, length); tmp.setUint8(0, js.watchdog, true); length += 1; tmp = new DataView(buffer, length); tmp.setUint8(0, js.fliptime, true); length += 1; tmp = new DataView(buffer, length); tmp.setUint8(0, js.led, true); length += 1; tmp = new DataView(buffer, length); tmp.setUint8(0, js.beep, true); length += 1; tmp = new DataView(buffer, length); tmp.setUint16(0, js.rotate, true); length += 2; return buffer; } function prod_to_bin(js) { var tmp, length = 0; var buffer = new ArrayBuffer(js.len); tmp = new DataView(buffer, length); tmp.setUint32(0, js.id, true); length += 4; array_set(buffer, js.pname, length); length += 32; array_set(buffer, js.pnumber, length); length += 32; array_set(buffer, js.status, length); length += 32; array_set(buffer, js.name, length); length += 32; array_set(buffer, js.number, length); length += 32; array_set(buffer, js.date, length); length += 32; array_set(buffer, js.batch, length); length += 32; tmp = new DataView(buffer, length); tmp.setUint8(0, js.type, true); length += 1; tmp = new DataView(buffer, length); tmp.setUint8(0, js.count, true); length += 1; tmp = new DataView(buffer, length); tmp.setUint32(0, js.samptime, true); length += 4; tmp = new DataView(buffer, length); tmp.setUint32(0, js.savetime, true); length += 4; tmp = new DataView(buffer, length); tmp.setUint16(0, js.ph_group, true); length += 2; tmp = new DataView(buffer, length); tmp.setUint16(0, js.ch_delay, true); length += 2; return buffer; } function serv_to_bin(js) { var tmp, length = 0; var buffer = new ArrayBuffer(js.len); array_set(buffer, js.name, length); length += 256; array_set(buffer, js.site, length); length += 256; array_set(buffer, js.mail, length); length += 256; array_set(buffer, js.addr, length); length += 256; array_set(buffer, js.tele, length); length += 32; return buffer; } function network_to_bin(js) { var tmp, length = 0; var buffer = new ArrayBuffer(js.len); tmp = new DataView(buffer, length); tmp.setUint8(0, js.mode, true); length += 1; array_set(new Uint8Array(buffer), js.ipaddr, length); length += 48; array_set(new Uint8Array(buffer), js.mask, length); length += 48; array_set(new Uint8Array(buffer), js.gateway, length); length += 48; array_set(new Uint8Array(buffer), js.dns1, length); length += 48; array_set(new Uint8Array(buffer), js.dns2, length); length += 48; return buffer; } function sys_to_bin(js) { var tmp, length = 0; var buffer = new ArrayBuffer(js.len); tmp = new DataView(buffer, length); tmp.setUint8(0, js.lang, true); length += 1; tmp = new DataView(buffer, length); tmp.setInt8(0, js.tzone, true); length += 1; tmp = new DataView(buffer, length); tmp.setUint16(0, js.route, true); length += 2; array_set(new Uint8Array(buffer), js.ver, length); length += 16; array_set(new Uint8Array(buffer), js.sys_time, length); length += 32; return buffer; } function snmp_to_bin(js) { var tmp, length = 0; //var uint8Array = new ArrayBuffer(js.len); var buffer = new ArrayBuffer(js.len); // tmp = new DataView(buffer, length); tmp.setUint8(0, js.mode, true); length += 1; tmp = new DataView(buffer, length); tmp.setUint8(0, js.version, true); length += 1; array_set(new Uint8Array(buffer), js.publics, length); length += 10; tmp = new DataView(buffer, length); tmp.setUint8(0, js.trapmode, true); length += 1; array_set(new Uint8Array(buffer), js.trap_ip, length); length += 32; // // array_set(buffer, js.rzmm, length); // length += 20; // // array_set(buffer, js.jmmm, length); // length += 20; return buffer; } //////////////////////////////// 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(6); tmp = new DataView(buf, 0); tmp.setUint32(0, js.status, true); tmp.setUint32(1, js.nwire, true); tmp.setUint32(2, js.pbrd, true); // 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); } 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; tmp = new DataView(bin, length); this.route = tmp.getUint16(0, true); length += 2; this.ver = array_to_string(bin.slice(length, length + 16)); length += 16; this.sys_time = array_to_string(bin.slice(length, length + 32)); length += 32; this.len = length; } function bin_to_his_alarm(bin) { var tmp, length = 0; tmp = new DataView(bin, length); this.type = tmp.getUint8(0, true); length += 1; this.date = array_to_string(bin.slice(length, length + 32)); length += 32; this.waning_context = array_to_string(bin.slice(length, length + 64)); length += 64; this.len = length; } function bin_to_snmp(bin) { var tmp, length = 0; tmp = new DataView(bin, length); this.mode = tmp.getUint8(0, true); length += 1; tmp = new DataView(bin, length); this.version = tmp.getUint8(0, true); length += 1; this.publics = array_to_string(bin.slice(length, length + 10)); length += 10; tmp = new DataView(bin, length); this.trapmode = tmp.getUint8(0, true); length += 1; // this.yhm = array_to_string(bin.slice(length, 20)); // length += 20; // this.rzmm = array_to_string(bin.slice(length, 20)); // length += 20; // this.jmmm = array_to_string(bin.slice(length, 20)); // length += 20; this.trap_ip = array_to_string(bin.slice(length, length + 32)); length += 32; this.len = length; } ////////////////////////////////////////////////////////////// // websocket推送二进制解析方法开始 var power_ch_start = 0; var power_ch_end = 0; var index = 0; var temp = []; function bin_parse(bin) { var tmp, h = new bin_to_hdr(bin); if (h.nack == 1) { //tmp = myBinary.ack.bin2js(bin,this.h.len,true); //myLog('log',tmp); //var data = tmp.data; } if (h.type == PKT_TYPE.PKT_TYPE_POWER_CH) { if (h.flag == 1) { power_ch_start = 1; temp.length = 0; index = 0; power_ch_end = 0; } if (h.flag == 0xFFFFFFFF) { if (power_ch_start == 0) { temp.length = 0; index = 0; } power_ch_start = 0; power_ch_end = 1; } } var data = bin.slice(h.len); if (data.byteLength > 0 && h.dlen == data.byteLength) { switch (h.type) { case PKT_TYPE.PKT_TYPE_POWER_CH: { var length = 0; for (var i = index;; i++) { temp[i] = new bin_to_powerc(data.slice(length)); length += temp[i].len; if (length >= data.byteLength) { index = i + 1; break; } } if (power_ch_end) { h.powerc = temp; } } break; case PKT_TYPE.PKT_TYPE_POWER_TOTAL: h.powert = new bin_to_powert(data); break; case PKT_TYPE.PKT_TYPE_ALARM: { var length = 0; var tmp = []; for (var i = 0;; i++) { tmp[i] = new bin_to_his_alarm(data.slice(length)); length += tmp[i].len; if (length >= data.byteLength) { break; } } h.his_alarmd = tmp; } 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); { switch (h.subtype) { case SUB_TYPE.SUB_TYPE_PARAS_MODBUS: h.cas = new bin_to_modbus(data); break; case SUB_TYPE.SUB_TYPE_PARAS_NETWORK: h.network = new bin_to_network(data); break; case SUB_TYPE.SUB_TYPE_PARAS_SNMP: h.snmp = new bin_to_snmp(data); break; case SUB_TYPE.SUB_TYPE_PARAS_SYS: h.sys = new bin_to_sys(data); break; } } break; case PKT_TYPE.PKT_TYPE_SENSOR: { var tmp = [], length = 0; for (var i = 0;; i++) { tmp[i] = new bin_to_sensorc(data.slice(length)); length += tmp[i].len; if (length >= data.byteLength) { break; } } h.sensorc = tmp; } break; default: console.log("wrong hdr type: " + h.type); break; } } return h; }; ////////////////////////////////////////// function LOG() { var data = []; for (var i = 1, len = arguments.length; i < len; i++) { data.push(arguments[i]) } console.log(data); } function WS(url, fn) { this.url = url; this.name = 'myWebs'; this.open = _open; this.reopen = _reopen; this.close = _close; this.send = _send; this.state = _state; this.setcb = _setcb; this.closeCount = 0; this.maxConnect = 100; var his = this; this.open(); function _open() { console.log("____url: ", his.url); his.ws = new WebSocket(his.url); his.ws.binaryType = 'arraybuffer'; his.ws.onopen = _onopen; his.ws.onclose = _onclose; his.ws.onmessage = _onmsg; his.ws.onerror = _onerror; } function _reopen() { _close(); _open(his.url); } function _close() { his.ws.close(); } function _send(msg) { if (his.ws.readyState != WebSocket.OPEN) return; his.ws.send(msg); } function _state() { return his.ws.readyState; } function _setcb(tp, f) { switch (tp) { case "open": his.ws.onopen = f; break; case "close": his.ws.onclose = f; break; case "msg": his.ws.onmessage = f; break; case "err": his.ws.onerror = f; break; } } function loop_send() { console.log("PKT_TYPE_POWER_CH request"); _send(mk_hdr(PKT_TYPE.PKT_TYPE_POWER_CH)); setTimeout(loop_send, 400); } function _onopen(evt) { his.closeCount = 0; console.log("___ ws.onopen"); function1(); //setTimeout(loop_send, 2000); } function _onclose(evt) { LOG("ws.onclose"); setTimeout(_reopen, 3000); his.closeCount += 1; } function _onmsg(evt) { console.log("___ ws.onmsg,websocket消息接收"); if (evt.data instanceof ArrayBuffer) { var obj = bin_parse(evt.data); if (obj.type == PKT_TYPE.PKT_TYPE_POWER_CH) { if (power_ch_end == 1) { fn(obj); } } else { fn(obj); } } } function _onerror(evt) { // console.log("___ ws.onerror"); //write_scr('ERROR: '+ evt.data); } }