zhly-web/public/websocket api/localsense_websocket_api.js

2077 lines
82 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

(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);
}
}
};
}
}());
};
}());