(function () { var m_work_as_worker = false; try { window; // 这句必须有,为了判断,是否在新线程中工作 } catch (e) { m_work_as_worker = true; window = this; importScripts("reconnecting-websocket.js"); importScripts("md5.min.js"); window.$ = { isFunction: function (a) { return "function" === typeof (a); }, now: function () { return new Date().getTime(); }, }; } var TYPE = {}; TYPE.NEW_MASK = 0x80; // 新协议 最高位给1 TYPE.TYPE_MASK = 0x7F; // 类型有效位,127种 TYPE.FrameType_POS = 0x01; TYPE.FrameType_Update = 0x02; TYPE.FrameType_Alarm = 0x03; TYPE.FrameType_Volt = 0x05; TYPE.FrameType_DIS = 0x06; TYPE.FrameType_BaseStat = 0x07; TYPE.FrameType_TagAppend = 0x08; //push协议,原始心率值 TYPE.FrameType_HeartRate_study = 0x55; //private协议,经过学习的心率推送 TYPE.FrameType_AlarmExt = 0x09; TYPE.FrameType_EeCfg = 0x12; TYPE.FrameType_Error = 0x19; TYPE.FrameType_IOStateExt = 0x21; TYPE.FrameType_PersonSI = 0x31; TYPE.FrameType_TagOffline = 0x32; TYPE.FrameType_AreaInfo = 0x33; TYPE.FrameType_POS_RSSI = 0x8F; TYPE.FrameType_GEO = 0x34; //经纬度 TYPE.FrameType_GlobleGraphicPos = 0x35;//全局 TYPE.FrameType_IOT = 0x66;//物联 TYPE.FrameType_SIGN = 0x57; //健康数据推送 心率血氧体温 var account_info = { username: 'admin', password: 'localsense', }; var webSocketOptions = { reconnectInterval: 1000, //重连延迟时间 reconnectDecay: 1.5, //重连延时增长率 timeoutInterval: 2000, //一次连接等待时间 maxReconnectInterval: 5000 //重连最大延迟时间 }; if (!window.LOCALSENSE) LOCALSENSE = {}; LOCALSENSE.WEBSOCKET_API = new function () { var this_obj = this; var ws1 = null, ws2 = null, ws3 = null; var m_callbacks = {}; var g_is_tag_off = {}; var g_posdata = {}; var g_base_state = {}; var tag64Checked = true;//是否64位 var tag64Show = false;//是否64位 this.PosOutMode = { "1": "XY", //只输出平面坐标 "2": "GEO",//只输出gps坐标 "3": "GLOBAL",//只输出全局坐标 "4": "XY_GEO", //同时输出xy平面坐标和GPS坐标 "5": "XY_GLOBAL"//同时输出xy平面坐标和全局坐标 }; var pos_out_type = this.PosOutMode["1"]; //默认输出位置数据模式为: 只平面坐标 this_obj.setTag64CheckedFlag = function(v){ tag64Checked = v; } this_obj.setPosOutType = function(v){ pos_out_type = v; } this_obj.setTag64Show = function(v){ tag64Show = v; } this_obj.ClearBuffer = function () { g_is_tag_off = {}; g_posdata = {}; g_base_state = {}; }; this_obj.CB_TYPE = { TAG_POWER: 'onRecvTagPower', TAG_POWER_BIN: 'onRecvTagPowerBin', TAG_POS: 'onRecvTagPos', TAG_POS_BIN: 'onRecvTagPosBin', GAO_JING: 'onRecvGaojing', GAO_JING_BIN: 'onRecvGaojingBin', AREA_INFO: 'onRecvAreaInfo', AREA_INFO_BIN: 'onRecvAreaInfoBin', MOD_DATA: 'onRecvModfiyData', MOD_DATA_BIN: 'onRecvModfiyDataBin', ROLLCALL_DATA: 'onRecvDmData', ROLLCALL_DATA_BIN: 'onRecvDmDataBin', HEART_INFO: 'onRecvHeartInfo', SIGN_INFO: 'onRecvSignInfo', HEART_INFO_BIN: 'onRecvHeartInfoBin', HEART_INFO_STUDY: 'onRecvHeartStudyInfo', PERSON_INFO: 'onRecvPersonInfo', PERSON_INFO_BIN: 'onRecvPersonInfoBin', DISTANCE_DATA: 'onRecvDistanceData', BASE_ST_DATA: 'onRecvBaseStData', BASE_ST_DATA_BIN: 'onRecvBaseStDataBin', TAG_OFF_LINE: 'onRecvTagOffLine', Send_Int8v: 'onSendInt8v', WS_SWITCH_RESULT: 'onRecvWebScoketSwitchBack', WS_SWITCH_CLICK: 'onRecvClickSwitchBack', WS_VIDEO_CHANGE: 'onRecvVideoChange', // 视频联动打开指令回调函数 WS_VIDEO_SEND: 'onSendVideoRequest', // 视频联动关闭指令回调函数 WS_VIDEO_CLOSE: 'onSendVideoClose', // 临时撤防指令 WS_DRAW_UPDATE: 'onSendDrawRequest', // 标签蜂鸣指令 WS_TAG_SHAKE: 'onSendTagShakeRequest', //标签物联 TAG_IOT_INFO:'onRecvTagIotInfo', ON_OPEN: 'onOpen', ON_CLOSE: 'onClose', ON_WS_CLOSE: 'onWsClose', ON_ERROR: 'onError', ON_WS_ERROR: 'onWsError' }; (function () { for (var key in this_obj.CB_TYPE) { var val = this_obj.CB_TYPE[key]; this_obj[val] = null; } }()); this_obj.SetAccount = function (username, password, salt_en_val) { account_info.username = username; if (salt_en_val == "") { account_info.password = md5(password); } else { account_info.password = md5(md5(password) + salt_en_val); } }; this_obj.RegisterCallbackFunc = function (type, callback) { m_callbacks[type] = callback; }; function CallbackRegisterFunc(type) { var args = []; for (var i = 1; i < arguments.length; i++) { args.push(arguments[i]); } var on_func = this_obj[type]; if ($.isFunction(on_func)) { try { on_func.apply(null, args); } catch (e) { console.error(e); } } if (type in m_callbacks) { var func = m_callbacks[type]; try { func.apply(null, args); } catch (e) { console.error(e); } } if (m_work_as_worker) { var obj = [type, args]; var str = JSON.stringify(obj); postMessage(str); } }; function getAndsendGrpAccess(ws) { var username = account_info.username; var pwd = account_info.password; /** * 用户名: admin → 61 64 6D 69 6E * 密码: 47bce5c74f589f4867dbd57e9ca9f808 * 1. 帧头 固定值2B 0xcc5f * 2. 帧类型 固定值1B 0x27 * 3. 用户名长度 4B 0x00000005 * 4. 用户名字符 NB admin * 5. 用户密码长度 4B 0x0000000A * 6. 用户密码字符 NB localsense * 7. CRC校验 2B * 8. 帧尾 2B */ var buffer = new ArrayBuffer(256); //预定义 var int8view = new Uint8Array(buffer); //var str_16 = "0x";//为了后面做CRC16校验,将所有数据收集组成16进制数据字符串 var str_2 = ""; //为了后面做CRC16校验,将所有数据收集组成2进制数据字符串 int8view[0] = 0xCC; int8view[1] = 0x5F; int8view[2] = 0x27; //str_16+="CC5F27"; str_2 += hexto0b("CC5F27"); //处理用户名长度 var len = username.length; var len2hex = len.toString(16); var len2hex_str_len = String(len2hex).length; //姓名所得16进制字符串长度 var len8 = Math.floor((8 - len2hex_str_len) / 2); //需要补0的长度 for (var i = 3; i < 3 + len8; i++) { int8view[i] = 0; //str_16+="00"; str_2 += "00000000"; } //存入用户名长度 从3+len8 var name_16_len = Math.ceil(len2hex_str_len / 2); //姓名长度标识位 需要设置的次数 if (len2hex_str_len / 2 % 1 === 0) { //类似0x1C 0x21CB等 for (var i = 0; i < name_16_len; i++) { int8view[3 + len8 + i] = len2hex.substring(i * 2, 2 + i * 2); //str_16+=""+len2hex.substring(i*2,2+i*2); str_2 += hexto0b(len2hex.substring(i * 2, 2 + i * 2)); } } else { //类似0x01C 0x021CB for (var i = 0; i < name_16_len; i++) { if (i == 0) { int8view[3 + len8 + i] = "0" + len2hex.substring(i * 2, 1 + i * 2); //str_16+="0"+len2hex.substring(i*2,1+i*2); str_2 += ("0000" + hexto0b(len2hex.substring(i * 2, 1 + i * 2))); } else { int8view[3 + len8 + i] = len2hex.substring(i * 2, 2 + i * 2); //str_16+=""+len2hex.substring(i*2,2+i*2); str_2 += hexto0b(len2hex.substring(i * 2, 2 + i * 2)); } } } //处理用户名 var name16_str = strToHexCharCode(username); for (var i = 0; i < username.length; i++) { int8view[7 + i] = "0x" + name16_str.substring(2 + i * 2, 4 + i * 2); //+2是为了避开开头的0x //str_16+=""+name16_str.substring(2+i*2,4+i*2); str_2 += hexto0b(name16_str.substring(2 + i * 2, 4 + i * 2)); } //处理密码长度标识 var plen = pwd.length; var plen2hex = plen.toString(16); var plen2hex_str_len = String(plen2hex).length; //密码所得16进制字符串长度 var plen8 = Math.floor((8 - plen2hex_str_len) / 2); //需要补0的长度 var pwd_len_0_start = 6 + username.length + 1; //密码长度标识位开始索引 //密码长度标识补零位置 for (var i = 0; i < plen8; i++) { int8view[i + pwd_len_0_start] = 0; //str_16+="00"; str_2 += "00000000"; } //密码长度 具体值设置 从pwd_len_0_start+plen8开始 var p_16_len = Math.ceil(plen2hex_str_len / 2); //密码长度标识位 需要设置的次数 var pwd_len_start = pwd_len_0_start + plen8; if (plen2hex_str_len / 2 % 1 === 0) { //类似0x1C 0x21CB等 for (var i = 0; i < p_16_len; i++) { int8view[pwd_len_start + i] = plen2hex.substring(i * 2, 2 + i * 2); //str_16+=""+plen2hex.substring(i*2,2+i*2); str_2 += hexto0b(plen2hex.substring(i * 2, 2 + i * 2)); } } else { //类似0x01C 0x021CB for (var i = 0; i < p_16_len; i++) { if (i == 0) { int8view[pwd_len_start + i] = "0" + plen2hex.substring(i * 2, 1 + i * 2); //str_16+="0"+plen2hex.substring(i*2,1+i*2); str_2 += hexto0b(plen2hex.substring(i * 2, 2 + i * 2)); } else { int8view[pwd_len_start + i] = plen2hex.substring(i * 2, 2 + i * 2); //str_16+=""+plen2hex.substring(i*2,2+i*2); str_2 += hexto0b(plen2hex.substring(i * 2, 2 + i * 2)); } } } //处理密码 var pwd16_str = strToHexCharCode(pwd); var pwd_start = pwd_len_start + p_16_len; for (var i = 0; i < pwd.length; i++) { int8view[pwd_start + i] = "0x" + pwd16_str.substring(2 + i * 2, 4 + i * 2); //+2是为了避开开头的0x //str_16+=""+pwd16_str.substring(2+i*2,4+i*2); str_2 += hexto0b(pwd16_str.substring(2 + i * 2, 4 + i * 2)); } /** *CRC校验 *0. 得到原始十六进制发送数据 *1. 十六进制转二进制 parseInt(info,16).toString(2) 得到原始发送数据C(X) *2. CRC16 * CRC-16 x16+x15+x2+18005IBM SDLC CRC16-CCITT x16+x12+x5+11021ISO HDLC, ITU X.25, V.34/V.41/V.42, PPP-FCS 常用: CRC-16 */ //var str_2 = parseInt(str_16,16).toString(2);//C(X)原始报文 var crc_16 = "11000000000000011"; var crc_r = 16; //16位校验位置 var crc_mod = get_high_1_mod(str_2, crc_16); //CRC余数 while (parseInt(crc_mod, 2) > parseInt(crc_16, 2)) { crc_mod = get_high_1_mod(crc_mod, crc_16); } var sendCRCinfo = ""; //经过crc校验过的信息 二进制字符串 for (i = 0; i < crc_r - crc_mod.length; i++) { //补零 sendCRCinfo += "0"; } sendCRCinfo = str_2 + (Array(16).join("0") + crc_mod).slice(-16); //将CRC校验码存放在低位 //帧尾 固定值 0xAABB var sendCRCinfo_16 = ""; sendCRCinfo_16 = btohex(sendCRCinfo); /** * 将用CRC16处理过的十六进制的字符串,按照Uint8Array来处理 */ var sendCRCinfo_16_len = sendCRCinfo_16.length / 2 + 2; //加2字节 帧尾 var buf = new ArrayBuffer(sendCRCinfo_16_len); var int8v = new Uint8Array(buf); //最终发送数据 for (var i = 0; i < sendCRCinfo_16_len - 2; i++) { int8v[i] = "0x" + sendCRCinfo_16.substring(i * 2, (i + 1) * 2); } int8v[sendCRCinfo_16_len - 2] = "0xAA"; int8v[sendCRCinfo_16_len - 1] = "0xBB"; var waitWs1 = -1; waitWs1 = setInterval(function () { if (ws != undefined && ws.readyState == 1) { clearInterval(waitWs1); ws.send(int8v.buffer); CallbackRegisterFunc(this_obj.CB_TYPE.Send_Int8v, int8v); } }, 100); }; this_obj.RejectControlInfo = function (callback) { if (ws3) { ws3.onclose = function (event) { if ($.isFunction(callback)) { callback(event); } }; ws3.close(); } }; this_obj.RequireControlInfo = function (url,ws='ws') { try { //setInterval('reconnectWs3()',5000); ws3 = new ReconnectingWebSocket(ws+"://" + url, ["localSense-Json"], webSocketOptions); ws3.onopen = function (event) { getAndsendGrpAccess(ws3); //认证一次数据权限 CallbackRegisterFunc(this_obj.CB_TYPE.ON_OPEN, "websocket已建立连接"); }; ws3.onmessage = function (event) { //处理数据,此处需要将event传回来的data做解析。data中只需要数据,不要带那个什么anchors的头 var evtdata = event.data; if (!evtdata) { return; } if (evtdata.length) { evtdata = JSON.parse(evtdata); } //判断是否是无陪同告警总开关状态 if (evtdata && evtdata.localsense_conf_response && evtdata.localsense_conf_response.conf_type == "noaccompany") { handleSwitchCallBack('handleNoaccompanySwitch', evtdata.localsense_conf_response.conf_value); } //判断是否是提押监控告警总开关状态 if (evtdata && evtdata.localsense_conf_response && evtdata.localsense_conf_response.conf_type == "arraign") { handleSwitchCallBack('handleArraignSwitch', evtdata.localsense_conf_response.conf_value); } //判断是否是区域超员告警总开关状态 if (evtdata && evtdata.localsense_conf_response && evtdata.localsense_conf_response.conf_type == "overman") { handleSwitchCallBack('handleOvermanSwitch', evtdata.localsense_conf_response.conf_value); } //判断点名任务管理总开关状态 if (evtdata && evtdata.localsense_conf_response && evtdata.localsense_conf_response.conf_type == "rollcall") { handleSwitchCallBack('handleRollCallSwitch', evtdata.localsense_conf_response.conf_value); } //判断电子围栏总开关状态 if (evtdata && evtdata.localsense_conf_response && evtdata.localsense_conf_response.conf_type == "eefence") { handleSwitchCallBack('handleAlarmCallSwitch', evtdata.localsense_conf_response.conf_value); } //判断是否是视频联动的返回参数 if (evtdata && evtdata.localsense_video_response) { handleVideoInfoChange(evtdata.localsense_video_response); } /* 硬件配置 不要先 var data = []; if (evtdata && evtdata.localsense_anchors) { data = evtdata.localsense_anchors; handleYingjianInfo(data); } else if (!evtdata && evtdata.localsense_singleanchor) { handleSingleYingjianInfo(evtdata.localsense_singleanchor); } else if (!evtdata && evtdata.localsense_anchorreset) { if (evtdata.localsense_anchorreset == "OK") { $scopeyingjian.result = "配置成功"; setTimeout(function() { $scopeyingjian.result = ""; }, 5000); } else { $scopeyingjian.result = "配置失败"; } } else if (!evtdata && evtdata.localsense_responsebackup) { if (evtdata.localsense_responsebackup == "OK") { $scopeyingjian.result = "恢复出厂设置成功"; setTimeout(function() { $scopeyingjian.result = ""; }, 1000); } else { $scopeyingjian.result = "恢复出厂设置失败"; } } */ }; ws3.onclose = function (event) { CallbackRegisterFunc(this_obj.CB_TYPE.ON_CLOSE, "websocket已关闭连接"); }; ws3.onerror = function (event) { CallbackRegisterFunc(this_obj.CB_TYPE.ON_ERROR, event); }; } catch (ex) { //alert(ex.message); } }; this_obj.RejectBasicInfo = function (callback) { if (ws1) { ws1.onclose = function (event) { if ($.isFunction(callback)) { callback(event); } }; ws1.close(); } }; //对外:获取基本信息:位置+电量 this_obj.RequireBasicInfo = function (url,ws="ws") { try { ws1 = new ReconnectingWebSocket(ws+"://" + url, ["localSensePush-protocol"], webSocketOptions); ws1.onopen = function (event) { getAndsendGrpAccess(ws1); //认证一次数据权限 CallbackRegisterFunc(this_obj.CB_TYPE.ON_OPEN, "websocket已建立连接"); }; ws1.onmessage = function (event) { if (event.data instanceof Blob) { var reader = new FileReader(); reader.readAsArrayBuffer(event.data); reader.onload = function (evt) { if (evt.target.readyState == FileReader.DONE) { var msgtype_s = 0; var x = new Uint8Array(evt.target.result); var saveX = x; if (x[0] == 0xCC && x[1] == 0x5F) { msgtype_s = x[2]; } var x_data = x.subarray(3); var msgtype = msgtype_s & TYPE.TYPE_MASK; var b_new = (msgtype_s & TYPE.NEW_MASK) == TYPE.NEW_MASK; if (msgtype == TYPE.FrameType_POS) { if(pos_out_type == this_obj.PosOutMode["1"] || pos_out_type == this_obj.PosOutMode["4"] || pos_out_type == this_obj.PosOutMode["5"]) { var isGeo = false; var isGloble = false; CallbackRegisterFunc(this_obj.CB_TYPE.TAG_POS_BIN, saveX); handlePosData(x_data, b_new, isGeo, isGloble); } } else if(msgtype_s == TYPE.FrameType_POS_RSSI) { //handlePosDataRSSI(x_data, true, 64);//固定标签id为8字节的 }else if (msgtype_s == TYPE.FrameType_IOT) { handleIotInfo(x_data, true); } else if (msgtype == TYPE.FrameType_Volt) { // 电量信息不处理,已经在位置包里包含 CallbackRegisterFunc(this_obj.CB_TYPE.TAG_POWER_BIN, saveX); handleTagPow(x_data, b_new); } else if (msgtype == TYPE.FrameType_AlarmExt) { CallbackRegisterFunc(this_obj.CB_TYPE.PERSON_INFO_BIN, saveX); handleAlarmInfoExt2(x_data, b_new); } else if (msgtype == TYPE.FrameType_AreaInfo) { CallbackRegisterFunc(this_obj.CB_TYPE.AREA_INFO_BIN, saveX); handleAreaInfoExt2(x_data, b_new); } else if (msgtype == TYPE.FrameType_IOStateExt) { CallbackRegisterFunc(this_obj.CB_TYPE.ROLLCALL_DATA_BIN, saveX); handleDmData(x_data, b_new); } else if (msgtype == TYPE.FrameType_Alarm) { CallbackRegisterFunc(this_obj.CB_TYPE.GAO_JING_BIN, saveX); handleAlarmInfo(x_data, b_new); } else if (msgtype == TYPE.FrameType_Update) { handleModifyData(x_data, b_new); } else if (msgtype == TYPE.FrameType_TagAppend) { CallbackRegisterFunc(this_obj.CB_TYPE.HEART_INFO_BIN, saveX); handleAppendInfo(x_data, b_new); } else if (msgtype == TYPE.FrameType_SIGN) { handleSignData(x_data, b_new); }else if (msgtype == TYPE.FrameType_PersonSI) { CallbackRegisterFunc(this_obj.CB_TYPE.PERSON_INFO_BIN, saveX); handlePersonInfo(x_data, b_new); } else if (msgtype == TYPE.FrameType_Error) { handleErrorInfo(x_data, b_new); } else if (msgtype == TYPE.FrameType_TagOffline) { handleOffTagInfo(x_data, b_new); } else if (msgtype == TYPE.FrameType_BaseStat) { CallbackRegisterFunc(this_obj.CB_TYPE.BASE_ST_DATA_BIN, saveX); handleBaseStData(x_data, b_new); } else if (msgtype == TYPE.FrameType_GlobleGraphicPos) { if(pos_out_type == this_obj.PosOutMode["3"] || pos_out_type == this_obj.PosOutMode["5"]) {//只输出global模式 CallbackRegisterFunc(this_obj.CB_TYPE.TAG_POS_BIN, saveX); var isGeo = false; var isGlobal = true; handlePosData(x_data, b_new, isGeo, isGlobal); } } else if (msgtype == TYPE.FrameType_GEO) { if(pos_out_type == this_obj.PosOutMode["2"] || pos_out_type == this_obj.PosOutMode["4"]) {//只输出geo模式 CallbackRegisterFunc(this_obj.CB_TYPE.TAG_POS_BIN, saveX); var isGeo = true; var isGlobal = false; handlePosData(x_data, b_new, isGeo, isGlobal); } } else { // 硬件消息,先不处理 //handleYingjianInfo(x_data, b_new); } } }; } }; ws1.onclose = function (event) { CallbackRegisterFunc(this_obj.CB_TYPE.ON_CLOSE, "websocket已关闭连接"); }; ws1.onerror = function (event) { CallbackRegisterFunc(this_obj.CB_TYPE.ON_ERROR, "websocket已断开连接"); }; } catch (ex) { //alert(ex.message); } }; // 字节计算 function Byte_Calc(array_data, byte_num, offset) { /** * array_data 字节数组 * byte_num 当前字段的字节数 * offset 当前偏移值 * * **/ var base = 0; var num_flag = byte_num; for (var i = 0; i < byte_num; i++) { base += (array_data[offset + i] * Math.pow(2, 8 * (num_flag - 1))); num_flag--; } return base } // 处理物联信息 function handleIotInfo(array_data, b_new) { var tagnum = array_data[0]; if (tagnum < 1) { return; } var offset = 1; var iotInfo = {}; for (var i = 0; i < tagnum; i++) { var tagOb = {} if (b_new) { if(tag64Checked) { tagOb.tagid = Byte_Calc(array_data, 8, offset); offset += 8; } else { tagOb.tagid = Byte_Calc(array_data, 4, offset); offset += 4; } } else { tagOb.tagid = Byte_Calc(array_data, 2, offset); offset += 2; } if(tag64Show) { tagOb.tagid = tagOb.tagid.toString(16) } tagOb.timestamp = Byte_Calc(array_data, 8, offset); offset += 8; var length = Byte_Calc(array_data, 1, offset); offset += 1; const arr = [] for (var i = 0; i < length; i++) { arr.push(array_data[offset]) offset += 1; } tagOb.data = arr; iotInfo[tagOb.tagid] = tagOb; } console.log(iotInfo) CallbackRegisterFunc(this_obj.CB_TYPE.TAG_IOT_INFO, iotInfo); } function handleOffTagInfo(array_data, b_new) { var tagnum = array_data[0] * 256 + array_data[1]; if (tagnum < 1) { return; } g_is_tag_off = {}; var offset = 2; for (var i = 0; i < tagnum; i++) { var off_tagid = 0; if (b_new) { if(tag64Checked) { off_tagid = Byte_Calc(array_data, 8, offset); offset += 8; } else { off_tagid = Byte_Calc(array_data, 4, offset); offset += 4; } } else { off_tagid = Byte_Calc(array_data, 2, offset); offset += 2; } g_is_tag_off[off_tagid] = true; } CallbackRegisterFunc(this_obj.CB_TYPE.TAG_OFF_LINE, g_is_tag_off); } function handlePosDataRSSI(array_data, b_new, bit) { var tagnum = array_data[0]; if (tagnum < 1) { return; } var offset = 1; var timenow = $.now(); for (var i = 0; i < tagnum; i++) { var pos = {}; if (b_new) { if (bit == 32){ pos.id = Byte_Calc(array_data, 4, offset); offset += 4; } else { pos.id = Byte_Calc(array_data, 8, offset); offset += 8; } } else { pos.id = array_data[offset] * 256 + array_data[offset + 1]; offset += 2; } pos.x = array_data[offset] * 16777216 + array_data[offset + 1] * 65536 + array_data[offset + 2] * 256 + array_data[offset + 3]; if ((array_data[offset] & 0x80) == 0x80) { pos.x = -(0xffffffff - pos.x + 1); } offset += 4; pos.y = array_data[offset] * 16777216 + array_data[offset + 1] * 65536 + array_data[offset + 2] * 256 + array_data[offset + 3]; if ((array_data[offset] & 0x80) == 0x80) { pos.y = -(0xffffffff - pos.y + 1); } offset += 4; pos.z = array_data[offset] * 256 + array_data[offset + 1]; if ((array_data[offset] & 0x80) == 0x80) { pos.z = -(0xffff - pos.z + 1); } offset += 2; pos.regid = array_data[offset] * 256 + array_data[offset + 1]; offset += 2;//地图id 2字节 pos.timestamp = array_data[offset] * 16777216 + array_data[offset + 1] * 65536 + array_data[offset + 2] * 256 + array_data[offset + 3]; offset += 4; pos.floor = array_data[offset];//楼层编号 offset += 1; pos.reserverd = array_data[offset];//预留 offset += 1; pos.added_len = array_data[offset];//附加信息长度 offset += 1; var added = [];//附加信息 var len_1_beacon = 21;//单个附加信息beacon的长度为21字节 for (var tt = 0; tt < pos.added_len/21; tt++) { var add = {}; add.UUID = Byte_Calc(array_data, 16, offset); offset += 16; add.Major = Byte_Calc(array_data, 2, offset); offset += 2; add.Minor = Byte_Calc(array_data, 2, offset); offset += 2; add.RSSI = array_data[offset]; if ((array_data[offset] & 0x80) == 0x80) {//RSSI为有符号 add.RSSI = -(0xff - add.RSSI + 1); } offset += 1; added[tt] = add; } pos.added = added;//RSSI解析 pos.timestamp_web = timenow; // 用来老化数据 g_posdata[pos.id] = pos; } array_data = null; // CallbackRegisterFunc(this_obj.CB_TYPE.TAG_POS, g_posdata); m_callback_adj.PosUpdateNow(); } function handleTagPow(array_data, b_new){ let data = new Object var tagnum = array_data[0]; if (tagnum < 1) { return; } var offset = 1; for (var i = 0; i < tagnum; i++) { var tag = {}; if (b_new) { if(tag64Checked) { tag.tagid = Byte_Calc(array_data, 8, offset); offset += 8; } else { tag.tagid = Byte_Calc(array_data, 4, offset); offset += 4; } } else { tag.tagid = array_data[offset] * 256 + array_data[offset + 1]; offset += 2; } if(tag64Show) { tag.tagid = tag.tagid.toString(16) } tag.cap = array_data[offset]; offset += 1; tag.bcharge = array_data[offset]; offset += 1; data[tag.tagid] = tag } CallbackRegisterFunc(this_obj.CB_TYPE.TAG_POWER, data); } function handlePosData(array_data, b_new, isGeo, isGlobal) { var tagnum = array_data[0]; if (tagnum < 1) { return; } g_posdata = {}; var offset = 1; var timenow = $.now(); for (var i = 0; i < tagnum; i++) { var pos = {}; pos.isGlobalGraphicCoord = isGlobal || false; pos.isGeoGraphicCoord = isGeo || false; if (b_new) { if(tag64Checked) { pos.id = Byte_Calc(array_data, 8, offset); offset += 8; } else if(isGeo) {//uwb gps坐标tagid固定4字节 pos.id = Byte_Calc(array_data, 4, offset); offset += 4; } else { pos.id = Byte_Calc(array_data, 4, offset); offset += 4; } } else { pos.id = array_data[offset] * 256 + array_data[offset + 1]; offset += 2; } if(tag64Show) { pos.id = pos.id.toString(16) } pos.x = array_data[offset] * 16777216 + array_data[offset + 1] * 65536 + array_data[offset + 2] * 256 + array_data[offset + 3]; if ((array_data[offset] & 0x80) == 0x80) { pos.x = -(0xffffffff - pos.x + 1); } if(undefined !== isGeo && isGeo==true) {//将xyz各自除以10000000.0 pos.x = pos.x / 10000000.0; } else { pos.x = pos.x / 100; } offset += 4; pos.y = array_data[offset] * 16777216 + array_data[offset + 1] * 65536 + array_data[offset + 2] * 256 + array_data[offset + 3]; if ((array_data[offset] & 0x80) == 0x80) { pos.y = -(0xffffffff - pos.y + 1); } if(undefined !== isGeo && isGeo==true) {//将xyz各自除以10000000.0 pos.y = pos.y / 10000000.0; } else { pos.y = pos.y / 100; } offset += 4; pos.z = array_data[offset] * 256 + array_data[offset + 1]; if ((array_data[offset] & 0x80) == 0x80) { pos.z = -(0xffff - pos.z + 1); } if(undefined !== isGeo && isGeo==true) {//将xyz各自除以10000000.0 pos.z = pos.z / 10000000.0; } else { pos.z = pos.z / 100; } offset += 2; pos.regid = array_data[offset]; offset += 1; pos.cap = array_data[offset]; offset += 1; pos.sleep = (array_data[offset] & 0x10) ? true : false; pos.bcharge = (array_data[offset] & 0x01) ? true : false; offset += 1; pos.timestamp = array_data[offset] * 16777216 + array_data[offset + 1] * 65536 + array_data[offset + 2] * 256 + array_data[offset + 3]; offset += 4; //pos.reserverd = array_data[offset] * 256 + array_data[offset + 1]; offset += 2; //当前标签的绑定情况+ //pos.bindmaster = g_scope.tagid2name[pos.id] ? g_scope.tagid2name[pos.id] : pos.id; //pos.timestamp_web = timenow; // 用来老化数据 /* 不再判断动态的休眠 // 休眠状态处理,只要有移动,强制给 未休眠 if(pos.id in g_posdata && g_posdata[pos.id].last_x){ var pos_last = g_posdata[pos.id]; pos.last_x = pos_last.last_x; pos.last_y = pos_last.last_y; pos.last_z = pos_last.last_z; if(pos.last_x != pos.x || pos.last_y != pos.y || pos.last_z != pos.z ){ // 只要有移动,强制给 未休眠 pos.last_x = pos.x; pos.last_y = pos.y; pos.last_z = pos.z; pos.sleep = false; } }else{// 初始状态 pos.last_x = pos.x; pos.last_y = pos.y; pos.last_z = pos.z; pos.sleep = false; } */ g_posdata[pos.id] = pos; } array_data = null; data = null; CallbackRegisterFunc(this_obj.CB_TYPE.TAG_POS, g_posdata); }; //报警 function handleAlarmInfo(array_data, b_new) { var alarm = new Object; var offset = 0; alarm.type = array_data[offset]; //0x01 电子围栏报警 0x02表示SOS报警 0x03表示剪断报警 0x04表示消失报警 offset += 1; if (b_new) { if(tag64Checked) { alarm.related_tagid = Byte_Calc(array_data, 8, offset); offset += 8; } else { alarm.related_tagid = Byte_Calc(array_data, 4, offset); offset += 4; } } else { alarm.related_tagid = Byte_Calc(array_data, 2, offset); offset += 2; } if(tag64Show) { alarm.related_tagid = alarm.related_tagid.toString(16) } alarm.timestamp = array_data[offset] * 16777216 * 16777216 * 256 + array_data[offset + 1] * 16777216 * 16777216 + array_data[offset + 2] * 16777216 * 65536 + array_data[offset + 3] * 16777216 * 256 + array_data[offset + 4] * 16777216 + array_data[offset + 5] * 65536 + array_data[offset + 6] * 256 + array_data[offset + 7]; offset += 8; alarm.alarm_info = ""; if (b_new) { for (var i = 0; i < 120; i += 2) { var code = array_data[offset] + array_data[offset + 1] * 256; if (code != 0) { alarm.alarm_info += String.fromCharCode(code); } offset += 2; } } else { offset += 120; } CallbackRegisterFunc(this_obj.CB_TYPE.GAO_JING, alarm); }; function handleAlarmInfoExt(array_data, b_new) { var alarm = new Object; var offset = 0; alarm.type = array_data[offset]; //0x01 电子围栏报警 0x02表示SOS报警 0x03表示剪断报警 0x04表示消失报警 offset += 1; if (b_new) { if(tag64Checked) { alarm.related_tagid = Byte_Calc(array_data, 8, offset); offset += 8; } else { alarm.related_tagid = Byte_Calc(array_data, 4, offset); offset += 4; } } else { alarm.related_tagid = Byte_Calc(array_data, 2, offset); offset += 2; } alarm.timestamp = array_data[offset] * 16777216 * 16777216 * 256 + array_data[offset + 1] * 16777216 * 16777216 + array_data[offset + 2] * 16777216 * 65536 + array_data[offset + 3] * 16777216 * 256 + array_data[offset + 4] * 16777216 + array_data[offset + 5] * 65536 + array_data[offset + 6] * 256 + array_data[offset + 7]; offset += 8; //offset80 start alarm.fence_id = 0; for (var i = 0; i < 8; i++) { alarm.fence_id += array_data[offset]; alarm.fence_id *= 256; offset += 1; }; alarm.fence_id /= 256; alarm.self_xpos = array_data[offset] * 16777216 + array_data[offset + 1] * 65536 + array_data[offset + 2] * 256 + array_data[offset + 3]; if ((array_data[offset] & 0x80) == 0x80) { alarm.self_xpos = -(0xffffffff - alarm.self_xpos + 1); } alarm.self_xpos = alarm.self_xpos/100; offset += 4; alarm.self_ypos = array_data[offset] * 16777216 + array_data[offset + 1] * 65536 + array_data[offset + 2] * 256 + array_data[offset + 3]; if ((array_data[offset] & 0x80) == 0x80) { alarm.self_ypos = -(0xffffffff - alarm.self_ypos + 1); } alarm.self_ypos = alarm.self_ypos/100 offset += 4; alarm.edge_name = ""; if (b_new) { for (var i = 0; i < 30; i += 2) { var code = array_data[offset] + array_data[offset + 1] * 256; if (code != 0) { alarm.edge_name += String.fromCharCode(code); } offset += 2; } } else { offset += 30; } alarm.vertex_name = ""; if (b_new) { for (var i = 0; i < 30; i += 2) { var code = array_data[offset] + array_data[offset + 1] * 256; if (code != 0) { alarm.vertex_name += String.fromCharCode(code); } offset += 2; } } else { offset += 30; } alarm.v_dis = array_data[offset] * 16777216 + array_data[offset + 1] * 65536 + array_data[offset + 2] * 256 + array_data[offset + 3]; offset += 4; //offset80 end //offset += 80; alarm.id = array_data[offset] * 16777216 * 16777216 * 256 + array_data[offset + 1] * 16777216 * 16777216 + array_data[offset + 2] * 16777216 * 65536 + array_data[offset + 3] * 16777216 * 256 + array_data[offset + 4] * 16777216 + array_data[offset + 5] * 65536 + array_data[offset + 6] * 256 + array_data[offset + 7]; /*if( alarm.type<=4)*/ //recevGaojing(alarm, $scope); CallbackRegisterFunc(this_obj.CB_TYPE.GAO_JING, alarm); }; //区域进出消息 function handleAreaInfoExt2(array_data, b_new) { var area_info = new Object(); var offset = 0; if(tag64Checked) { area_info.tag_id = Byte_Calc(array_data, 8, offset); offset += 8; } else { area_info.tag_id = Byte_Calc(array_data, 4, offset); offset += 4; } if(tag64Show) { area_info.tag_id = area_info.tag_id.toString(16) } var tag_name_len = Byte_Calc(array_data, 2, offset); offset += 2; area_info.tag_name = ""; if (b_new) { for (var i = 0; i < tag_name_len; i += 2) { var code = array_data[offset] + array_data[offset + 1] * 256; if (code != 0) { area_info.tag_name += String.fromCharCode(code); } offset += 2; } } else { offset += tag_name_len; } area_info.area_id = Byte_Calc(array_data, 8, offset); offset += 8; var arae_name_len = Byte_Calc(array_data, 2, offset); offset += 2; area_info.area_name = ""; if (b_new) { for (var j = 0; j < arae_name_len; j += 2) { var code = array_data[offset] + array_data[offset + 1] * 256; if (code != 0) { area_info.area_name += String.fromCharCode(code); } offset += 2; } } else { offset += arae_name_len; } area_info.map_id = Byte_Calc(array_data, 2, offset); offset += 2; var map_name_len = Byte_Calc(array_data, 2, offset); offset += 2; area_info.map_name = ""; if (b_new) { for (var k = 0; k < map_name_len; k += 2) { var code = array_data[offset] + array_data[offset + 1] * 256; if (code != 0) { area_info.map_name += String.fromCharCode(code); } offset += 2; } } else { offset += map_name_len; } area_info.status = Byte_Calc(array_data, 1, offset); offset += 1; area_info.timestamp = Byte_Calc(array_data, 8, offset); offset += 8; CallbackRegisterFunc(this_obj.CB_TYPE.AREA_INFO, area_info); } function handleAlarmInfoExt2(array_data, b_new) { var alarm = new Object; var offset = 0; alarm.type = array_data[offset]; //0x01 电子围栏报警 0x02表示SOS报警 0x03表示剪断报警 0x04表示消失报警 offset += 1; if (b_new) { if(tag64Checked) { alarm.related_tagid = Byte_Calc(array_data, 8, offset); offset += 8; } else { alarm.related_tagid = Byte_Calc(array_data, 4, offset); offset += 4; } } else { alarm.related_tagid = Byte_Calc(array_data, 2, offset); offset += 2; } alarm.timestamp = array_data[offset] * 16777216 * 16777216 * 256 + array_data[offset + 1] * 16777216 * 16777216 + array_data[offset + 2] * 16777216 * 65536 + array_data[offset + 3] * 16777216 * 256 + array_data[offset + 4] * 16777216 + array_data[offset + 5] * 65536 + array_data[offset + 6] * 256 + array_data[offset + 7]; offset += 8; //offset80 start alarm.fence_id = 0; for (var i = 0; i < 8; i++) { alarm.fence_id += array_data[offset]; alarm.fence_id *= 256; offset += 1; }; alarm.fence_id /= 256; alarm.self_xpos = array_data[offset] * 16777216 + array_data[offset + 1] * 65536 + array_data[offset + 2] * 256 + array_data[offset + 3]; if ((array_data[offset] & 0x80) == 0x80) { alarm.self_xpos = -(0xffffffff - alarm.self_xpos + 1); } offset += 4; alarm.self_ypos = array_data[offset] * 16777216 + array_data[offset + 1] * 65536 + array_data[offset + 2] * 256 + array_data[offset + 3]; if ((array_data[offset] & 0x80) == 0x80) { alarm.self_ypos = -(0xffffffff - alarm.self_ypos + 1); } offset += 4; offset += 30; //保留字段,30个字节 alarm.fence_name = ""; if (b_new) { for (var i = 0; i < 34; i += 2) { var code = array_data[offset] + array_data[offset + 1] * 256; if (code != 0) { //code != 0 alarm.fence_name += String.fromCharCode(code); } offset += 2; } } else { offset += 34; } alarm.id = array_data[offset] * 16777216 * 16777216 * 256 + array_data[offset + 1] * 16777216 * 16777216 + array_data[offset + 2] * 16777216 * 65536 + array_data[offset + 3] * 16777216 * 256 + array_data[offset + 4] * 16777216 + array_data[offset + 5] * 65536 + array_data[offset + 6] * 256 + array_data[offset + 7]; /*if( alarm.type<=4)*/ offset += 8; offset += 19; alarm.regid = array_data[offset] * 256 + array_data[offset + 1]; offset += 12; let if_content = array_data[offset]; //等于2时表示带了告警消息 offset += 1; if (if_content && if_content == 2) { let content_len = array_data[offset] * 256 + array_data[offset + 1]; offset += 2; alarm.content = ""; for (var i = 0; i < content_len; i += 2) { var code = array_data[offset] + array_data[offset + 1] * 256; if (code != 0) { alarm.content += String.fromCharCode(code); } offset += 2; } offset += content_len; } CallbackRegisterFunc(this_obj.CB_TYPE.GAO_JING, alarm); }; function handleModifyData(array_data, b_new) { var offset = 0; var modify_info = {}; modify_info.broadcastType = Byte_Calc(array_data, 1, 0); offset += 1; modify_info.param = Byte_Calc(array_data, 1, 1); offset += 1; CallbackRegisterFunc(this_obj.CB_TYPE.MOD_DATA, modify_info); }; /**电子点名统计区域解析**/ function handleDmData(array_data, b_new) { var dianming = new Object; var offset = 0; dianming.area_frame = array_data[offset] * 256 + array_data[offset + 1]; offset += 2; dianming.area_framenumber = array_data[offset] * 256 + array_data[offset + 1]; offset += 2; dianming.areanumber = array_data[offset++]; if (dianming.areanumber < 1) { return; } var areanumber_array = []; for (var i = 0; i < dianming.areanumber; i++) { var areanumber = {}; areanumber.id = Byte_Calc(array_data, 8, offset); offset += 8; var area_name_length = array_data[offset++]; if (area_name_length < 1) { return; } //区域名称 areanumber.areaname = ""; if (b_new) { for (var j = 0; j < area_name_length; j += 2) { var code = array_data[offset] + array_data[offset + 1] * 256; areanumber.areaname += String.fromCharCode(code); offset += 2; } } else { offset += area_name_length; } areanumber.area_tag_number = array_data[offset] * 256 + array_data[offset + 1]; offset += 2; //到区域标签 areanumber.area_tag_list = []; for (var i_N2 = 0; i_N2 < areanumber.area_tag_number; i_N2++) { var areaTagnum = {}; if(tag64Checked) { areaTagnum.id = Byte_Calc(array_data, 8, offset); offset += 8; } else { areaTagnum.id = Byte_Calc(array_data, 4, offset); offset += 4; } if(tag64Show) { areaTagnum.id = areaTagnum.id.toString(16) } var tag_name_length = array_data[offset++]; areaTagnum.tag_name = ""; if (b_new) { for (var j = 0; j < tag_name_length; j += 2) { var code = array_data[offset] + array_data[offset + 1] * 256; areaTagnum.tag_name += String.fromCharCode(code); offset += 2; } } else { offset += tag_name_length; } var group_name_lens = array_data[offset++]; areaTagnum.group_name = ""; if (b_new) { for (var j = 0; j < group_name_lens; j += 2) { var code = array_data[offset] + array_data[offset + 1] * 256; areaTagnum.group_name += String.fromCharCode(code); offset += 2; } } else { offset += group_name_lens; } //预留 areaTagnum.state = array_data[offset++]; areaTagnum.ontime = array_data[offset] * 16777216 * 16777216 * 256 + array_data[offset + 1] * 16777216 * 16777216 + array_data[offset + 2] * 16777216 * 65536 + array_data[offset + 3] * 16777216 * 256 + array_data[offset + 4] * 16777216 + array_data[offset + 5] * 65536 + array_data[offset + 6] * 256 + array_data[offset + 7]; offset += 8; //预留 areaTagnum.offtime = array_data[offset] * 16777216 * 16777216 * 256 + array_data[offset + 1] * 16777216 * 16777216 + array_data[offset + 2] * 16777216 * 65536 + array_data[offset + 3] * 16777216 * 256 + array_data[offset + 4] * 16777216 + array_data[offset + 5] * 65536 + array_data[offset + 6] * 256 + array_data[offset + 7]; offset += 8; areaTagnum.timelens = array_data[offset] * 16777216 + array_data[offset + 1] * 65536 + array_data[offset + 2] * 256 + array_data[offset + 3]; offset += 4; //预留 areaTagnum.isassociated = array_data[offset] * 16777216 + array_data[offset + 1] * 65536 + array_data[offset + 2] * 256 + array_data[offset + 3]; offset += 4; areanumber.area_tag_list.push(areaTagnum); } //预留字节 //var obligatetag = array_data[offset] * 16777216 + array_data[offset + 1] * 65536 + array_data[offset + 2] * 256 + array_data[offset + 3]; //areanumber.obligatetag = obligatetag; areanumber_array = areanumber; } //vote_task_time_obj.setOrReplaceData(areanumber_array); CallbackRegisterFunc(this_obj.CB_TYPE.ROLLCALL_DATA, areanumber_array); }; function handleAppendInfo(array_data, b_new) { var heartRateDate = {}; var offset = 0; if (b_new) { if(tag64Checked) { heartRateDate.tag_id = Byte_Calc(array_data, 8, offset); offset += 8; } else { heartRateDate.tag_id = Byte_Calc(array_data, 4, offset); offset += 4; } } else { heartRateDate.tag_id = array_data[offset] * 256 + array_data[offset + 1]; offset += 2; } if(tag64Show) { heartRateDate.tag_id = heartRateDate.tag_id.toString(16) } offset += 2; let type = array_data[offset]; heartRateDate.type = type if (type == 0xd5) { //固定字节为0xD5 offset += 1; heartRateDate.value = array_data[offset]; heartRateDate.updatetimestamp = array_data[offset + 1] * 16777216 * 16777216 * 256 + array_data[offset + 2] * 16777216 * 16777216 + array_data[offset + 3] * 16777216 * 65536 + array_data[offset + 4] * 16777216 * 256 + array_data[offset + 5] * 16777216 + array_data[offset + 6] * 65536 + array_data[offset + 7] * 256 + array_data[offset + 8]; } CallbackRegisterFunc(this_obj.CB_TYPE.HEART_INFO, heartRateDate); }; //0xD7帧头,针对心率血样体温进行数据推送 function handleSignData(array_data, b_new) { var signData = new Object(); var offset = 0; signData.tag_id = Byte_Calc(array_data, 8, offset); offset += 8; if(tag64Show) { signData.tag_id = signData.tag_id.toString(16) } let type = array_data[offset]; offset += 1 signData.type = type switch(type){ case 1:signData.value = Byte_Calc(array_data, 2, offset);break;//心率 case 2:signData.value = Byte_Calc(array_data, 2, offset);break;//血氧 case 3:signData.value = Byte_Calc(array_data, 2, offset) / 100;break;//体温 case 4:signData.value = Byte_Calc(array_data, 2, offset);break;//血压的收缩压 } offset += 2 signData.other = Byte_Calc(array_data, 2, offset);//type为4时表示血压的舒张压 offset += 2 signData.updatetimestamp=Byte_Calc(array_data, 8, offset); CallbackRegisterFunc(this_obj.CB_TYPE.SIGN_INFO, signData); } function handleErrorInfo(array_data, b_new) { var error_info = {}; var offset = 0; error_info.error_no = array_data[offset] * 16777216 + array_data[offset + 1] * 65536 + array_data[offset + 2] * 256 + array_data[offset + 3]; offset += 4; error_info.error_len = array_data[offset] * 16777216 + array_data[offset + 1] * 65536 + array_data[offset + 2] * 256 + array_data[offset + 3]; offset += 4; error_info.error_msg = ""; for (var i = 0; i < error_info.error_len; i += 2) { var code = array_data[offset] + array_data[offset + 1] * 256; error_info.error_msg += String.fromCharCode(code); offset += 2; } CallbackRegisterFunc(this_obj.CB_TYPE.ERROR_INFO, error_info); }; var person_info = {}; function handlePersonInfo(array_data, b_new) { /** * 目前服务端推送和协议不一致 * 实际推送时,一帧是推送一个地图,当total和num相等时,一轮结束,完成一次所有图层统计 */ // 偏移量 var offset = 0; // 总帧 var total = array_data[offset] * 256 + array_data[offset + 1]; offset += 2; if (total == 1) { // 总帧数为1的情况下,每次推送都置空避免旧数据影响 person_info = {}; } // 当前帧数 var num = array_data[offset] * 256 + array_data[offset + 1]; if (num == 1){ // 当前帧为1的情况下,清空上次缓存的数据避免重复添加 person_info = {} } offset += 2; // 标签总数 var tag_total = array_data[offset] * 256 + array_data[offset + 1]; person_info.tag_total = tag_total; offset += 2; // 在线标签数 var online_num = array_data[offset] * 256 + array_data[offset + 1]; person_info.tag_online_total = online_num; offset += 2; if(!person_info.map_infos) { person_info.map_infos = {}; } // 当前帧推送的地图数 var mapNum = array_data[offset]; offset += 1; var map_id = array_data[offset] * 256 + array_data[offset + 1]; if(person_info.map_infos[map_id]){ var map_obj = person_info.map_infos[map_id]; } else { var map_obj = {}; map_obj.map_name = ""; map_obj.online_counts = 0; map_obj.tags = []; map_obj.map_id = map_id; } offset += 2; var map_name_length = array_data[offset]; offset += 1; if (b_new) { for (var j = 0; j < map_name_length; j += 2) { var code = array_data[offset] + array_data[offset + 1] * 256; map_obj.map_name += String.fromCharCode(code); offset += 2; } } else { offset += map_name_length; } var online_counts = array_data[offset] * 256 + array_data[offset + 1]; map_obj.online_counts += online_counts; offset += 2; for (var j = 0; j < online_counts; j++) { var tag_id = -1; if (b_new) { if (tag64Checked){ tag_id = Byte_Calc(array_data, 8, offset); offset += 8; } else { tag_id = Byte_Calc(array_data, 4, offset); offset += 4; } } else { tag_id = array_data[offset] * 256 + array_data[offset + 1]; offset += 2; } if(tag64Show) { tag_id = tag_id.toString(16) } /*var reserve = array_data[offset] * 16777216 + array_data[offset + 1] * 65536 + array_data[offset + 2] * 256 + array_data[offset + 3]; offset += 4;*/ var tag_info = { 'tag_id': tag_id, /*'reserve': reserve,*/ //20190129服务端相应去掉预留 yates }; map_obj.tags.push(tag_info); } offset += 2; //预留2字节 person_info.map_infos[map_obj.map_id] = map_obj; if (num == total) { person_info.map_num = Object.keys(person_info.map_infos).length; CallbackRegisterFunc(this_obj.CB_TYPE.PERSON_INFO, person_info); } }; this_obj.RejectExtraInfo = function (callback) { if (ws2) { ws2.onclose = function (event) { if ($.isFunction(callback)) { callback(event); } }; ws2.close(); } }; //对外:获取其它信息:距离+基站状态 this_obj.RequireExtraInfo = function (url,ws='ws') { try { /*ws2 = new WebSocket("ws://"+webSocketHostURL+":9001",["localSensePirvate-protocol"]);*/ ws2 = new ReconnectingWebSocket(ws+"://" + url, ["localSensePrivate-protocol"], webSocketOptions); /*1.4版本*/ ws2.onopen = function (event) { getAndsendGrpAccess(ws2); //认证一次数据权限 CallbackRegisterFunc(this_obj.CB_TYPE.ON_OPEN, "websocket已建立连接"); }; ws2.onmessage = function (event) { if (event.data instanceof Blob) { var reader = new FileReader(); reader.readAsArrayBuffer(event.data); reader.onload = function (evt) { if (evt.target.readyState == FileReader.DONE) { var msgtype_s = -1; var x = new Uint8Array(evt.target.result); if (x[0] == 0xCC && x[1] == 0x5F) { msgtype_s = x[2]; } var x_data = x.subarray(3); var msgtype = msgtype_s & TYPE.TYPE_MASK; var b_new = (msgtype_s & TYPE.NEW_MASK) == TYPE.NEW_MASK; if (msgtype == TYPE.FrameType_DIS) { handleDistanceData(x_data, b_new); } else if (msgtype == TYPE.FrameType_HeartRate_study) { //学习过的心率推送 handleHeartRate(x_data, b_new); } else if (msgtype == TYPE.FrameType_EeCfg) { handleAlarmSwitch(x_data, b_new); } } }; } }; ws2.onclose = function (event) { CallbackRegisterFunc(this_obj.CB_TYPE.ON_CLOSE, "websocket已关闭连接"); }; ws2.onerror = function (event) { CallbackRegisterFunc(this_obj.CB_TYPE.ON_ERROR, "websocket已断开连接"); }; } catch (ex) { //alert(ex.message); } }; function handleDistanceData(array_data, b_new) { var disData = new Object(); var offset = 0; if (b_new) { if(tag64Checked) { disData.tagid = Byte_Calc(array_data, 8, offset); offset += 8; } else { disData.tagid = Byte_Calc(array_data, 4, offset); offset += 4; } } else { disData.tagid = Byte_Calc(array_data, 2, offset); offset += 2; } var basenum = array_data[offset]; if (basenum < 1) { return; } offset += 1; var dis_array = new Array(basenum); for (var i = 0; i < basenum; i++) { var base = new Object(); if (b_new) { base.id = array_data[offset] * 16777216 + array_data[offset + 1] * 65536 + array_data[offset + 2] * 256 + array_data[offset + 3]; offset += 4; } else { base.id = array_data[offset] * 256 + array_data[offset + 1]; offset += 2; } base.ranging = array_data[offset] * 256 + array_data[offset + 1]; offset += 2; if (b_new) { base.timestamp = array_data[offset + 1] * 16777216 * 16777216 * 256 + array_data[offset + 1] * 16777216 * 16777216 + array_data[offset + 2] * 16777216 * 65536 + array_data[offset + 3] * 16777216 * 256 + array_data[offset + 4] * 16777216 + array_data[offset + 5] * 65536 + array_data[offset + 6] * 256 + array_data[offset + 7]; offset += 8; base.reserve = array_data[offset] * 16777216 + array_data[offset + 1] * 65536 + array_data[offset + 2] * 256 + array_data[offset + 3]; offset += 4; } else { base.quality = array_data[offset]; offset += 1; offset += 1; } dis_array.push(base); } disData.dis_array = dis_array; CallbackRegisterFunc(this_obj.CB_TYPE.DISTANCE_DATA, disData); }; function handleBaseStData(array_data, b_new) { var offset = 0; var basenum = array_data[offset]; if (basenum < 1) { return; } g_base_state = {}; offset += 1; var timenow = $.now(); for (var i = 0; i < basenum; i++) { var base = new Object(); if (b_new) { base.id = array_data[offset] * 16777216 + array_data[offset + 1] * 65536 + array_data[offset + 2] * 256 + array_data[offset + 3]; offset += 4; } else { base.id = array_data[offset] * 256 + array_data[offset + 1]; offset += 2; } base.state = array_data[offset]; offset += 1; base.x = array_data[offset] * 16777216 + array_data[offset + 1] * 65536 + array_data[offset + 2] * 256 + array_data[offset + 3]; if ((array_data[offset] & 0x80) == 0x80) { base.x = -(0xffffffff - base.x + 1); } offset += 4; base.y = array_data[offset] * 16777216 + array_data[offset + 1] * 65536 + array_data[offset + 2] * 256 + array_data[offset + 3]; if ((array_data[offset] & 0x80) == 0x80) { base.y = -(0xffffffff - base.y + 1); } offset += 4; base.z = array_data[offset] * 256 + array_data[offset + 1]; offset += 2; base.regid = array_data[offset]; offset += 1; base.x = base.x; base.y = base.y; //base.web_ts = timenow; // 用来老化数据 g_base_state[base.id] = base; } CallbackRegisterFunc(this_obj.CB_TYPE.BASE_ST_DATA, g_base_state); }; //学习心率的解析 function handleHeartRate(array_data, b_new){ var heartRateDate = new Object(); var offset = 0; if (!tag64Checked){ heartRateDate.tag_id = Byte_Calc(array_data, 4, offset); offset += 4; } else { heartRateDate.tag_id = Byte_Calc(array_data, 8, offset); offset += 8; } heartRateDate.heart = array_data[offset]; offset += 1; heartRateDate.minHeart = array_data[offset]; offset += 1; heartRateDate.maxHeart = array_data[offset]; offset += 2; heartRateDate.updatetimestamp = array_data[offset + 1] * 16777216 * 16777216 * 256 + array_data[offset + 2] * 16777216 * 16777216 + array_data[offset + 3] * 16777216 * 65536 + array_data[offset + 4] * 16777216 * 256 + array_data[offset + 5] * 16777216 + array_data[offset + 6] * 65536 + array_data[offset + 7] * 256 + array_data[offset + 8]; CallbackRegisterFunc(this_obj.CB_TYPE.HEART_INFO_STUDY, heartRateDate); } // 各种开关的回调 function handleSwitchCallBack(func, state) { //回调 var result = { "func": func, "args": [state], }; CallbackRegisterFunc(this_obj.CB_TYPE.WS_SWITCH_RESULT, result); }; function handleVideoInfoChange(result) { CallbackRegisterFunc(this_obj.CB_TYPE.WS_VIDEO_CHANGE, result); } //访客告警发送 this_obj.Send2WS_SendTagConf = function (mess) { //type: pre提前入场out超时未退卡 var param = { "localsense_tagconf": mess }; ws3.send(JSON.stringify(param)); }; // 所有按钮状态 this_obj.Send2WS_RequsetSwitch = function (type, state) { var value = state == 1 ? "enable" : "disable"; var param = { "localsense_conf_request": { "conf_type": type, "conf_value": value } }; if (ws3 != undefined) { if (ws3.readyState == 1) { var sendData = JSON.stringify(param); ws3.send(sendData); CallbackRegisterFunc(this_obj.CB_TYPE.WS_SWITCH_CLICK, param) } return ws3.readyState; } else { return 0; } } //区域超员告警总开关启停请求 this_obj.Send2WS_RequsetSwitchOverman = function (state) { var ws_api = window.LOCALSENSE.WEBSOCKET_API; ws_api.Send2WS_RequsetSwitchArraign(state); var value = state == 1 ? "enable" : "disable"; var param = { "localsense_conf_request": { "conf_type": "overman", "conf_value": value } }; if (ws3 != undefined) { if (ws3.readyState == 1) { ws3.send(JSON.stringify(param)); } return ws3.readyState; } else { return 0; } }; this_obj.Send2WS_RequsetVideoOpen = function (tagid) { if (ws3) { if (ws3.readyState == 1) { var param = { "localsense_video_request": { "tagid": tagid, "track": "true" } }; ws3.send(JSON.stringify(param)); CallbackRegisterFunc(this_obj.CB_TYPE.WS_VIDEO_SEND, JSON.stringify(param)); } } }; //摄像头关闭请求 this_obj.Send2WS_RequsetVideoClose = function (tagid) { if (ws3) { if (ws3.readyState == 1) { var param = { "localsense_video_request": { "tagid": tagid, "track": "false" } }; ws3.send(JSON.stringify(param)); CallbackRegisterFunc(this_obj.CB_TYPE.WS_VIDEO_CLOSE, JSON.stringify(param)); } } }; //请求标签振动蜂鸣 this_obj.Send2WS_RequsetTagShakeBuzzReq = function (conf_type, conf_value, tagid) { if (ws3) { if (ws3.readyState == 1) { var param = { "localsense_conf_request": { "conf_type": conf_type, "conf_value": conf_value, "tagid": tagid } }; ws3.send(JSON.stringify(param)); CallbackRegisterFunc(this_obj.CB_TYPE.WS_TAG_SHAKE, JSON.stringify(param)); } } }; //抑制告警id的持续推送 this_obj.sendAlarmWSRequestToServer = function (data) { if (data && ws3 && ws3.readyState == 1) { var param = { "localsense_alarm_request": { "conf_type": "restrain", "conf_value": data } }; ws3.send(JSON.stringify(param)); } }; this_obj.Send2WS_SendJsonToServer = function (data) { if (ws3) { if (ws3.readyState == 1) { ws3.send(JSON.stringify(data)); } } }; // 过滤栏 this_obj.Send2WS_RssTagClicked = function (tagArr) { var rss_content = tagArr; var rss_taglst = rss_content == "" ? "" : rss_content.split(":"); //为空时,表示取消订阅 var tag32or64Len = 4; if(tag64Checked) { tag32or64Len = 8; } var buffer = new ArrayBuffer(11 + rss_taglst.length * tag32or64Len); var int8view = new Uint8Array(buffer); var tIndex = 0; int8view[tIndex++] = 0xCC; int8view[tIndex++] = 0x5F; int8view[tIndex++] = 0xA9; int8view[tIndex++] = 0x00; int8view[tIndex++] = 0x00; int8view[tIndex++] = parseInt(rss_taglst.length) >> 8; int8view[tIndex++] = parseInt(rss_taglst.length); for (var i = 0; i < rss_taglst.length; i++) { var tag16str = "" + Number(rss_taglst[i]).toString(16); var tag16 = 0; if(tag64Checked) { while(tag16str.length < 16) { tag16str = "0" + tag16str; } int8view[tIndex++] = parseInt(tag16str.substr(0,2), 16); int8view[tIndex++] = parseInt(tag16str.substr(2,2), 16); int8view[tIndex++] = parseInt(tag16str.substr(4,2), 16); int8view[tIndex++] = parseInt(tag16str.substr(6,2), 16); int8view[tIndex++] = parseInt(tag16str.substr(8,2), 16); int8view[tIndex++] = parseInt(tag16str.substr(10,2), 16); int8view[tIndex++] = parseInt(tag16str.substr(12,2), 16); int8view[tIndex++] = parseInt(tag16str.substr(14,2), 16); } else { while(tag16str.length < 8) { tag16str = "0" + tag16str; } int8view[tIndex++] = parseInt(tag16str.substr(0,2), 16); int8view[tIndex++] = parseInt(tag16str.substr(2,2), 16); int8view[tIndex++] = parseInt(tag16str.substr(4,2), 16); int8view[tIndex++] = parseInt(tag16str.substr(6,2), 16); } } int8view[tIndex++] = 0xFF; int8view[tIndex++] = 0xFF; int8view[tIndex++] = 0xAA; int8view[tIndex++] = 0xBB; //如ws初始化未完成,则注入到回调 if(ws1 && ws1.readyState==1) { ws1.send(int8view.buffer); } } this_obj.Send2WS_RssGroupClicked = function (mapArr) { var rss_content = mapArr; var rss_grplst = rss_content == "" ? "" : rss_content.split(":"); //为空时,表示取消订阅 var rss_len = 0; for (var i = 0; i < rss_grplst.length; i++) { rss_len += rss_grplst[i].length; } var buffer = new ArrayBuffer(11 + rss_len); var int8view = new Uint8Array(buffer); var tIndex = 0; int8view[tIndex++] = 0xCC; int8view[tIndex++] = 0x5F; int8view[tIndex++] = 0xA9; int8view[tIndex++] = 0x00; int8view[tIndex++] = 0x01; int8view[tIndex++] = parseInt(rss_grplst.length) >> 8; int8view[tIndex++] = parseInt(rss_grplst.length); for (var i = 0; i < rss_grplst.length; i++) { int8view[tIndex++] = parseInt(rss_grplst[i].length) >> 8; int8view[tIndex++] = parseInt(rss_grplst[i].length); for (var j = 0; j < rss_grplst[i].length; j++) { int8view[tIndex++] = rss_grplst[i].charCodeAt(j); } } int8view[tIndex++] = 0xFF; int8view[tIndex++] = 0xFF; int8view[tIndex++] = 0xAA; int8view[tIndex++] = 0xBB; ws1.send(int8view.buffer); } /** * 按照地图订阅数据——图层 */ this_obj.Send2WS_RssMapClicked = function (mapArr) { var rss_content = mapArr; var rss_maplst = rss_content == "" ? "" : rss_content.split(":"); //为空时,表示取消订阅 var buffer = new ArrayBuffer(11 + rss_maplst.length * 4); var int8view = new Uint8Array(buffer); var tIndex = 0; int8view[tIndex++] = 0xCC; int8view[tIndex++] = 0x5F; int8view[tIndex++] = 0xA9; int8view[tIndex++] = 0x00; int8view[tIndex++] = 0x02; int8view[tIndex++] = parseInt(rss_maplst.length) >> 8; int8view[tIndex++] = parseInt(rss_maplst.length); for (var i = 0; i < rss_maplst.length; i++) { int8view[tIndex++] = parseInt(rss_maplst[i]) >> 24; int8view[tIndex++] = parseInt(rss_maplst[i]) >> 16; int8view[tIndex++] = parseInt(rss_maplst[i]) >> 8; int8view[tIndex++] = parseInt(rss_maplst[i]); } int8view[tIndex++] = 0xFF; int8view[tIndex++] = 0xFF; int8view[tIndex++] = 0xAA; int8view[tIndex++] = 0xBB; //如ws初始化未完成,则注入到回调 if(ws1 && ws1.readyState==1) { ws1.send(int8view.buffer); } }; //字符串转十六进制 function strToHexCharCode(str) { if (str === "") return ""; var hexCharCode = []; hexCharCode.push("0x"); for (var i = 0; i < str.length; i++) { hexCharCode.push((str.charCodeAt(i)).toString(16)); } return hexCharCode.join(""); }; //十六进制转字符 function hexCharCodeToStr(hexCharCodeStr) { var trimedStr = hexCharCodeStr.trim(); var rawStr = trimedStr.substr(0, 2).toLowerCase() === "0x" ? trimedStr.substr(2) : trimedStr; var len = rawStr.length; if (len % 2 !== 0) { alert("Illegal Format ASCII Code!"); return ""; } var curCharCode; var resultStr = []; for (var i = 0; i < len; i = i + 2) { curCharCode = parseInt(rawStr.substr(i, 2), 16); // ASCII Code Value resultStr.push(String.fromCharCode(curCharCode)); } return resultStr.join(""); }; //对高位取一次余数运算 function get_high_1_mod(sor, end) { /** * 10011100001 * 110 */ var end_len = end.length; var fst_sub = sor.substring(0, end_len); //100 var lst_sub = sor.substring(end_len); //11100001 if (parseInt(sor.substring(0, end_len), 2) < parseInt(end, 2)) { fst_sub = sor.substring(0, end_len + 1); //1001 lst_sub = sor.substring(end_len + 1); //1100001 } var sub_mod = (parseInt(fst_sub, 2) - parseInt(end, 2)).toString(2); //所减得到的余数 return sub_mod + lst_sub; }; //十六进制转二进制 function hexto0b(hex) { var len = "" + hex.length; return (Array(4 * len).join("0") + parseInt(hex, 16).toString(2)).slice(-4 * len); }; //二进制转16进制 function btohex(b) { var para = ""; para = b; var len = para.length; if (!(b.length) % 4 === 0) { para = (Array(4 * (Math.ceil(len % 4))).join("0") + b).slice(-len); //为了让 类似11000转为00011000 } var r = ""; for (var i = 0; i < para.length / 4; i++) { r += parseInt(para.substring(4 * i, 4 * (i + 1)), 2).toString(16); } return r; }; (function () { if (m_work_as_worker) { var obj = ['INIT_API_FUNC']; var val = {}; for (var k in this_obj) { var func = this_obj[k]; if ($.isFunction(func)) { val[k] = true; } else { val[k] = this_obj[k]; } } obj.push(val); var str = JSON.stringify(obj); //postMessage([obj]); postMessage(str); window.onmessage = function (e_in) { var this_obj = LOCALSENSE.WEBSOCKET_API; var args_in = JSON.parse(e_in.data); var func = args_in[0]; var args = args_in[1]; var this_func = this_obj[func]; if ($.isFunction(this_func)) { try { this_func.apply(this_obj, args); } catch (e) { console.error(e); } } }; } }()); }; }());