From 3abfe5f43985ca642466f8a5456fb4655db23e58 Mon Sep 17 00:00:00 2001 From: liyong <liyong@3mang.com> Date: Mon, 7 Aug 2017 08:46:39 +0800 Subject: [PATCH] 1.server数据不再从本地加载,直接获取从Sass返回的数据;2.增加日志上报;3.人员属性中增加噪音消除的字段和自动调整麦克风音量的字段 --- src/EngineEntrance.js | 382 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ src/EverSocket.js | 11 ++++++----- src/GlobalConfig.js | 4 +++- src/IpManager.js | 8 ++++++++ src/LogManager.js | 195 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/Loger.js | 65 ++++++++++++++++++++++++++++++++++++++--------------------------- src/RecordPlayBackParse.js | 2 +- src/apes/Ape.js | 16 ++++------------ src/apes/ConferApe.js | 23 +++++++++++------------ src/apes/CursorApe.js | 2 +- src/apes/DocApe.js | 23 +++++++++++++---------- src/apes/MediaSharedApe.js | 6 +++--- src/apes/MusicSharedApe.js | 6 +++--- src/apes/QuestionApe.js | 2 +- src/apes/ShareApe.js | 18 ++++++++++++------ src/apes/VideoApe.js | 4 +++- src/apes/WhiteBoardApe.js | 8 ++++---- src/mcu.js | 7 ++----- src/pdus/pro.js | 4 +++- 19 files changed, 441 insertions(+), 345 deletions(-) create mode 100644 src/LogManager.js diff --git a/src/EngineEntrance.js b/src/EngineEntrance.js index 9367b00..ccfbee2 100644 --- a/src/EngineEntrance.js +++ b/src/EngineEntrance.js @@ -33,6 +33,7 @@ import MediaSharedApe from 'apes/MediaSharedApe'; import MusicSharedApe from 'apes/MusicSharedApe'; import QuestionApe from 'apes/QuestionApe'; import UTF8 from 'utf-8'; +import LogManager from 'LogManager'; let loger = Loger.getLoger('McuClient'); @@ -57,8 +58,8 @@ export default class MessageEntrance extends Emiter { constructor() { super(); //sdk 信息 - GlobalConfig.sdkVersion="v1.63.1.20170731"; - loger.warn("sdkVersion:"+GlobalConfig.sdkVersion); + GlobalConfig.sdkVersion = "v1.65.24.20170806"; + loger.warn("sdkVersion:" + GlobalConfig.sdkVersion); //获取设备和系统信息 SystemConfig.getSystemInfo(); @@ -258,8 +259,14 @@ export default class MessageEntrance extends Emiter { this.switchServer = this._switchMcuIpHandler.bind(this); //切换mcu服务器 this.switchMediaServer = this._switchMediaServer.bind(this); //手动切换ms服务器 this.setDebugInfo = this._setDebugInfo.bind(this); //设置debug信息 + this.setOpenSendLogToServer = this._setOpenSendLogToServer.bind(this); //设置是否上报日志 + + this.addLog = this._addLog.bind(this); + this.addWarn = this._addWarn.bind(this); + this.addError = this._addError.bind(this); } + //设置是否输出日志 _setDebugInfo(_data) { loger.log("设置debug信息-->", _data); if (_data) { @@ -267,6 +274,37 @@ export default class MessageEntrance extends Emiter { } } + //设置是否上报日志 + _setOpenSendLogToServer(_data) { + loger.log("设置日志上报状态-->", _data); + if (_data) { + LogManager.IS_OPEN_SEND_LOG = _data.isOpen + } + } + + //--------------外部上传日志的接口------------------------ + //上传log日志 + _addLog(_data) { + if (_data) { + LogManager.addLog(LogManager.LOG, _data); + } + } + + //上传warn日志 + _addWarn(_data) { + if (_data) { + LogManager.addLog(LogManager.WARN, _data); + } + } + + //上传error日志 + _addError(_data) { + if (_data) { + LogManager.addLog(LogManager.ERROR, _data); + } + } + + //--------------外部上传日志的接口--END ---------------------- //设置设备信息 _setDeviceInfo(_data) { loger.log("设置设备信息-->", _data); @@ -276,6 +314,8 @@ export default class MessageEntrance extends Emiter { GlobalConfig.videoQuality = parseInt(_data.videoQuality); GlobalConfig.curVideoQuality = parseInt(_data.curVideoQuality); GlobalConfig.micGain = _data.micGain || 50; + GlobalConfig.micNoise = _data.micNoise || 50; + GlobalConfig.autoGain = _data.autoGain || false; GlobalConfig.speakerVolume = _data.speakerVolume || 50; GlobalConfig.micCode = _data.micCode || 0; GlobalConfig.curCamera = _data.curCamera || ''; @@ -301,18 +341,18 @@ export default class MessageEntrance extends Emiter { //mcu异常监听 _mcuErrorHandler(_data) { - let errorMessage={}; + let errorMessage = {}; //目前只有 userId和身份相同时被踢的时候有type值判断 - switch (_data.type){ + switch (_data.type) { case MessageTypes.ERR_CLASS_KICK_OUT: case MessageTypes.ERR_CLASS_REMOTE_LANDING: - if(_data){ - errorMessage = {"code": _data.type, "reson": MessageTypes.ErrorReson[_data.type],"data":_data.data}; + if (_data) { + errorMessage = {"code": _data.type, "reson": MessageTypes.ErrorReson[_data.type], "data": _data.data}; } break; default : - errorMessage = {"code": _data, "reson": MessageTypes.ErrorReson[_data],"data":{}}; + errorMessage = {"code": _data, "reson": MessageTypes.ErrorReson[_data], "data": {}}; break; } @@ -580,17 +620,21 @@ export default class MessageEntrance extends Emiter { //先加载本地Server.json文件,然后获取userIp新 _ipManager.loadServerJosn(function (_callbackData) { //本地Server.json加载后需要判断是否有数据,如果没有数据就用Sass的 - //_callbackData.data=ret; - //_callbackData.ret=1; - ServerConfig.localServerJson=_callbackData.data; - console.warn("本地SERVER数据",_callbackData); - if(!ServerConfig.localServerJson||!ServerConfig.localServerJson.MCU||!ServerConfig.localServerJson.MS){ - ServerConfig.serverList=ServerConfig.sassServerJson;//本地JSON数据加载完数据无效,使用Sass的 + if (_callbackData) { + ServerConfig.localServerJson = _callbackData.data; + console.warn("本地SERVER数据", _callbackData); + } else { + ServerConfig.localServerJson = {}; + } + + if (!ServerConfig.localServerJson || !ServerConfig.localServerJson.MCU || !ServerConfig.localServerJson.MS) { + ServerConfig.serverList = ServerConfig.sassServerJson;//本地JSON数据加载完数据无效,使用Sass的 loger.warn("使用从Sass获取的server"); - }else { - ServerConfig.serverList=ServerConfig.localServerJson; + } else { + ServerConfig.serverList = ServerConfig.localServerJson; loger.warn("使用从本地获取的server"); } + //通过userIp获取用户的信息 _ipManager.getUserIpInfo("", GlobalConfig.userIp, _this._getUserIpCallbackHandler.bind(_this), 2000); }) } @@ -618,7 +662,7 @@ export default class MessageEntrance extends Emiter { } //开始加入课堂前第一次测速 - _startFirstTestBestServer(){ + _startFirstTestBestServer() { //加入课堂之前开始第一次选点 let _this = this; //推流地址测速 @@ -749,9 +793,9 @@ export default class MessageEntrance extends Emiter { GlobalConfig.hlsPullListFinal = GlobalConfig.rsPullListFinal; } - if(!ServerConfig.localServerJson||!ServerConfig.localServerJson.MCU||!ServerConfig.localServerJson.MS){ + if (!ServerConfig.localServerJson || !ServerConfig.localServerJson.MCU || !ServerConfig.localServerJson.MS) { loger.warn("课堂最终使用的服务列表->来自Sass"); - }else { + } else { loger.warn("课堂最终使用的服务列表->来自本地Server.json"); } @@ -761,6 +805,7 @@ export default class MessageEntrance extends Emiter { loger.warn("hlsListFinal", GlobalConfig.hlsPullListFinal); loger.warn("rsListFinal", GlobalConfig.rsPullListFinal); } + //从Sass中选择的mcu、ms列表 _choiceMcuAndMsListFromSass() { //1.根据user信息获取服务器列表 @@ -781,7 +826,7 @@ export default class MessageEntrance extends Emiter { GlobalConfig.isp, ServerConfig.serverList); - GlobalConfig.rtmpPullListFinal= _ipManager.getServerListForUserInfo( + GlobalConfig.rtmpPullListFinal = _ipManager.getServerListForUserInfo( "RTMP_PULL", GlobalConfig.country, GlobalConfig.province, @@ -797,7 +842,7 @@ export default class MessageEntrance extends Emiter { GlobalConfig.isp, ServerConfig.serverList); - GlobalConfig.hlsPullListFinal= _ipManager.getServerListForUserInfo( + GlobalConfig.hlsPullListFinal = _ipManager.getServerListForUserInfo( "HLS_PULL", GlobalConfig.country, GlobalConfig.province, @@ -925,19 +970,19 @@ export default class MessageEntrance extends Emiter { loger.warn('HLS拉流地址->HLS->', GlobalConfig.MS_PLAY_HLS_IP, GlobalConfig.MS_PLAY_HLS_PORT); loger.warn('HLS录制回放拉流地址->HLS->', GlobalConfig.RS_RECORD_PLAY_IP, GlobalConfig.RS_RECORD_PLAY_PORT); - if(!GlobalConfig.MS_PUBLISH_IP){ + if (!GlobalConfig.MS_PUBLISH_IP) { loger.error("推流MS地址地址无效"); } - if(!GlobalConfig.MS_PLAY_RTMP_IP){ + if (!GlobalConfig.MS_PLAY_RTMP_IP) { loger.warn("RTMP拉流地址无效->使用推流地址作为RTMP拉流地址"); - GlobalConfig.MS_PLAY_RTMP_IP=GlobalConfig.MS_PUBLISH_IP; - GlobalConfig.MS_PLAY_RTMP_PORT=GlobalConfig.MS_PUBLISH_PORT + GlobalConfig.MS_PLAY_RTMP_IP = GlobalConfig.MS_PUBLISH_IP; + GlobalConfig.MS_PLAY_RTMP_PORT = GlobalConfig.MS_PUBLISH_PORT } - if(!GlobalConfig.MS_PLAY_HLS_IP){ + if (!GlobalConfig.MS_PLAY_HLS_IP) { loger.warn("HLS拉流地址无效->使用HLS回放地址作为HLS拉流地址"); - GlobalConfig.MS_PLAY_HLS_IP=GlobalConfig.MS_PLAY_HLS_PORT; - GlobalConfig.RS_RECORD_PLAY_IP=GlobalConfig.RS_RECORD_PLAY_PORT + GlobalConfig.MS_PLAY_HLS_IP = GlobalConfig.MS_PLAY_HLS_PORT; + GlobalConfig.RS_RECORD_PLAY_IP = GlobalConfig.RS_RECORD_PLAY_PORT } if (_mcu) { @@ -1023,6 +1068,14 @@ export default class MessageEntrance extends Emiter { joinClassSuccessCallBackData.explorerVersion = GlobalConfig.explorerVersion; joinClassSuccessCallBackData.os = GlobalConfig.os; + //设置日志上报所需的信息 + LogManager.serverAndLoacTimeDistanc = GlobalConfig.serverAndLoacTimeDistanc;//本地时间和服务器时间的差值(秒) + LogManager.classId = GlobalConfig.classId;//课堂号 + LogManager.userId = GlobalConfig.userId;//userId + LogManager.nodeId = GlobalConfig.nodeId;//nodeId + LogManager.userName = GlobalConfig.userName;//用户名称 + LogManager.logUrl = GlobalConfig.logUrl;//日志服务器地址 //http://log.3mang.com:8888 + loger.log('加入课堂成功->'); loger.log(joinClassSuccessCallBackData); @@ -1141,7 +1194,7 @@ export default class MessageEntrance extends Emiter { loger.warn('录制回放->不进行MS-PULL动态选点'); return; } - if(!GlobalConfig.rtmpPullListFinal||GlobalConfig.rtmpPullListFinal.length<1){ + if (!GlobalConfig.rtmpPullListFinal || GlobalConfig.rtmpPullListFinal.length < 1) { return; } let _this = this; @@ -1151,15 +1204,15 @@ export default class MessageEntrance extends Emiter { GlobalConfig.MS_PLAY_RTMP_IP = _data.ip || ""; GlobalConfig.MS_PLAY_RTMP_PORT = _data.port || ""; } else { - //随机选择一个 - if (GlobalConfig.rtmpPullListFinal && GlobalConfig.rtmpPullListFinal.length > 0) { - let index = parseInt(Math.random() * GlobalConfig.rtmpPullListFinal.length); - GlobalConfig.MS_PLAY_RTMP_IP = GlobalConfig.rtmpPullListFinal[index].ip || ""; - GlobalConfig.MS_PLAY_RTMP_PORT = GlobalConfig.rtmpPullListFinal[index].port || ""; - } + //随机选择一个 + if (GlobalConfig.rtmpPullListFinal && GlobalConfig.rtmpPullListFinal.length > 0) { + let index = parseInt(Math.random() * GlobalConfig.rtmpPullListFinal.length); + GlobalConfig.MS_PLAY_RTMP_IP = GlobalConfig.rtmpPullListFinal[index].ip || ""; + GlobalConfig.MS_PLAY_RTMP_PORT = GlobalConfig.rtmpPullListFinal[index].port || ""; + } } //如果RTMP没有配置地址,那么还是使用推流的地址 - if(!GlobalConfig.MS_PLAY_RTMP_IP){ + if (!GlobalConfig.MS_PLAY_RTMP_IP) { GlobalConfig.MS_PLAY_RTMP_IP = GlobalConfig.MS_PUBLISH_IP; GlobalConfig.MS_PLAY_RTMP_PORT = GlobalConfig.MS_PUBLISH_PORT; } @@ -1173,7 +1226,7 @@ export default class MessageEntrance extends Emiter { loger.warn('录制回放->不进行MS-HLS动态选点'); return; } - if(!GlobalConfig.hlsPullListFinal||GlobalConfig.hlsPullListFinal.length<1){ + if (!GlobalConfig.hlsPullListFinal || GlobalConfig.hlsPullListFinal.length < 1) { return; } let _this = this; @@ -1184,14 +1237,14 @@ export default class MessageEntrance extends Emiter { GlobalConfig.MS_PLAY_HLS_PORT = _data.port || ""; } else { //随机选择一个 - if (GlobalConfig.hlsPullListFinal && GlobalConfig.hlsPullListFinal.length > 0) { - let index = parseInt(Math.random() * GlobalConfig.hlsPullListFinal.length); - GlobalConfig.MS_PLAY_HLS_IP = GlobalConfig.hlsPullListFinal[index].ip || ""; - GlobalConfig.MS_PLAY_HLS_PORT = GlobalConfig.hlsPullListFinal[index].port || ""; - } + if (GlobalConfig.hlsPullListFinal && GlobalConfig.hlsPullListFinal.length > 0) { + let index = parseInt(Math.random() * GlobalConfig.hlsPullListFinal.length); + GlobalConfig.MS_PLAY_HLS_IP = GlobalConfig.hlsPullListFinal[index].ip || ""; + GlobalConfig.MS_PLAY_HLS_PORT = GlobalConfig.hlsPullListFinal[index].port || ""; + } } //如果HLS没有配置地址,那么还是使用推流的地址 - if(!GlobalConfig.MS_PLAY_HLS_IP){ + if (!GlobalConfig.MS_PLAY_HLS_IP) { GlobalConfig.MS_PLAY_HLS_IP = GlobalConfig.RS_RECORD_PLAY_IP; GlobalConfig.MS_PLAY_HLS_PORT = GlobalConfig.RS_RECORD_PLAY_PORT; } @@ -1406,6 +1459,7 @@ export default class MessageEntrance extends Emiter { callBack.type = 0; } loger.warn('离开课堂->', MessageTypes.CLASS_EXIT, callBack); + LogManager.sendLogToServer(); this._emit(MessageTypes.CLASS_EXIT, callBack); //断开MCU连接 @@ -1430,6 +1484,7 @@ export default class MessageEntrance extends Emiter { GlobalConfig.maxAudioChannels = _data.maxAudioChannels; GlobalConfig.maxMediaChannels = Math.max(GlobalConfig.maxVideoChannels, GlobalConfig.maxAudioChannels); + loger.warn("当前课堂允许最大推流数量-" + GlobalConfig.maxMediaChannels + " 视频频:" + GlobalConfig.maxVideoChannels + " 音频:" + GlobalConfig.maxAudioChannels); GlobalConfig.ssTunnelAppURL = _data.ssTunnelAppURL || ''; //屏幕共享插件的地址 //视频质量相关设置,每次加入课堂都按最新的获取设置 @@ -1440,7 +1495,7 @@ export default class MessageEntrance extends Emiter { //是否自动开始(身份是host的时候才用到的) GlobalConfig.isAutoStartClass = _data.autoRecord || 0; - GlobalConfig.logUrl=_data.logUrl||""; + GlobalConfig.logUrl = _data.logUrl || ""; GlobalConfig.serverTime = _data.serverTime || new Date().getTime(); //获取服务器时间戳 GlobalConfig.serverAndLoacTimeDistanc = (new Date().getTime() - GlobalConfig.serverTime) / 1000; //当前系统时间和服务器时间的差值 (秒) loger.warn("服务器时间:" + GlobalConfig.serverTime + " 系统时间:" + new Date().getTime() + " 时间差:" + GlobalConfig.serverAndLoacTimeDistanc); @@ -1473,37 +1528,37 @@ export default class MessageEntrance extends Emiter { //存从Sass获取的MS和MCU服务列表 - let serverJsonStr=_data.serverJson; - try{ - ServerConfig.sassServerJson=JSON.parse(serverJsonStr);///Sass返回的Server数据 - }catch (err){ - loger.error("从SASS获取的SERVER数据解析失败",err.message); + let serverJsonStr = _data.serverJson; + try { + ServerConfig.sassServerJson = JSON.parse(serverJsonStr);///Sass返回的Server数据 + } catch (err) { + loger.error("从SASS获取的SERVER数据解析失败", err.message); } /* - if (_data.msList2) { - GlobalConfig.setMsList(_data.msList2.msList); //储存Sass ms拉流地址 - GlobalConfig.setRtmpPullList(_data.msList2.rtmpPullArray); //储存Sass ms拉流地址 - GlobalConfig.setHlsPullList(_data.msList2.hlsPullArray); //储存Sass ms拉流地址 - GlobalConfig.setRsList(_data.msList2.rsList); //储存Sass 录制回放hls拉流地址 - } - //Sass mcu - GlobalConfig.setMcuList(_data.mcuList); //mcu - - - loger.warn('从Sass获取的推流拉流列表数据:'); - loger.warn('Sass->msList->', GlobalConfig.msList); - loger.warn('Sass->rtmpPullList->', GlobalConfig.rtmpPullList); - loger.warn('Sass->hlsPullList->', GlobalConfig.hlsPullList); - loger.warn('Sass->rsList->', GlobalConfig.rsList); - - //没有加载server.json之前,最终的服务列表按Sass的为准,server.json加载完成后会选点 - GlobalConfig.msListFinal=GlobalConfig.msList; - GlobalConfig.rtmpPullListFinal=GlobalConfig.rtmpPullList; - GlobalConfig.hlsListFinal=GlobalConfig.hlsPullList; - GlobalConfig.rsListFinal=GlobalConfig.rsList; - GlobalConfig.mcuListFinal=GlobalConfig.mcuList;*/ - } + if (_data.msList2) { + GlobalConfig.setMsList(_data.msList2.msList); //储存Sass ms拉流地址 + GlobalConfig.setRtmpPullList(_data.msList2.rtmpPullArray); //储存Sass ms拉流地址 + GlobalConfig.setHlsPullList(_data.msList2.hlsPullArray); //储存Sass ms拉流地址 + GlobalConfig.setRsList(_data.msList2.rsList); //储存Sass 录制回放hls拉流地址 + } + //Sass mcu + GlobalConfig.setMcuList(_data.mcuList); //mcu + + + loger.warn('从Sass获取的推流拉流列表数据:'); + loger.warn('Sass->msList->', GlobalConfig.msList); + loger.warn('Sass->rtmpPullList->', GlobalConfig.rtmpPullList); + loger.warn('Sass->hlsPullList->', GlobalConfig.hlsPullList); + loger.warn('Sass->rsList->', GlobalConfig.rsList); + + //没有加载server.json之前,最终的服务列表按Sass的为准,server.json加载完成后会选点 + GlobalConfig.msListFinal=GlobalConfig.msList; + GlobalConfig.rtmpPullListFinal=GlobalConfig.rtmpPullList; + GlobalConfig.hlsListFinal=GlobalConfig.hlsPullList; + GlobalConfig.rsListFinal=GlobalConfig.rsList; + GlobalConfig.mcuListFinal=GlobalConfig.mcuList;*/ + } //课堂获取Sass数据完成 this._emit(MessageTypes.CLASS_GET_INFO_SUCCESS, GlobalConfig.getClassInfo()); @@ -1530,7 +1585,7 @@ export default class MessageEntrance extends Emiter { //开启录制回放流程 loger.warn("开启录制回放流程"); //根据用户的userIp信息从sever.json和Sass中选择最终mcu和推流拉流数据列表 - ServerConfig.serverList=ServerConfig.sassServerJson; + ServerConfig.serverList = ServerConfig.sassServerJson; this._choiceMcuAndMsListFromSass(); //获取MCU和MS 推流拉流、录制回放的默认地址 this.getMcuAndMsDefaultServerIp(); @@ -1603,184 +1658,6 @@ export default class MessageEntrance extends Emiter { } - //获取课堂所有参数 api/meeting/detail.do? flash中的接口文件是 getClassParam.do(20170727之前的规则) - /*_sassGetClassParamSuccessHandler(_data) { - loger.log('获取课堂课堂信息完成.'); - //包含整个课堂最全的信息,储存数据 - if (_data) { - GlobalConfig.mcuDelay = _data.h5Delay || 0; //mcu消息延迟的时间间隔,单位(秒),结合客户端传的messageDelay的值使用 - GlobalConfig.className = _data.meetingName || ""; - GlobalConfig.classBeginTime = _data.beginTime || ""; - GlobalConfig.classEndTime = _data.endTime || ""; - GlobalConfig.userIp = _data.userIp || ""; - - GlobalConfig.maxVideoChannels = _data.maxVideoChannels; - GlobalConfig.maxAudioChannels = _data.maxAudioChannels; - GlobalConfig.maxMediaChannels = Math.max(GlobalConfig.maxVideoChannels, GlobalConfig.maxAudioChannels); - - GlobalConfig.ssTunnelAppURL = _data.ssTunnelAppURL || ''; //屏幕共享插件的地址 - - //视频质量相关设置,每次加入课堂都按最新的获取设置 - GlobalConfig.fps = _data.fps || 15; - GlobalConfig.gop = _data.gop || 3; - GlobalConfig.videoQuality = parseInt(_data.videoQuality); - GlobalConfig.curVideoQuality = GlobalConfig.videoQuality; - - //是否自动开始(身份是host的时候才用到的) - GlobalConfig.isAutoStartClass = _data.autoRecord || 0; - - GlobalConfig.serverTime = _data.serverTime || new Date().getTime(); //获取服务器时间戳 - GlobalConfig.serverAndLoacTimeDistanc = (new Date().getTime() - GlobalConfig.serverTime) / 1000; //当前系统时间和服务器时间的差值 (秒) - loger.warn("服务器时间:" + GlobalConfig.serverTime + " 系统时间:" + new Date().getTime() + " 时间差:" + GlobalConfig.serverAndLoacTimeDistanc); - - GlobalConfig.setDocListPrepare(_data.docListPrepare); //提前上传的文档列表 - GlobalConfig.setRecordList(_data.recordList); //录制回放地址 - GlobalConfig.setDocList(_data.docList); //文档地址 - GlobalConfig.setMsList(_data.msList); //推流播流服务器地址(需要对列表中的地址进行分类,里面包含了推流和拉流的地址,目前主要是乐视的需要区分开) - GlobalConfig.setRsList(_data.rsList); //播放m3u8格式的地址(录制回放时使用) - GlobalConfig.setMcuList(_data.mcuList); //mcu - GlobalConfig.setMusicList(_data.musicList); // - GlobalConfig.setMusicListPrepare(_data.musicListPrepare); //提前上传的声音文件列表 - GlobalConfig.setVideoCDNAddr(_data.videoCDNAddr); //cdn加速的拉流地址,直播的时候才使用 - GlobalConfig.setMediaShareList(_data.sharedMediaList); //提前上传的媒体共享文件列表 - - //MCU地址 - if (_data.mcuList && _data.mcuList.length > 0) { - //随机选择一个 - let index = parseInt(Math.random() * _data.mcuList.length); - GlobalConfig.MCUServerIP = _data.mcuList[index].ip || ""; - GlobalConfig.MCUServerPort = _data.mcuList[index].port || ""; - loger.log('初始->MCU->.', GlobalConfig.MCUServerIP, GlobalConfig.MCUServerPort); - } - - //录制回放时m3u8播流地址 - if (_data.rsList && _data.rsList.length > 0) { - let index = parseInt(Math.random() * _data.rsList.length); - GlobalConfig.RS_RECORD_PLAY_IP = _data.rsList[index].ip || ""; - GlobalConfig.RS_RECORD_PLAY_PORT = _data.rsList[index].port || ""; - loger.log('初始->RS->.', GlobalConfig.RS_RECORD_PLAY_IP, GlobalConfig.RS_RECORD_PLAY_PORT); - } - - //上课中音视频推流地址 - if (GlobalConfig.msList && GlobalConfig.msList.length > 0) { - let index = parseInt(Math.random() * GlobalConfig.msList.length); - GlobalConfig.MS_PUBLISH_IP = GlobalConfig.msList[index].ip || ""; - GlobalConfig.MS_PUBLISH_PORT = GlobalConfig.msList[index].port || ""; - } - loger.log('初始->MS->.', GlobalConfig.MS_PUBLISH_IP, GlobalConfig.MS_PUBLISH_PORT); - - //播流的地址和推流地址需要分开的时候,单独设置拉流的地址 rtmp(目前乐视使用) - if (GlobalConfig.rtmpPullList && GlobalConfig.rtmpPullList.length > 0) { - //有单独的rtmp拉流地址 - let index = parseInt(Math.random() * GlobalConfig.rtmpPullList.length); - GlobalConfig.MS_PLAY_RTMP_IP = GlobalConfig.rtmpPullList[index].ip || ""; - GlobalConfig.MS_PLAY_RTMP_PORT = GlobalConfig.rtmpPullList[index].port || ""; - } else { - //如果没有单独的rtmp拉流地址,和推流地址一样即可 - GlobalConfig.MS_PLAY_RTMP_IP = GlobalConfig.MS_PUBLISH_IP; - GlobalConfig.MS_PLAY_RTMP_PORT = GlobalConfig.MS_PUBLISH_PORT; - } - - loger.log('初始->MSPull->.', GlobalConfig.MS_PLAY_RTMP_IP, GlobalConfig.MS_PLAY_RTMP_PORT); - - //播流的地址和推流地址需要分开的时候,单独设置拉流的地址 hls(目前乐视使用) - if (GlobalConfig.hlsList && GlobalConfig.hlsList.length > 0) { - //有单独的hls拉流地址 - let index = parseInt(Math.random() * GlobalConfig.hlsList.length); - GlobalConfig.MS_PLAY_HLS_IP = GlobalConfig.hlsList[index].ip || ""; - GlobalConfig.MS_PLAY_HLS_PORT = GlobalConfig.hlsList[index].port || ""; - } else { - //没有单独的hls拉流地址,和录制回放地址一样即可 - GlobalConfig.MS_PLAY_HLS_IP = GlobalConfig.RS_RECORD_PLAY_IP; - GlobalConfig.MS_PLAY_HLS_PORT = GlobalConfig.RS_RECORD_PLAY_PORT; - } - loger.log('初始->MSHls->.', GlobalConfig.MS_PLAY_HLS_IP, GlobalConfig.MS_PLAY_HLS_PORT); - - //直播的时候,拉流(rtmp和hls)需要从 videoCDNAddr中获取 - //20170531-新规则,所有课堂类型都支持加速 - // if(GlobalConfig.classType==ApeConsts.CLASS_TYPE_2&&GlobalConfig.videoCDNAddrList.length>0){ - - //20170629-直播课堂和移动端设备的时候支持 - if (GlobalConfig.classType == ApeConsts.CLASS_TYPE_2 || GlobalConfig.isMobile) { - if (GlobalConfig.videoCDNAddrList.length > 0) { - //videoCDNAddrList中rtmppush和hls是混在一起的,需要分离开; - let listLen = GlobalConfig.videoCDNAddrList.length; - for (let i = 0; i < listLen; i++) { - let ipItem = GlobalConfig.videoCDNAddrList[i]; - if (ipItem) { - if (ipItem.indexOf('hls') >= 0) { - //直播的时候m3u8拉流地址 - GlobalConfig.MS_PLAY_HLS_IP = ipItem; //ip包含了端口 - GlobalConfig.MS_PLAY_HLS_PORT = ""; - loger.log('videoCDNAddr>初始->MSHls', GlobalConfig.MS_PLAY_HLS_IP); - } - if (ipItem.indexOf('rtmppull')>= 0) { - //直播的时候rtmp拉流地址 - GlobalConfig.MS_PLAY_RTMP_IP = ipItem; //ip包含了端口 - GlobalConfig.MS_PLAY_RTMP_PORT = ''; - loger.log('videoCDNAddr->初始->MSPull', GlobalConfig.MS_PLAY_RTMP_IP); - } - } - } - } else { - loger.error('videoCDNAddr数据无效->', GlobalConfig.videoCDNAddr); - } - } else { - loger.warn('非直播课堂或不是移动端->不需要videoCDN加速'); - } - - //文档地址 - if (_data.docList && _data.docList.length > 0) { - //doc上传地址,随机获取一个 - let index = parseInt(Math.random() * _data.docList.length); - loger.log("docServer->", _data.docList[index]); - GlobalConfig.DOCServerIP = _data.docList[index].ip || ""; - GlobalConfig.DOCServerPort = _data.docList[index].port || ""; - loger.log('初始->DOC->.', GlobalConfig.DOCServerIP, GlobalConfig.DOCServerPort); - } - - //record - if (_data.recordList && _data.recordList.length > 0) { - let index = parseInt(Math.random() * _data.recordList.length); - GlobalConfig.RecordServerIP = _data.recordList[index].ip || ""; - GlobalConfig.RecordServerPort = _data.recordList[index].port || ""; - loger.log('初始->RECORD->.', GlobalConfig.RecordServerIP, GlobalConfig.RecordServerPort); - } - - } - //这里需要考虑是否加延迟处理,课堂信息刚获取完成,客户端需要根据数据创建界面UI,等创建完成后再加入课堂是最合适的(目前没有加延迟) - this._emit(MessageTypes.CLASS_GET_INFO_SUCCESS, GlobalConfig.getClassInfo()); - - if (_data.currentInfo) { - //根据从Sass获取的数据信息,同步最后一次保存的课堂状态信息 - loger.log("本地同步最后一次保存过的课堂状态信息"); - try { - GlobalConfig.setClassStatusInfo(JSON.parse(_data.currentInfo)); - } catch (err) { - loger.warn("从Sass获取的课堂数据JSON转换失败->"); - console.log("currentInfo", _data.currentInfo); - GlobalConfig.setClassStatusInfo(_data.currentInfo); - } - loger.log(GlobalConfig.classStatusInfo); - } else { - loger.log("还没有保存过课堂状信息"); - } - - //录制回放不需要获取ip信息和选点 - if (GlobalConfig.isRecordPlayBack) { - if (_recordPlayback) { - //开启录制回放流程 - loger.log("开启录制回放流程"); - _recordPlayback.readyRecordPlay(); - } else { - loger.warn("开启录制回放流程失败->还未创建模块"); - } - } else { - //根据用户的userIp获取信息,选点 - this.getUserIpInfo(); - } - }*/ - //ChatApe // 发送聊天消息 _sendChatMsg(_messageInfo) { @@ -2330,7 +2207,7 @@ export default class MessageEntrance extends Emiter { "fileId": "" + value.id, "fileName": value.name, "seek": 0, - "duration":parseInt(value.duration)||0 + "duration": parseInt(value.duration) || 0 }; this._sendMusicSharedUpload(paramInfo); } @@ -2356,7 +2233,7 @@ export default class MessageEntrance extends Emiter { "fileId": "" + value.id, "fileName": value.name, "seek": 0, - "duration":parseInt(value.duration)||0 + "duration": parseInt(value.duration) || 0 }; this._sendMediaSharedUpload(paramInfo); } @@ -2440,6 +2317,7 @@ export default class MessageEntrance extends Emiter { //录制回放加入 课堂成功 _joinRecordPlaybackSuccessHandler(_data) { loger.log('加入录制回放成功.'); + LogManager.IS_OPEN_SEND_LOG=false;//录制回放不需要上报日志 GlobalConfig.setCurrentStatus(GlobalConfig.statusCode_2); //返回给客户端初始化成功的数据 diff --git a/src/EverSocket.js b/src/EverSocket.js index 81408f1..2f4d156 100644 --- a/src/EverSocket.js +++ b/src/EverSocket.js @@ -29,6 +29,9 @@ class EverSocket extends Emiter { begin(ip, port) { this._clearHistory(); loger.log('开始WebSocket应用.'); + if(!ip){ + loger.error('开始MCU连接->MCU连接地址无效'); + } this._enableEverSocket = true; this.wsURL = 'ws://' + ip + ':' + port; this._newConnection(); @@ -51,10 +54,8 @@ class EverSocket extends Emiter { send(data) { if (this._connected) { - if (data) { - loger.log('SEND MESSAGE-->byteLength->', data.byteLength); - } else { - loger.log('SEND MESSAGE---->'); + if (data&& data.byteLength>1024) { + loger.warn('发送到MCU的数据文件超过1k-->byteLength->', data.byteLength); } this.websocket.send(data); } else { @@ -168,7 +169,7 @@ class EverSocket extends Emiter { _onMessage(messageEvent) { this._lastActiveTime = Date.now(); const bufferData = messageEvent.data; - loger.log('RECEIVE MESSAGE-->byteLength->',bufferData.byteLength); + //loger.log('RECEIVE MESSAGE-->byteLength->',bufferData.byteLength); if (bufferData.byteLength > 0) { this._emit(EverSocket.MESSAGE, bufferData); } diff --git a/src/GlobalConfig.js b/src/GlobalConfig.js index 90afd13..4a959f4 100644 --- a/src/GlobalConfig.js +++ b/src/GlobalConfig.js @@ -452,7 +452,9 @@ GlobalConfig.microphones = []; //麦克风列表 GlobalConfig.curCamera = ""; //当前选择的摄像头 GlobalConfig.curMicrophone = ''; //当前选择的麦克风 -GlobalConfig.micGain = 50; //音量(0-80) +GlobalConfig.micGain = 50; //音量(0-100) +GlobalConfig.micNoise = 50; //(0-100) +GlobalConfig.autoGain = false; //自动调节麦克风音量 GlobalConfig.speakerVolume = 50; //扬声器音量(0-80) GlobalConfig.micCode = 0; //麦克风模式 diff --git a/src/IpManager.js b/src/IpManager.js index 6c2cd79..df11b3c 100644 --- a/src/IpManager.js +++ b/src/IpManager.js @@ -24,6 +24,14 @@ class IpManager extends Emiter { } //获取本地Server JSON loadServerJosn(_callback){ + //20170803-不再加载本地的server.json数据,以后都从Sass获取 + if (_callback) { + _callback(serverInfo); + return; + } + return; + + //-------------加载本地数据的代码------------------- let serverInfo = { ret: -1 }; diff --git a/src/LogManager.js b/src/LogManager.js new file mode 100644 index 0000000..9499c30 --- /dev/null +++ b/src/LogManager.js @@ -0,0 +1,195 @@ +/** + * + * LOG 信息管理(上传和输出) + * */ + +class LogManager { + constructor() { + + } + + /* + * 添加需要上报的日志信息到队列中 + * _type + * _msg + * */ + static addLog(_type, _msg) { + //无效的数据不上报 + if (!_msg) { + return; + } + + if (this.IS_OPEN_SEND_LOG == true || this.IS_OPEN_SEND_LOG == "true") { + //显示格式20170729 16:42:00 INFO _msg + let sendMsgStr = ""; + switch (_type) { + case this.ERROR: + sendMsgStr = this.getCurrentDateTime() + " ERROR " + _msg; + //this.errorList.push(sendMsgStr); + break; + case this.WARN: + sendMsgStr = this.getCurrentDateTime() + " WARN " + _msg; + //this.warnList.push(sendMsgStr); + break; + case this.LOG: + sendMsgStr = this.getCurrentDateTime() + " INFO " + _msg; + // this.logList.push(sendMsgStr); + break; + default: + sendMsgStr = this.getCurrentDateTime() + " INFO " + _msg; + // this.logList.push(sendMsgStr); + break; + } + + this.allLogList.push(sendMsgStr); + let _this = this; + clearTimeout(this.logDelayTimer); + this.logDelayTimer = setTimeout(function () { + _this.checkAndSendLog(); + }, 1600); + } + } + + static checkAndSendLog() { + //发送日志 + /*this.sendLogToServer(LogManager.ERROR); + this.sendLogToServer(LogManager.WARN); + this.sendLogToServer(LogManager.LOG);*/ + //不区分日志类型,按时间先后顺序发送 + this.sendLogToServer(-1); + } + + //发送log到服务器 + static sendLogToServer(_msgType) { + if (!this.logUrl) { + console.warn("日志服务器地址无效->无法上传日志"); + return; + } + const msgType = _msgType; + let msgData = ""; + let tempArr = []; + let msgLen = 0; + + /* switch (msgType) { + case LogManager.ERROR: + msgLen = this.errorList.length; + for (let i = 0; i < msgLen; i++) { + let item = this.errorList.shift(); + if (item) { + tempArr.push(item); + msgData += item + " \n "; + } + } + break; + case LogManager.WARN: + msgLen = this.warnList.length; + for (let i = 0; i < msgLen; i++) { + let item = this.warnList.shift(); + if (item) { + tempArr.push(item); + msgData += item + " \n "; + } + } + break; + case LogManager.LOG: + msgLen = this.logList.length; + for (let i = 0; i < msgLen; i++) { + let item = this.logList.shift(); + if (item) { + tempArr.push(item); + msgData += item + " \n "; + } + } + break; + default: + msgLen = this.allLogList.length; + for (let i = 0; i < msgLen; i++) { + let item = this.allLogList.shift(); + if (item) { + tempArr.push(item); + msgData += item + " \n "; + } + } + break; + } + */ + msgLen = this.allLogList.length; + for (let i = 0; i < msgLen; i++) { + let item = this.allLogList.shift(); + if (item) { + tempArr.push(item); + msgData += item + " \n "; + } + } + + if (tempArr.length < 1 || !msgData) { + //console.log("没有数据->不需要上报"); + return; + } + //console.log("上报的日志->", tempArr, msgData); + //需要过滤掉&字符,否则Sass无法取数据 + msgData=msgData.replace(/&/g,"#"); + fetch(encodeURI(this.logUrl), { + method: 'POST', + headers: { + "Content-Type": "application/x-www-form-urlencoded; charset=utf-8" + }, + body: `classId=${this.classId}&userId=${this.userId}&nodeId=${this.nodeId}&type=${msgType}&data=${msgData}`, + timeout: 3000 + }) + .then(ret => { + if (ret.ok) { + return ret.json(); + } else { + console.error(`保存日志信息-网络异常.状态码:${ret.status}`); + throw ''; + } + }) + .then(ret => { + if (ret == 0) { + console.log('保存日志信息 完成'); + tempArr=[]; + } else { + console.warn('保存日志信息 失败.', ret); + this.allLogList=tempArr.concat(this.allLogList); + tempArr=[]; + } + }) + .catch(err => { + console.error(`保存日志信息.状态码:${err}`); + this.allLogList=tempArr.concat(this.allLogList); + tempArr=[] + }); + } + + //计算当前服务器时间 + static getCurrentDateTime() { + let currentServerTime = new Date().getTime() - this.serverAndLoacTimeDistanc * 1000;//计算当前服务器时间 + let timeStr = new Date(currentServerTime).toLocaleString(); + if (timeStr) { + timeStr = timeStr.replace(/年|月/g, "-").replace(/日/g, " "); + } + return timeStr; + } +} +LogManager.allLogList = [];//所有需要上报的日志列表 +LogManager.logList = [];//日志上报列表 +LogManager.warnList = [];//警告日志上报列表 +LogManager.errorList = [];//错误日志上报列表 + +LogManager.serverAndLoacTimeDistanc = 0;//本地时间和服务器时间的差值(秒) +LogManager.classId = 0;//课堂号 +LogManager.userId = "";//userId +LogManager.nodeId = 0;//nodeId +LogManager.userName = "";//用户名称 +LogManager.logUrl = "";//日志服务器地址 //http://log.3mang.com:8888 + +LogManager.ERROR = 1; +LogManager.WARN = 2; +LogManager.LOG = 3; + +LogManager.DATA = 5; +LogManager.logDelayTimer = 0; +LogManager.IS_OPEN_SEND_LOG = true;//是否上报日志 +export default LogManager; + diff --git a/src/Loger.js b/src/Loger.js index a08cb83..e4707f3 100644 --- a/src/Loger.js +++ b/src/Loger.js @@ -13,6 +13,8 @@ // // ////////////////////////////////////////////////////////////////////////////// +import LogManager from "./LogManager"; + class Loger { constructor(info) { this.sdkInfo = info || ''; @@ -20,8 +22,8 @@ class Loger { } initId() { - if(!this.sdkInfo){ - console.log("this.sdkInfo无效-->",this.sdkInfo); + if (!this.sdkInfo) { + console.log("this.sdkInfo无效-->", this.sdkInfo); return ''; } const infoType = Object.prototype.toString.call(this.sdkInfo); @@ -32,15 +34,6 @@ class Loger { return this.sdkInfo.mid || ''; } return ''; - - /* const infoType = this.sdkInfo.constructor.name.toLowerCase(); - if (infoType === 'string') { - return this.sdkInfo; - } - if (infoType === 'object') { - return this.sdkInfo.mid || ''; - } - return '';*/ } log(...msg) { @@ -54,40 +47,57 @@ class Loger { error(...msg) { this._log(Loger.ERROR, msg); } + data(...msg) { this._log(Loger.DATA, msg); } + _log(type, msg) { - if(!Loger.IS_DEBUG){ - return; - } msg = JSON.stringify(msg); let logMsg = `${this.id} -> ${msg}`; - if (type >= Loger.logLevel) { - switch (type) { + switch (type) { case Loger.LOG: - console.log(logMsg); + Loger.LogManager.addLog(Loger.LOG, logMsg); + //如果是debug模式就输出 + if (Loger.IS_DEBUG) { + console.log(logMsg); + } break; case Loger.WARN: - console.warn(logMsg); + Loger.LogManager.addLog(Loger.WARN, logMsg); + //如果是debug模式就输出 + if (Loger.IS_DEBUG) { + console.warn(logMsg); + } break; case Loger.ERROR: - console.error(logMsg); + Loger.LogManager.addLog(Loger.ERROR, logMsg); + //如果是debug模式就输出 + if (Loger.IS_DEBUG) { + console.error(logMsg); + } break; case Loger.DATA: + //如果是debug模式就输出 + if (Loger.IS_DEBUG) { console.log(logMsg); - break; - } + } + break; + default : + break; } } } -Loger.IS_DEBUG=true; -Loger.LOG = 0; -Loger.WARN = 1; -Loger.ERROR = 2; + +Loger.IS_DEBUG = true; +Loger.LOG = 3; +Loger.WARN = 2; +Loger.ERROR = 1; Loger.NO = Infinity; -Loger.logLevel = Loger.LOG; +Loger.logLevel = 0; Loger.DATA = 5; +Loger.LogManager = LogManager; + export default { getLoger: function getLoger(info) { return new Loger(info); @@ -103,6 +113,7 @@ export default { ERROR: Loger.ERROR, NO: Loger.NO, DATA: Loger.DATA, - IS_DEBUG:Loger.IS_DEBUG, + IS_DEBUG: Loger.IS_DEBUG, + LogManager: LogManager }; diff --git a/src/RecordPlayBackParse.js b/src/RecordPlayBackParse.js index 2b30a1d..0029609 100644 --- a/src/RecordPlayBackParse.js +++ b/src/RecordPlayBackParse.js @@ -221,7 +221,7 @@ class RecordPlayBackParse extends Emiter { _timerCounterUptate() { this._recordPlaybackTimestamp = this._recordPlaybackTimestamp + 1;//计时 - loger.log("录制回放中...", this._recordPlaybackTimestamp); + //loger.log("录制回放中...", this._recordPlaybackTimestamp); this._emit(MessageTypes.CLASS_UPDATE_TIMER, {"classTimestamp": this._recordPlaybackTimestamp}); if (this._recordPlaybackTimestamp >= this._recordPlaybackMaxTime) { diff --git a/src/apes/Ape.js b/src/apes/Ape.js index 79b1db6..d60598d 100644 --- a/src/apes/Ape.js +++ b/src/apes/Ape.js @@ -118,11 +118,11 @@ export default class Ape extends Emiter { let object_id = regUpdatedItem.objId; let user_data = regUpdatedItem.userData; - loger.log('REG OBJECT EVENT ->', pdu.id2type(sub_type)); + //loger.log('REG OBJECT EVENT ->', pdu.id2type(sub_type)); switch (sub_type) { case pdu.RCPDU_REG_ROSTER_INSERT_PDU: //let rosterInsertData = pdu['RCRegstryRosterInsertItemPdu'].decode(user_data); - loger.log('RCPDU_REG_ROSTER_INSERT_PDU---->'); + //loger.log('RCPDU_REG_ROSTER_INSERT_PDU---->'); console.log(user_data); let rosterInsertData = pdu['RCRegistryRosterInsertItemPdu'].decode(user_data); let rosterInsertItems = rosterInsertData.items; @@ -329,7 +329,7 @@ export default class Ape extends Emiter { } send(appPdu) { - loger.log('Ape发送数据NORMAL PDU'); + //loger.log('Ape发送数据NORMAL PDU'); //console.log(appPdu); //loger.log('当前的状态============',GlobalConfig.getCurrentStatus().code); if (GlobalConfig.getCurrentStatus().code == 0 || GlobalConfig.getCurrentStatus().code == 1) { @@ -359,14 +359,6 @@ export default class Ape extends Emiter { // 发送当前APE(session uniform包) sendUniform(appPdu, top) { - loger.log('Ape发送数据UNIFORM PDU'); - //console.log(appPdu); - //loger.log('当前的状态============',GlobalConfig.getCurrentStatus().code); - //if (GlobalConfig.getCurrentStatus().code == 0 || GlobalConfig.getCurrentStatus().code == 1) { - // this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_SEND_FAILED_NO_JOIN); - // return; - //} - if(!this._classInfo){ loger.warn('Ape发送数据UNIFORM PDU->失败->ape课堂数据无效->', this._classInfo); return; @@ -412,7 +404,7 @@ export default class Ape extends Emiter { PduConsts.SEG_ONCE ); uniformPdu.data = appPdu.toArrayBuffer(); - loger.log('Ape发送数据UNIFORM PDU',uniformPdu); + //loger.log('Ape发送数据UNIFORM PDU',uniformPdu); // Mcu发送 this.mcu.send(uniformPdu); } diff --git a/src/apes/ConferApe.js b/src/apes/ConferApe.js index 2fd0667..d006ace 100644 --- a/src/apes/ConferApe.js +++ b/src/apes/ConferApe.js @@ -67,7 +67,7 @@ class ConferApe extends Ape { nodeInfoRecordPdu.userData = userDataPdu.toArrayBuffer(); nodeInfoRecordPdu.deviceType = GlobalConfig.deviceType; //设备类型 - loger.log('开始加入->', nodeInfoRecordPdu); + //loger.log('开始加入->', nodeInfoRecordPdu); let item = new pdu['RCRegistryRosterItemPdu']; item.nodeId = nodeInfoRecordPdu.nodeId; @@ -118,6 +118,8 @@ class ConferApe extends Ape { nodeInfoRecordPdu.curVideoQuality = GlobalConfig.curVideoQuality; nodeInfoRecordPdu.micGain = GlobalConfig.micGain; + nodeInfoRecordPdu.micNoise = GlobalConfig.micNoise; + nodeInfoRecordPdu.autoGain = GlobalConfig.autoGain; nodeInfoRecordPdu.speakerVolume = GlobalConfig.speakerVolume; nodeInfoRecordPdu.micCode = GlobalConfig.micCode; nodeInfoRecordPdu.curCamera = GlobalConfig.curCamera; @@ -151,14 +153,13 @@ class ConferApe extends Ape { nodeInfoRecordPdu.explorerVersion = GlobalConfig.explorerVersion; nodeInfoRecordPdu.os = GlobalConfig.os; nodeInfoRecordPdu.sdkVersion = GlobalConfig.sdkVersion || "未知版本"; - return nodeInfoRecordPdu; } //更新角色数据 updateUserInfo() { let nodeInfoRecordPdu = this.getNodeInfo(); - loger.log('更新用户信息->', nodeInfoRecordPdu); + //loger.log('更新用户信息->', nodeInfoRecordPdu); let userDataPdu = new pdu['RCNodeInfoUserDataPdu']; userDataPdu.qq = ''; userDataPdu.skype = ''; @@ -646,8 +647,6 @@ class ConferApe extends Ape { tableUpdateHandler(owner, itemIdx, itemData) { try { let model = this.unPackPdu(owner, itemIdx, itemData); - console.log('课堂数据更新->', model); - //处理课堂更新的信息 if (model && model.classStatusInfo) { try { @@ -663,10 +662,10 @@ class ConferApe extends Ape { this._emit(MessageTypes.STOP_ALL_MEDIA_PUBLISH); } } - + // loger.log('课堂数据更新->'); //通知应用层更新课堂状态 let classInfo = GlobalConfig.classStatusInfo; - loger.log('通知应用层更新课堂状态->CLASS_UPTATE_STATUS') + //loger.log('通知应用层更新课堂状态->CLASS_UPTATE_STATUS') this._emit(MessageTypes.CLASS_UPTATE_STATUS, classInfo); //如果MCU已经断开连接,停止计时器 @@ -923,7 +922,7 @@ class ConferApe extends Ape { this.rosterLen = Object.keys(this.rosters).length; GlobalConfig.rosterNumber = this.rosterLen;//记录当前的总人数 newNodeData.rosterLen = this.rosterLen; - loger.log("人员加入->", newNodeData); + //loger.log("人员加入->", newNodeData); this._emit(MessageTypes.CLASS_INSERT_ROSTER, {"nodeId": nodeId, "nodeData": newNodeData}); this.emitRosterChange(); } else { @@ -1001,7 +1000,7 @@ class ConferApe extends Ape { } else { let user = this.rosters[nodeId]; if (user) { - loger.log(nodeId, "->离开课堂->身份->", user.role); + loger.log(nodeId, "->离开课堂->身份->", user.userRole); } delete this.rosters[nodeId]; this.rosterLen = Object.keys(this.rosters).length; @@ -1040,7 +1039,7 @@ class ConferApe extends Ape { ///////数据的封包和解包///////////////////////////////////////// packPdu(_param, _itemIdx) { - loger.log("课堂===packPdu "); + //loger.log("课堂===packPdu "); //验证坐标点集合数组是否合法 if (_param == null || _itemIdx == null) { this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG); @@ -1071,7 +1070,7 @@ class ConferApe extends Ape { classStatusInfo.currentSceneTableId = GlobalConfig.currentSceneTableId; classStatusInfo.silence = GlobalConfig.silence; classStatusInfo.silenceUsers = JSON.stringify(GlobalConfig.silenceUsers); - loger.log("classStatusInfo--->", classStatusInfo); + //loger.log("classStatusInfo--->", classStatusInfo); /* optional uint32 item_idx=1; @@ -1091,7 +1090,7 @@ class ConferApe extends Ape { } unPackPdu(owner, itemIdx, itemData) { - loger.log("课堂数据->unPackPdu "); + //loger.log("课堂数据->unPackPdu "); if (owner == null || itemIdx == null || itemData == null) { this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG); return null; diff --git a/src/apes/CursorApe.js b/src/apes/CursorApe.js index 9f104f9..0be1a55 100644 --- a/src/apes/CursorApe.js +++ b/src/apes/CursorApe.js @@ -43,7 +43,7 @@ class CursorApe extends Ape { } _joinSessionHandler(_data) { - loger.log("RCPDU_SESSION_JOIN_RESPONSE"); + //loger.log("RCPDU_SESSION_JOIN_RESPONSE"); } // 添加鼠标 diff --git a/src/apes/DocApe.js b/src/apes/DocApe.js index 4cd5c05..9a005dc 100644 --- a/src/apes/DocApe.js +++ b/src/apes/DocApe.js @@ -100,7 +100,7 @@ class DocApe extends Ape { this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG); return null; } - loger.log("文档->updaterDoc ", _docDataModel); + //loger.log("文档->updaterDoc ", _docDataModel); let docDataModelPdu = this.packPdu(_docDataModel, _itemIdx); let tableItemPdu = new pdu['RCRegistryTableItemPdu']; @@ -130,7 +130,7 @@ class DocApe extends Ape { adapterPdu.type = pdu.RCPDU_REG_ADAPTER; adapterPdu.item.push(adapterItemPdu); - loger.log("发送更新文档.itemIdx=" + tableItemPdu.itemIdx); + //loger.log("发送更新文档.itemIdx=" + tableItemPdu.itemIdx); this.sendUniform(adapterPdu, true); } //获取文档的完整地址和所有图片 @@ -296,6 +296,7 @@ class DocApe extends Ape { _docPackFullInfo(_itemDataInfo){ let itemDataInfo=_itemDataInfo; let getDocAddress=this.getDocFullAddress(_itemDataInfo); + loger.log('docPackFullInfo->', itemDataInfo); if(getDocAddress.code==ApeConsts.RETURN_SUCCESS){ itemDataInfo.images=getDocAddress.docFullAddress.images||[]; itemDataInfo.pdf=getDocAddress.docFullAddress.pdf||""; @@ -305,7 +306,7 @@ class DocApe extends Ape { itemDataInfo.pdf=''; itemDataInfo.html=''; } - loger.log('docPackFullInfo->', itemDataInfo); + return itemDataInfo; } //更新文档模块的录制信息,每次开启录制的时候需要把当前文档的信息更新一次 @@ -439,7 +440,6 @@ class DocApe extends Ape { loger.log('文档切换显示模式', paramInfo); //获取已经存在的数据 let docDataModel = this.docList[paramInfo.itemIdx]; - if (docDataModel == null) { loger.log('文档切换显示模式->文档不存在', paramInfo); this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG); @@ -459,13 +459,16 @@ class DocApe extends Ape { //获取已经存在的数据 let docDataModel = this.docList[paramInfo.itemIdx]; if (docDataModel == null) { - loger.log('documentCommand失败,文档不存在', paramInfo); + loger.log('文档显示控制失败->文档不存在', paramInfo); this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG); return; } //更新数据的字段 docDataModel.action = ApeConsts.DOC_ACTION_COMMAND; docDataModel.showType = parseInt(paramInfo.showType) || 0;//0;//完整显示;1;//按宽度显示;2;//按高度显示 + docDataModel.curV= parseInt(paramInfo.curV) || 0;//垂直方向的滚动条进度百分比 0-100 + docDataModel.curH= parseInt(paramInfo.curH) || 0;//水平方向的滚动条进度百分比 0-100 + docDataModel.scale= parseInt(paramInfo.scale) || 100;//文档缩放百分比 0-100 this.updaterDoc(docDataModel, docDataModel.itemIdx); } @@ -598,7 +601,7 @@ class DocApe extends Ape { tableUpdateApeHandler(_tableUpdateItems, _seekTime) { let tableUpdateItemsLen = _tableUpdateItems.length; - loger.log('更新文档->', "activeDocId->", GlobalConfig.activeDocId, "更新的数量->", tableUpdateItemsLen); + //loger.log('更新文档->', "activeDocId->", GlobalConfig.activeDocId, "更新的数量->", tableUpdateItemsLen); for (let i = 0; i < tableUpdateItemsLen; ++i) { let tableItem = _tableUpdateItems[i]; if(tableItem) { @@ -689,7 +692,7 @@ class DocApe extends Ape { ///////数据的封包和解包///////////////////////////////////////// packPdu(_param, _itemIdx) { - loger.log("文档->packPdu"); + //loger.log("文档->packPdu"); //验证坐标点集合数组是否合法 if (_param == null || _itemIdx == null) { this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG); @@ -706,8 +709,8 @@ class DocApe extends Ape { docModelPdu.creatUserId = _param.creatUserId || "0"; docModelPdu.url = _param.url||"";//这个地址没用到,数据太长占用资源 暂停使用//"http://101.200.150.192/DocSharing/data/h5test/20170206-171100025/7e9c4178cac1133e0dd9d5b583439122.jpg"; docModelPdu.relativeUrl = _param.relativeUrl || "";//"/DocSharing/data/h5test/20170206-171100025/7e9c4178cac1133e0dd9d5b583439122.jpg"; - docModelPdu.curV = _param.curV || 0; - docModelPdu.curH = _param.curH || 0; + docModelPdu.curV = parseInt(_param.curV) || 0; + docModelPdu.curH = parseInt(_param.curH) || 0; docModelPdu.scale = _param.scale || 100;//按百分比 docModelPdu.visible = _param.visible || false; docModelPdu.action = _param.action || ApeConsts.DOC_ACTION_NORMAL;//0,无操作, 1翻页、2.显示/隐藏, 3缩放/滚动 @@ -728,7 +731,7 @@ class DocApe extends Ape { } try { let docModelPdu = pdu['RCDocSendDataModelPdu'].decode(itemData); - loger.log("文档===>unPackPdu"); + //loger.log("文档===>unPackPdu"); return docModelPdu; } catch (err) { loger.log("文档===>unPackPdu->Pdu解析错误->itemIdx=" + itemIdx + "->err:" + err.message); diff --git a/src/apes/MediaSharedApe.js b/src/apes/MediaSharedApe.js index e0f4942..018a2a4 100644 --- a/src/apes/MediaSharedApe.js +++ b/src/apes/MediaSharedApe.js @@ -470,7 +470,7 @@ class MediaSharedApe extends Ape { } onJoinChannelHandlerSuccess() { - loger.log(this._session_name + ' 媒体共享加入频道成功'); + // loger.log(this._session_name + ' 媒体共享加入频道成功'); if (this._apeDelayed) { setTimeout(() => { this._emit(MediaSharedApe.MEDIASHARED_JOIN_CHANNEL_SUCCESS); @@ -503,7 +503,7 @@ class MediaSharedApe extends Ape { ///////数据的封包和解包///////////////////////////////////////// packPdu(_param, _itemIdx) { - loger.log("媒体文件->packPdu"); + //loger.log("媒体文件->packPdu"); //验证坐标点集合数组是否合法 if (_param == null || _itemIdx == null) { this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG); @@ -544,7 +544,7 @@ class MediaSharedApe extends Ape { } try { let pduDataModel = pdu['RCMediaSharedSendDataModelPdu'].decode(itemData); - loger.log("媒体文件===>unPackPdu"); + // loger.log("媒体文件===>unPackPdu"); return pduDataModel; } catch (err) { loger.log("媒体文件===>unPackPdu->Pdu解析错误->itemIdx=" + itemIdx + "->err:" + err.message); diff --git a/src/apes/MusicSharedApe.js b/src/apes/MusicSharedApe.js index 4f33814..eaab74f 100644 --- a/src/apes/MusicSharedApe.js +++ b/src/apes/MusicSharedApe.js @@ -466,7 +466,7 @@ class MusicSharedApe extends Ape { } onJoinChannelHandlerSuccess() { - loger.log(this._session_name + ' 伴音模块共享加入频道成功'); + //loger.log(this._session_name + ' 伴音模块共享加入频道成功'); if (this._apeDelayed) { setTimeout(() => { this._emit(MusicSharedApe.MUSICSHARED_JOIN_CHANNEL_SUCCESS); @@ -499,7 +499,7 @@ class MusicSharedApe extends Ape { ///////数据的封包和解包///////////////////////////////////////// packPdu(_param, _itemIdx) { - loger.log("伴音伴音文件->packPdu"); + //loger.log("伴音伴音文件->packPdu"); //验证坐标点集合数组是否合法 if (_param == null || _itemIdx == null) { this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG); @@ -540,7 +540,7 @@ class MusicSharedApe extends Ape { } try { let pduDataModel = pdu['RCMusicSharedSendDataModelPdu'].decode(itemData); - loger.log("伴音文件===>unPackPdu"); + // loger.log("伴音文件===>unPackPdu"); return pduDataModel; } catch (err) { loger.log("伴音文件===>unPackPdu->Pdu解析错误->itemIdx=" + itemIdx + "->err:" + err.message); diff --git a/src/apes/QuestionApe.js b/src/apes/QuestionApe.js index d9448bb..791543c 100644 --- a/src/apes/QuestionApe.js +++ b/src/apes/QuestionApe.js @@ -277,7 +277,7 @@ class QuestionApe extends Ape { } unPackPdu(owner, itemIdx, itemData) { - loger.log("答题卡->unPackPdu "); + //loger.log("答题卡->unPackPdu "); if (owner == null || itemIdx == null || itemData == null) { this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG); return null; diff --git a/src/apes/ShareApe.js b/src/apes/ShareApe.js index cbe9811..9a1d8c3 100644 --- a/src/apes/ShareApe.js +++ b/src/apes/ShareApe.js @@ -15,12 +15,16 @@ class ShareApe extends Emiter { super(); this.channelId=ApeConsts.SCREENSHARING_OBJ_TABLE_ID; this.streamId=''; - this.publishUrl='';//rtmp://123.56.205.116/live/alexwang + this.publishUrl=''; this.isConnect=false; + this.isStopPublish=false; //this.shareScreen=new ShareScreen(); this.shareScreen=ShareScreen; - this.ip='127.0.0.1'; - this.port=8090; + this.defaultPort='605';//以前用的是8089 + this.defaultIp='127.0.0.1'; + this.ip=this.defaultIp; + this.port=this.defaultPort; + this.init(); } init(){ @@ -122,11 +126,14 @@ class ShareApe extends Emiter { "data":"", "mediaId":shareChannel, "publishUrl": publishUrl, - "streamId":streamId + "streamId":streamId, + "port":"" };*/ if(_result){ this.publishUrl=_result.publishUrl||''; - this.streamId=_result.streamId||'' + this.streamId=_result.streamId||''; + this.port=_result.port||this.defaultPort; + this.ip=_result.ip||this.defaultIp; } clearTimeout(this.reConnectTimer); if(!this.isConnect){ @@ -151,7 +158,6 @@ class ShareApe extends Emiter { this.shareScreen.stopShareScreen(); }catch (err){ console.log('关闭屏幕共享->失败',err.message); - } } this.publishUrl='' diff --git a/src/apes/VideoApe.js b/src/apes/VideoApe.js index 1b70b16..57a6b4f 100644 --- a/src/apes/VideoApe.js +++ b/src/apes/VideoApe.js @@ -239,6 +239,8 @@ class VideoApe extends Ape { if(GlobalConfig.isHost) { //获取屏幕共享推流的地址 let shareResult = this.mediaModule.getMediaPublishPathForScreenShare(this.shareApe.channelId, publishType); + shareResult.ip=_param.ip||"";//外部可以设置屏幕共享的IP + shareResult.port=_param.port||"";//外部可以设置屏幕共享的端口 this.shareApe.publish(shareResult); } } @@ -372,7 +374,7 @@ class VideoApe extends Ape { } //发送到mcu同步(更新数据) sendTableUpdateHandler(_channelInfo) { - loger.log("video===sendTableUpdateHandler "); + //loger.log("video===sendTableUpdateHandler "); let updateModelPdu = this.packPdu(_channelInfo, _channelInfo.channelId);//let updateModelPdu=this.packPdu({},ApeConsts.VIDEO_OBJ_TABLE_ID+2); if(updateModelPdu==null){ diff --git a/src/apes/WhiteBoardApe.js b/src/apes/WhiteBoardApe.js index 47eb157..4160231 100644 --- a/src/apes/WhiteBoardApe.js +++ b/src/apes/WhiteBoardApe.js @@ -54,7 +54,7 @@ class WhiteBoardApe extends Ape { } _joinSessionHandler(_data) { - loger.log("RCPDU_SESSION_JOIN_RESPONSE"); + //loger.log("RCPDU_SESSION_JOIN_RESPONSE"); this.insertHistory = []; } @@ -345,7 +345,7 @@ class WhiteBoardApe extends Ape { //文档更新,白板也要更新 docUpdateHandler(_data) { - loger.log("白板收到文档更新的消息"); + //loger.log("白板收到文档更新的消息"); //loger.log(_data); //如果切换了文档或翻页,清除之前的添加步骤记录 @@ -380,7 +380,7 @@ class WhiteBoardApe extends Ape { "isFresh": false, "annotaionItems": annotaionItems }; - loger.log("新增一条标注数据->显示到界面"); + //loger.log("新增一条标注数据->显示到界面"); this._emit(MessageTypes.WHITEBOARD_ANNOTATION_UPDATE, updateObj); } @@ -450,7 +450,7 @@ class WhiteBoardApe extends Ape { unPackPdu(owner, itemIdx, itemData) { try { - loger.log("白板标注数据->unPackPdu"); + //loger.log("白板标注数据->unPackPdu"); let whiteBoardModelPdu = pdu['RCWhiteBoardDataModelPdu'].decode(itemData); let _pointGroup = EngineUtils.arrayFromJsonString(whiteBoardModelPdu.pointGroup); whiteBoardModelPdu.pointGroup = _pointGroup; diff --git a/src/mcu.js b/src/mcu.js index 65dc07c..82c9ab2 100644 --- a/src/mcu.js +++ b/src/mcu.js @@ -184,10 +184,10 @@ class MCU extends Emiter { // 课堂发送消息 -- 消息同意序列号 send(msg) { if (this.connected) { - loger.log('发送数据到服务端-------------------->'); + // loger.log('发送数据到服务端-------------------->'); this._everSocket.send(msg.toArrayBuffer()); } else { - loger.log('发送数据到服务端-------------------->失败->未连接到服务端'); + loger.warn('发送数据到服务端-------------------->失败->未连接到服务端'); this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_SOCKET_DISCONNECT); } } @@ -206,9 +206,6 @@ class MCU extends Emiter { // 主动建立MCU连接 joinMCU(_classInfo) { loger.log('开始建立EverSocket通道.'); - if(!this.classInfo||!this.classInfo.MCUServerIP){ - loger.error('建立MCU连接->地址无效.'); - } GlobalConfig.classJoinSuccess = false; loger.log(_classInfo); _classInfo.classId = parseInt(_classInfo.classId); // classId 必须整形 diff --git a/src/pdus/pro.js b/src/pdus/pro.js index cb17509..56021f5 100644 --- a/src/pdus/pro.js +++ b/src/pdus/pro.js @@ -901,7 +901,7 @@ message RCNodeInfoRecordPdu { repeated string cameras = 14; optional uint32 openCamera=15; optional uint32 openMicrophones=16; - optional uint32 videoQuality=17;//设置分辨率的 + optional uint32 videoQuality=17;//画质对应分辨率 optional string userIp=18; optional uint32 curVideoQuality=19; optional uint32 micGain=20; @@ -921,6 +921,8 @@ message RCNodeInfoRecordPdu { optional string explorerVersion = 34;//浏览器版本 optional string os = 35;//系统版本 optional string sdkVersion = 36;//SDK版本 + optional uint32 micNoise=37; + optional bool autoGain=38; } message RCVotingPollSettingsPdu { -- libgit2 0.24.0