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