李勇

1.优化白板标注模块发送的数据,对坐标点数组进行压缩优化,减少字节数;解压收到的坐标点数据还原成数组;目前这个版本能显示以前的数据,这个版本发送的标注,老版本的sdk将无法显示

... ... @@ -58,7 +58,7 @@ export default class MessageEntrance extends Emiter {
constructor() {
super();
//sdk 信息
GlobalConfig.sdkVersion = "v1.78.4.20170820";
GlobalConfig.sdkVersion = "v1.79.3.20170821";
loger.warn("sdkVersion:" + GlobalConfig.sdkVersion);
//设置
... ...
... ... @@ -15,17 +15,17 @@ class EngineUtils{
try{
return JSON.stringify(_param);
}catch (err){
console.log("arrayToJsonString error:"+err.message);
console.warn("数组转JSON失败->ERROR:"+err.message);
}
return null;
return "";
}
static arrayFromJsonString(_param){
try{
return JSON.parse(_param);
}catch (err){
console.log("arrayFromJsonString error:"+err.message);
console.warn("JSON转数组失败->ERROR:"+err.message);
}
return null;
return [];
}
//生成时间戳后9位 保证唯一
... ... @@ -91,7 +91,106 @@ class EngineUtils{
console.log("objectFromBase64 err:"+err.message);
return null;
}
return null
return null;
}
//优化压缩坐标点数组,去除一些连续重复坐标的点,返回一个数组
static compressPoint(_arr){
if(!_arr){
return [];
}
if(_arr.length<5){
//点,直线,矩形 坐标点小于5不需要处理
return _arr;
}
let tempPointArr=_arr;
let newPointArr=[];
newPointArr.push(tempPointArr[0]);
let lastW=tempPointArr[0].w;
let continueNum=0;//坐标相同的连续次数
//先筛除水平方向的连续重复坐标点
let len=tempPointArr.length-1;
for(let i=1;i<len;i++){
let item=tempPointArr[i];
if(item&&item.w!=lastW){
lastW=item.w;
if(continueNum>0){
newPointArr.push(tempPointArr[i-1]);
}
newPointArr.push(item);
continueNum=0;
}else {
continueNum++;
}
}
//如果最终的坐标点数量小于2,需要把最后一个坐标点添加
if(tempPointArr[len]){
newPointArr.push(tempPointArr[len]);
}
//如果坐标点已经小于等于2不需要继续检测
if(newPointArr.length<=2){
return newPointArr;
}
//筛除水垂直向的连续重复坐标点
let finalPointArr=[];
finalPointArr.push(newPointArr[0]);
let lastH=newPointArr[0].h;
continueNum=0;
len=newPointArr.length-1;
for(let k=1;k<len;k++){
let item=newPointArr[k];
if(item&&item.h!=lastH){
lastH=item.h;
if(continueNum>0){
finalPointArr.push(newPointArr[k-1]);
}
finalPointArr.push(item);
continueNum=0;
}else {
continueNum++;
}
}
if(newPointArr[len]){
finalPointArr.push(newPointArr[len]);
}
return finalPointArr;
}
//压缩数据,把坐标点数组转换为字符串,返回字符串
static optimizePoint(_pointGroup){
if(!_pointGroup){
return "";
}
let tempStr="";
try {
tempStr=JSON.stringify(_pointGroup);
}catch (err){
return "";
}
let regexp1=/},{"w":/g;
let regexp2=/,"h":/g;
tempStr=tempStr.replace(regexp1,"#");
tempStr=tempStr.replace(regexp2,"&");
//console.log("标注压缩后的字符长度->",tempStr.length);
return tempStr;
}
//把字符串坐标点集合转换为数组,返回数组的JSON
static unPackOptimizePoint(_str){
if(!_str){
return "";
}
let tempStr=_str;
let regexp1=/#/g;
let regexp2=/&/g;
tempStr=tempStr.replace(regexp1,'},{"w":');
tempStr=tempStr.replace(regexp2,',"h":');
let dataArr=[];
try {
dataArr=JSON.parse(tempStr);
}catch (err){
}
return dataArr;
}
}
export default EngineUtils;
\ No newline at end of file
... ...
... ... @@ -570,8 +570,8 @@ class RecordPlayBackParse extends Emiter {
for (let i = 0; i < messageItem.length; i++) {
this._everSocketMsgReceivedHandler(messageItem[i].byteData, 0);
counter++;
if(counter>100){
loger.warn("SEEK->最多处理历史消息100条");
if(counter>40){
loger.warn("SEEK->最多处理历史消息40条");
return;
}
}
... ...
... ... @@ -286,13 +286,12 @@ class VideoApe extends Ape {
}
//释放nodeId占用的所有频道
_releaseNodeIdAllChannel(nodeId){
loger.log(nodeId,"_releaseNodeIdAllChannel",this.mcu.connected);
if(!this.mcu.connected){
clearTimeout(this.releaseTimeId);
loger.warn(GlobalConfig.getCurrentStatus());
return {"code": ApeConsts.RETURN_FAILED, "data": "已经断开连接"};
}
loger.log("释放nodeId占用的所有频道->",nodeId);
let openingChannelInfo = this.mediaModule.getOpeningMediaChannelForNodeId(nodeId);
if (openingChannelInfo.channelId== 0) {
loger.warn(nodeId,"没有占用channel不需要处理");
... ... @@ -335,13 +334,13 @@ class VideoApe extends Ape {
return {"code": ApeConsts.RETURN_FAILED, "data": "sendVideoCommandMsg失败,参数错误"};
}
// to, message
loger.log('发送Video消息.', _param);
loger.log('视频模块广播消息.', _param);
if (_param.actionType != null && _param.actionType == ApeConsts.MEDIA_ACTION_OPEN_CAMERA) {
//判断当前开启的视频数量是否已经是最大值,如果已经是最大值,不能再开启
let freeChannel = this.mediaModule.getFreeMediaChannel();
if (freeChannel == 0) {
loger.warn('sendVideoCommandMsg,不能再打开更多的设备', _param);
loger.warn('视频模块广播消息->不能再打开更多的设备', _param);
return {"code": ApeConsts.RETURN_FAILED, "data": "不能再打开更多的设备","mediaChannels":this.mediaModule.mediaChannels};
}
}
... ...
... ... @@ -458,7 +458,10 @@ class WhiteBoardApe extends Ape {
whiteBoardModelPdu.parentId = GlobalConfig.activeDocId;//当前激活的文档id
whiteBoardModelPdu.curPageNo = GlobalConfig.activeDocCurPage;//当前激活的文档页码
whiteBoardModelPdu.pointGroup = EngineUtils.arrayToJsonString(_param.pointGroup);
let compressPointArr=EngineUtils.compressPoint(_param.pointGroup);//优化坐标点,去除一些连续重复的点
let pointGroupStr=EngineUtils.optimizePoint(compressPointArr);//数组转换为JSON字符串,压缩数据
//console.log("发送压缩后的标注->",pointGroupStr);
whiteBoardModelPdu.pointGroup = pointGroupStr||'';
whiteBoardModelPdu.color = _param.color || "#000000";
whiteBoardModelPdu.thickness = _param.thickness || 1;
... ... @@ -469,8 +472,9 @@ class WhiteBoardApe extends Ape {
try {
//loger.log("白板标注数据->unPackPdu");
let whiteBoardModelPdu = pdu['RCWhiteBoardDataModelPdu'].decode(itemData);
let _pointGroup = EngineUtils.arrayFromJsonString(whiteBoardModelPdu.pointGroup);
whiteBoardModelPdu.pointGroup = _pointGroup;
//let _pointGroup = EngineUtils.arrayFromJsonString(whiteBoardModelPdu.pointGroup);
let pointGroup=EngineUtils.unPackOptimizePoint(whiteBoardModelPdu.pointGroup);//还原压缩后的数据
whiteBoardModelPdu.pointGroup = pointGroup;
this.annoInfos[itemIdx] = whiteBoardModelPdu;
return whiteBoardModelPdu;
} catch (err) {
... ...