李勇
3abfe5f4 1 parent 100f8d66 webRtc-dev ... 20170922-1 20171019-1 20171120-1w dev ly20170802-1 ly20170818-1 ly20170818-2 ly20170820-1 ly20170821-1 ly20170824-1 ly20170829-1 ly20170925-1 ly20170926-1 ly20170927-1 ly20170929-1 ly20171011-1 ly20171013-1 ly20171013-2 ly20171016-1 ly20171021-1 ly20171023-1 ly20171024-1w ly20171025-1w ly20171026-1w ly20171027-1w ly20171030-1 ly20171030-2w ly20171107-1 ly20171110-1w ly20171113-1w ly20171204-1w ly20171208-1w ly20171211-1w ly20171211-2w ly20171214-1w v2.38.13.20171216 v2.38.11.20171214 v2.38.3.201712011 v2.38.1.201712011 v2.36.11.20171204 v2.36.8.20171206 v2.36.4.20171201 v2.35.11.20171130 v2.34.16.20171128 v2.34.5.20171127 v2.33.6.20171123 v2.32.1.20171123 v2.31.12.20171122 v2.31.10.20171122 v2.30.5.20171117 v2.30.2.20171117 v2.29.5.20171114 v2.28.1.20171110 v2.27.11.20171109 v2.26.9.20171107 v2.26.6.20171103 v2.26.2.20171102 v2.25.7.20171031 v2.25.6.20171031 v2.25.0.20171030 v2.24.2.20171030 v2.23.0.20171030 v2.22.7.20171026 v2.20.5.20171023 v2.20.0.20171021 v2.19.8.20171020 v2.18.14.20171020 v2.18.10.20171019 v2.17.11.20171014 v2.16.8.20171012 v2.16.5.20171012 v2.15.5.20171001 v2.15.3.20170929 v2.14.5.20170927 v2.13.5.20170927 v2.12.14.20170927 v2.12.8.20170926 v2.12.6.20170925 v2.11.13.20170925 v2.10.7.20170921 v2.10.6.20170921 v2.10.5.20170920 v2.10.4.20170920 v2.9.3.20170919 v2.8.17.20170918 v2.8.8.20170917 v2.8.2.20170916 v2.6.2.20170915 v2.5.12.20170915 v2.5.6.20170914 v2.5.5.20170914 v2.4.4.20170908 v2.4.2.20170908 v2.4.0.20170907 v2.3.6.20170907 v2.2.16.20170905 v2.1.22.20170904 v1.84.0.20170912 v1.83.2.20170831 v1.82.11.20170829 v1.81.19.20170828 v1.80.2.20170824 v1.79.6.20170822 v1.79.5.20170821 v1.79.4.20170821 v1.79.3.20170821 v1.78.4.20170820 v1.77.4.20170819 v1.76.2.20170818 v1.75.0.20170815 v1.74.0.20170814 v1.73.2.20170814 v1.73.1.20170814 v1.71.0.20170813 v1.70.5.20170812 v1.68.2.20170812 v1.66.1.20170809 v1.65.25.20170808 v1.65.24.20170806

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;
... ... @@ -1159,7 +1212,7 @@ export default class MessageEntrance extends Emiter {
}
}
//如果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;
... ... @@ -1191,7 +1244,7 @@ export default class MessageEntrance extends Emiter {
}
}
//如果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,11 +1528,11 @@ 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);
}
/*
... ... @@ -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) {
case Loger.LOG:
Loger.LogManager.addLog(Loger.LOG, logMsg);
//如果是debug模式就输出
if (Loger.IS_DEBUG) {
console.log(logMsg);
}
break;
case Loger.WARN:
Loger.LogManager.addLog(Loger.WARN, logMsg);
//如果是debug模式就输出
if (Loger.IS_DEBUG) {
console.warn(logMsg);
}
break;
case Loger.ERROR:
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 {
... ...