李勇

1.server数据不再从本地加载,直接获取从Sass返回的数据;2.增加日志上报;3.人员属性中增加噪音消除的字段和自动调整麦克风音量的字段

... ... @@ -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);
//返回给客户端初始化成功的数据
... ...
... ... @@ -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);
}
... ...
... ... @@ -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; //麦克风模式
... ...
... ... @@ -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
};
... ...
/**
*
* 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;
... ...
... ... @@ -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
};
... ...
... ... @@ -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) {
... ...
... ... @@ -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);
}
... ...
... ... @@ -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;
... ...
... ... @@ -43,7 +43,7 @@ class CursorApe extends Ape {
}
_joinSessionHandler(_data) {
loger.log("RCPDU_SESSION_JOIN_RESPONSE");
//loger.log("RCPDU_SESSION_JOIN_RESPONSE");
}
// 添加鼠标
... ...
... ... @@ -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);
... ...
... ... @@ -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);
... ...
... ... @@ -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);
... ...
... ... @@ -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;
... ...
... ... @@ -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=''
... ...
... ... @@ -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){
... ...
... ... @@ -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;
... ...
... ... @@ -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 必须整形
... ...
... ... @@ -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 {
... ...