李勇

1.修改nodeId和userId的生成规则,避免重复;2.统一设备类型定义;3.处理课堂模块和视频模块离开课堂后的消息处理

... ... @@ -63,7 +63,7 @@ export default class MessageEntrance extends Emiter {
super();
this.lastClassActiveTime=0;//最后一次课堂激活的时间戳
//sdk 信息
GlobalConfig.sdkVersion = "v2.30.5.20171117";
GlobalConfig.sdkVersion = "v2.31.1.20171120";
loger.warn("sdkVersion:" + GlobalConfig.sdkVersion);
console.log("sdkVersion:" + GlobalConfig.sdkVersion);
//设置
... ... @@ -456,8 +456,23 @@ export default class MessageEntrance extends Emiter {
LogManager.IS_OPEN_SEND_LOG = false;//断开之后不再上报日志
},2000);
this.clearClientData();
}
//清除所有客户端数据
clearClientData(){
GlobalConfig.MCUServerIP="";
GlobalConfig.MCUServerPort="";
GlobalConfig.mcuListFinal=[];
if(_mcu){
_mcu.leaveMCU();
}
if(_confer_ape){
_confer_ape.stopApe();
}
if(_video_ape){
_video_ape.stopApe();
}
}
//当前的课堂状态信息发生改变,需要保存课堂状态到Sass
_onClassStatusInfoChange(_param) {
//如果MCU连接已经断开,不发送
... ... @@ -493,6 +508,10 @@ export default class MessageEntrance extends Emiter {
if (GlobalConfig.isRecordPlayBack || !_confer_ape) {
return;
}
if(GlobalConfig.classType==ApeConsts.CLASS_TYPE_ZHIBO){
//直播的时候不再同步所有模块的消息
return
}
//老师身份和非录制回放的时候执行,录制状态发送改变,需要更新当前的数据,否则已有的消息会录制不上
if (_confer_ape.checkHasRecordControl()) {
loger.warn('录制状态发送改变->更新所有模块的当前数据发送到MCU');
... ... @@ -529,7 +548,10 @@ export default class MessageEntrance extends Emiter {
if (!_data) {
return;
}
if (GlobalConfig.deviceType == 1 || GlobalConfig.deviceType == 2 || GlobalConfig.deviceType == 3 || _data.nodeId == GlobalConfig.nodeId) {
if (GlobalConfig.deviceType == GlobalConfig.deviceIOS ||
GlobalConfig.deviceType == GlobalConfig.deviceAndroid ||
GlobalConfig.deviceType == GlobalConfig.deviceH5 ||
_data.nodeId == GlobalConfig.nodeId) {
return;
}
if (_webRtc) {
... ... @@ -600,7 +622,7 @@ export default class MessageEntrance extends Emiter {
GlobalConfig.isH5 = _param.isH5 || false;//外部传入的参数,是否是H5
if (GlobalConfig.isH5 == true) {
GlobalConfig.platform = "h5";
GlobalConfig.deviceType = 3//3是H5
GlobalConfig.deviceType = GlobalConfig.deviceH5;
loger.warn("设备类型是H5");
}
... ... @@ -619,25 +641,27 @@ export default class MessageEntrance extends Emiter {
GlobalConfig.userRole != ApeConsts.invisible) {
GlobalConfig.userRole = ApeConsts.normal;
}
//如果没有名字或没有userId的时候,需要随机生成
let timestampStr = new Date().getTime().toString();
timestampStr = timestampStr.substr(timestampStr.length - 4);
//如果没有名字的时候需要随机生成
let randUserId =parseInt(Math.random()*1000)+""+parseInt(Math.random()*1000)+""+parseInt(Math.random()*1000);
if (GlobalConfig.userRole == ApeConsts.host) {
timestampStr = "T" + timestampStr;
randUserId = "T" + randUserId;
} else if (GlobalConfig.userRole == ApeConsts.assistant) {
timestampStr = "A" + timestampStr;
randUserId = "A" + randUserId;
} else if (GlobalConfig.userRole == ApeConsts.presenter) {
timestampStr = "P" + timestampStr;
randUserId = "P" + randUserId;
} else {
timestampStr = "S" + timestampStr;
randUserId = "S" + randUserId;
}
//如果没有名字,随机起一个名字
GlobalConfig.userName = _param.userName || timestampStr;
GlobalConfig.userName = _param.userName || randUserId;
//如果没有userId或者为"0",随机生成
if (!GlobalConfig.userId || GlobalConfig.userId == "0") {
GlobalConfig.userId = timestampStr;
GlobalConfig.userId = randUserId;
}
console.log("userId", GlobalConfig.userId);
//客户端决定是否延迟接收消息
GlobalConfig.messageDelay = _param.messageDelay || false;
... ... @@ -696,7 +720,7 @@ export default class MessageEntrance extends Emiter {
GlobalConfig.md5 = _data.md5 || ""; //这个暂时用假数据,后台接口写完就有数据了
GlobalConfig.msType = _data.msType || 1;
GlobalConfig.siteId = _data.siteId || "";
GlobalConfig.classType = _data.meetingType || ApeConsts.CLASS_TYPE_1;
GlobalConfig.classType = _data.meetingType || ApeConsts.CLASS_TYPE_1v1;
//host默认需要密码,Sass服务器只判断学生是否需要密码,没有判断老师的
GlobalConfig.passwordRequired = _data.passwordRequired || false; //md5验证的时候需要Sass返回的值,不能更改
... ... @@ -1211,7 +1235,7 @@ export default class MessageEntrance extends Emiter {
joinClassSuccessCallBackData.userRole = GlobalConfig.userRole;
joinClassSuccessCallBackData.userId = GlobalConfig.userId;
joinClassSuccessCallBackData.passwordRequired = GlobalConfig.passwordRequired;
joinClassSuccessCallBackData.classType = GlobalConfig.classType || ApeConsts.CLASS_TYPE_1;
joinClassSuccessCallBackData.classType = GlobalConfig.classType || ApeConsts.CLASS_TYPE_1v1;
joinClassSuccessCallBackData.country = GlobalConfig.country; //国家
joinClassSuccessCallBackData.city = GlobalConfig.city; //城市
... ... @@ -1360,12 +1384,12 @@ export default class MessageEntrance extends Emiter {
//用更状态数据发送变更
_onRosterUpdateHandler(_data) {
//数据无效/ios/android 不处理数据
if (!_data || GlobalConfig.deviceType == 1 || GlobalConfig.deviceType == 2) {
if (!_data || GlobalConfig.deviceType == GlobalConfig.deviceIOS || GlobalConfig.deviceType == GlobalConfig.deviceAndroid) {
return;
}
let nodeData = _data.nodeData;
//数据用户是pc或H5不处理
if (!nodeData || nodeData.deviceType == 0 || nodeData.deviceType == 3) {
if (!nodeData || nodeData.deviceType == GlobalConfig.devicePC || nodeData.deviceType == GlobalConfig.deviceH5) {
return;
}
if (nodeData.openCamera > 0 && _webRtc) {
... ... @@ -1572,7 +1596,6 @@ export default class MessageEntrance extends Emiter {
//开始上课
_confer_ape.startClass(_param);
////开始录制
//_confer_ape.startRecord();
}
}
... ... @@ -2564,8 +2587,8 @@ export default class MessageEntrance extends Emiter {
//如果是主持人,那么需要判断一下文档模块同步的数据和从sass获取的文档数据是否相同,如果mcu服务器不存在的,需要上传
if (GlobalConfig.docListPrepare && GlobalConfig.docListPrepare.length > 0) {
//如果当前身份是老师或者当前课堂内只有一个人,有权限同步文档到MCU
if (GlobalConfig.isHost || GlobalConfig.rosterNumber <= 1&&GlobalConfig.deviceType!=3) {
//如果当前身份是老师或者当前课堂内只有一个人并且不是H5,有权限同步文档到MCU
if (GlobalConfig.isHost || (GlobalConfig.rosterNumber <= 1&&GlobalConfig.deviceType!=GlobalConfig.deviceH5)) {
for (let i = 0; i < GlobalConfig.docListPrepare.length; i++) {
let value = GlobalConfig.docListPrepare[i];
if (value) {
... ... @@ -2759,7 +2782,7 @@ export default class MessageEntrance extends Emiter {
//loger.log("伴音MUSIC模块加入频道成功->isHost=", GlobalConfig.isHost, "length=", GlobalConfig.musicListPrepare.length);
//console.log("伴音MUSIC模块共享模数据->", GlobalConfig.musicListPrepare);
//如果是主持人,那么需要判断一下文档模块同步的数据和从sass获取的文档数据是否相同,如果mcu服务器不存在的,需要上传
if (GlobalConfig.isHost && GlobalConfig.musicListPrepare.length > 0&&GlobalConfig.deviceType!=3) {
if (GlobalConfig.isHost && GlobalConfig.musicListPrepare.length > 0&&GlobalConfig.deviceType!=GlobalConfig.deviceH5) {
for (let i = 0; i < GlobalConfig.musicListPrepare.length; i++) {
let value = GlobalConfig.musicListPrepare[i];
if (value) {
... ... @@ -2790,7 +2813,7 @@ export default class MessageEntrance extends Emiter {
//loger.log("媒体共享模块加入频道成功->isHost=", GlobalConfig.isHost, "length=", GlobalConfig.sharedMediaList.length);
//console.log("媒体共享模数据->", GlobalConfig.sharedMediaList);
//如果是主持人,那么需要判断一下文档模块同步的数据和从sass获取的文档数据是否相同,如果mcu服务器不存在的,需要上传
if (GlobalConfig.isHost && GlobalConfig.sharedMediaList.length > 0&&GlobalConfig.deviceType!=3) {
if (GlobalConfig.isHost && GlobalConfig.sharedMediaList.length > 0&&GlobalConfig.deviceType!=GlobalConfig.deviceH5) {
for (let i = 0; i < GlobalConfig.sharedMediaList.length; i++) {
let value = GlobalConfig.sharedMediaList[i];
if (value) {
... ... @@ -2943,7 +2966,7 @@ export default class MessageEntrance extends Emiter {
joinClassSuccessCallBackData.userRole = GlobalConfig.userRole;
joinClassSuccessCallBackData.userId = GlobalConfig.userId;
joinClassSuccessCallBackData.passwordRequired = GlobalConfig.passwordRequired;
joinClassSuccessCallBackData.classType = GlobalConfig.classType || ApeConsts.CLASS_TYPE_1;
joinClassSuccessCallBackData.classType = GlobalConfig.classType || ApeConsts.CLASS_TYPE_1v1;
joinClassSuccessCallBackData.country = GlobalConfig.country; //国家
joinClassSuccessCallBackData.city = GlobalConfig.city; //城市
... ... @@ -3029,7 +3052,7 @@ export default class MessageEntrance extends Emiter {
* 初始化webRtc
* */
_initWebRtcSdk(_params, _callback) {
if (GlobalConfig.deviceType == 1 || GlobalConfig.deviceType == 2 || GlobalConfig.deviceType == 3) {
if (GlobalConfig.deviceType == GlobalConfig.deviceIOS || GlobalConfig.deviceType == GlobalConfig.deviceAndroid || GlobalConfig.deviceType == GlobalConfig.deviceH5) {
loger.warn("移动端不需要处理初始化webRtc");
if (_callback) {
_callback();
... ... @@ -3104,7 +3127,7 @@ export default class MessageEntrance extends Emiter {
* 加入视频通话
* */
_joinChannel(_params) {
if (GlobalConfig.deviceType == 1 || GlobalConfig.deviceType == 2) {
if (GlobalConfig.deviceType == GlobalConfig.deviceIOS || GlobalConfig.deviceType == GlobalConfig.deviceAndroid) {
loger.warn("移动端不需要处理加入视频房间");
return;
}
... ... @@ -3117,7 +3140,7 @@ export default class MessageEntrance extends Emiter {
* 离开视频通话频道
* */
_leaveChannel(_params) {
if (GlobalConfig.deviceType == 1 || GlobalConfig.deviceType == 2) {
if (GlobalConfig.deviceType == GlobalConfig.deviceIOS || GlobalConfig.deviceType == GlobalConfig.deviceAndroid) {
return;
}
if (_webRtc) {
... ... @@ -3139,7 +3162,7 @@ export default class MessageEntrance extends Emiter {
return;
}
//ios和安卓的只需要更新数据即可
if (GlobalConfig.deviceType == 1 || GlobalConfig.deviceType == 2) {
if (GlobalConfig.deviceType == GlobalConfig.deviceIOS || GlobalConfig.deviceType == GlobalConfig.deviceAndroid) {
loger.log("调用webRtc推流");
GlobalConfig.openCamera = EngineUtils.creatTimestamp();
GlobalConfig.openMicrophones = GlobalConfig.openCamera;
... ... @@ -3167,7 +3190,7 @@ export default class MessageEntrance extends Emiter {
* */
_unpublishMedia(_params) {
//ios和安卓的只需要更新数据即可
if (GlobalConfig.deviceType == 1 || GlobalConfig.deviceType == 2) {
if (GlobalConfig.deviceType == GlobalConfig.deviceIOS || GlobalConfig.deviceType == GlobalConfig.deviceAndroid) {
loger.log("调用webRtc停止推流");
GlobalConfig.openCamera = 0;
GlobalConfig.openMicrophones = 0;
... ... @@ -3193,7 +3216,7 @@ export default class MessageEntrance extends Emiter {
* 切换摄像头和麦克风设备
* */
_changeDevices(_params) {
if (GlobalConfig.deviceType == 1 || GlobalConfig.deviceType == 2) {
if (GlobalConfig.deviceType == GlobalConfig.deviceIOS || GlobalConfig.deviceType == GlobalConfig.deviceAndroid) {
return;
}
if (_webRtc) {
... ... @@ -3205,7 +3228,7 @@ export default class MessageEntrance extends Emiter {
* 设置旁路推流
* */
_setConfigPublisher(_params) {
if (GlobalConfig.deviceType == 1 || GlobalConfig.deviceType == 2) {
if (GlobalConfig.deviceType == GlobalConfig.deviceIOS || GlobalConfig.deviceType == GlobalConfig.deviceAndroid) {
return;
}
if (_webRtc) {
... ... @@ -3217,7 +3240,7 @@ export default class MessageEntrance extends Emiter {
* 设置本地video视图
* */
_setLocalMediaView(_params) {
if (GlobalConfig.deviceType == 1 || GlobalConfig.deviceType == 2) {
if (GlobalConfig.deviceType == GlobalConfig.deviceIOS || GlobalConfig.deviceType == GlobalConfig.deviceAndroid) {
return;
}
if (_webRtc) {
... ... @@ -3229,7 +3252,7 @@ export default class MessageEntrance extends Emiter {
* 设置房间内老师身份的视图
* */
_setHostRemoteMediaView(_params) {
if (GlobalConfig.deviceType == 1 || GlobalConfig.deviceType == 2) {
if (GlobalConfig.deviceType == GlobalConfig.deviceIOS || GlobalConfig.deviceType == GlobalConfig.deviceAndroid) {
return;
}
if (_webRtc) {
... ... @@ -3241,7 +3264,7 @@ export default class MessageEntrance extends Emiter {
* 设置房间内普通身份的视图
* */
_setNormalRemoteMediaView(_params) {
if (GlobalConfig.deviceType == 1 || GlobalConfig.deviceType == 2) {
if (GlobalConfig.deviceType == GlobalConfig.deviceIOS || GlobalConfig.deviceType == GlobalConfig.deviceAndroid) {
return;
}
if (_webRtc) {
... ... @@ -3257,7 +3280,7 @@ export default class MessageEntrance extends Emiter {
if (!_params) {
return;
}
if (GlobalConfig.deviceType == 1 || GlobalConfig.deviceType == 2) {
if (GlobalConfig.deviceType == GlobalConfig.deviceIOS || GlobalConfig.deviceType == GlobalConfig.deviceAndroid) {
return;
}
if (_webRtc) {
... ... @@ -3283,7 +3306,7 @@ export default class MessageEntrance extends Emiter {
* 设置监课和需要隐藏显示的用户视图
* */
_setInvisibleMediaView(_params) {
if (GlobalConfig.deviceType == 1 || GlobalConfig.deviceType == 2) {
if (GlobalConfig.deviceType == GlobalConfig.deviceIOS || GlobalConfig.deviceType == GlobalConfig.deviceAndroid) {
return;
}
if (_webRtc) {
... ...
... ... @@ -15,18 +15,20 @@
import Emiter from 'Emiter';
import Loger from 'Loger';
import GlobalConfig from 'GlobalConfig';
import EngineUtils from 'EngineUtils';
import LogManager from 'LogManager';
let loger = Loger.getLoger('EverSocket');
const MCU_MAX_RECONNECTION = 3;//最多重连次数
class EverSocket extends Emiter {
constructor() {
super();
this.sendToMcuList=[];//发送到MCU的数据记录
this.receiveFromMcuList=[];//接到MCU的数据记录
this.mcuReconnectCounter=0;//(重要)记录mcu连续重连的次数,最大连续8次就不再重连
this._connected = false;
this._lastActiveTime = 0;//最后一次收到消息的时间
this._enableEverSocket = false;
this.reConnectionCounter = 0;//重连次数
}
begin(ip, port) {
... ... @@ -68,17 +70,25 @@ class EverSocket extends Emiter {
return this._connected;
}
send(data) {
send(data,type) {
if (this._connected) {
if (data) {
let len=data.byteLength;
//超过1024 警告提示
if (len> 1024) {
loger.warn('发送到MCU的数据文件超过1k-->byteLength->', len);
loger.warn('发送到MCU的数据文件超过1k-->byteLength->'+len,"type:"+type);
}
//大于10k 不发送
if (len>=1024*10) {
loger.warn('发送到MCU的数据文件超过10k-->byteLength->', len);
loger.warn('发送到MCU的数据文件超过10k-->byteLength->'+len,"type:"+type);
return;
}
this.sendToMcuList.push("c2s_"+EngineUtils.creatTimestampStr()+"_"+len+"_"+type);
if(this.sendToMcuList.length>80){
loger.log("发送到MCU数据统计->",this.sendToMcuList);
this.sendToMcuList=[];
}
}
this.websocket.send(data);
} else {
... ... @@ -206,8 +216,14 @@ class EverSocket extends Emiter {
_onMessage(messageEvent) {
this._lastActiveTime = Date.now();
const bufferData = messageEvent.data;
//loger.log('RECEIVE MESSAGE-->byteLength->',bufferData.byteLength);
if (bufferData.byteLength > 0) {
//loger.log('RECEIVE-->byteLength->',bufferData.byteLength);
let len=bufferData.byteLength;
this.receiveFromMcuList.push("s2c_"+EngineUtils.creatTimestampStr()+"_"+len);
if(this.receiveFromMcuList.length>80){
loger.log("收到MCU数据统计->",this.receiveFromMcuList);
this.receiveFromMcuList=[];
}
if (len> 0) {
this._emit(EverSocket.MESSAGE, bufferData);
}
}
... ...
... ... @@ -542,7 +542,13 @@ GlobalConfig.hasCamera = false; //摄像头是否可用
GlobalConfig.hasMicrophone = false; //麦克风是否可用
GlobalConfig.returnCitySN = null;//获取的ip数据 {"cip":"60.253.214.122","cid":"110000","cname":"北京市"}
GlobalConfig.deviceType = 0; //设备类型 0:电脑 1:ios 2:安卓
//设备类型 0:电脑 1:ios 2:安卓 3 h5
GlobalConfig.deviceType = 0;
GlobalConfig.devicePC=0;
GlobalConfig.deviceIOS=1;
GlobalConfig.deviceAndroid=2;
GlobalConfig.deviceH5=3;
GlobalConfig.userIp = ""; //用户当前IP
GlobalConfig.userId = 0;
GlobalConfig.paramUserId=0;
... ... @@ -588,7 +594,7 @@ GlobalConfig.topNodeID = 101; //现在固定值,还不知道是做什么用
GlobalConfig.siteId = ""; //站点号
GlobalConfig.className = ""; // 课程名称
GlobalConfig.classId = 0; //课堂号=classId=meetingNumber 之后统一修改为classId
GlobalConfig.classType = ApeConsts.CLASS_TYPE_1; //课堂类型
GlobalConfig.classType = ApeConsts.CLASS_TYPE_1v1; //课堂类型
GlobalConfig.classStatus = ApeConsts.CLASS_STATUS_WAIT; // 0;//课堂还未开始 1;//直播中 2 //课间休息 3已经停止
GlobalConfig.classStartTime = ""; //课堂点击开始时间
GlobalConfig.classStopTime = ""; //最后一次停止的时间(点暂停或结束),每次发送数据都获取当前时间戳
... ...
... ... @@ -29,9 +29,9 @@ ApeConsts.STOP_ALL_PUBLISH=5; //所有人停止推流
ApeConsts.CLASS_ACTION_DRAW_STATUS_CHANGE = 6; //更改用户的画笔状态
//课堂类型 1:1v1(2路流) 2:直播(1路流) 3:小班课(可以多路流)
ApeConsts.CLASS_TYPE_1 = 1; // 互动课堂,通过MS转发音视频,不能进行H5观看 1v1(2路流)
ApeConsts.CLASS_TYPE_2 = 2; // 直播课堂,通过CDN转发音视频,不能进行音视频互动 :直播(1路流)
ApeConsts.CLASS_TYPE_3 = 3; // 小班课,通过CDN转发音视频,不能进行音视频互动 ::小班课(可以多路流)
ApeConsts.CLASS_TYPE_1v1 = 1; // 互动课堂,通过MS转发音视频,不能进行H5观看 1v1(2路流)
ApeConsts.CLASS_TYPE_ZHIBO = 2; // 直播课堂,通过CDN转发音视频,不能进行音视频互动 :直播(1路流)
ApeConsts.CLASS_TYPE_XIAOBAN = 3; // 小班课,通过CDN转发音视频,不能进行音视频互动 ::小班课(可以多路流)
//角色身份
//ApeConsts.NR_GUEST = 0; // 客人
... ...
... ... @@ -410,7 +410,7 @@ class AudioApe extends Ape {
receiveChannelInfo.mediaType = unpackChannelInfo.mediaType || ApeConsts.MEDIA_TYPE_DEFAULT;
receiveChannelInfo.screenWidth = unpackChannelInfo.screenWidth || GlobalConfig.screenWidth;
receiveChannelInfo.screenHeight = unpackChannelInfo.screenHeight || GlobalConfig.screenHeight;
receiveChannelInfo.deviceType = unpackChannelInfo.deviceType || 0;
receiveChannelInfo.deviceType = unpackChannelInfo.deviceType || GlobalConfig.devicePC;
receiveChannelInfo.optionJsonData = unpackChannelInfo.optionJsonData || "";
//消息不是自己同步的,需要处理
... ...
... ... @@ -23,7 +23,7 @@ class ConferApe extends Ape {
ApeConsts.CONFERENCE_SESSION_NAME,
ApeConsts.CONFERENCE_SESSION_TAG
);
this.isLeave=false;//记录自己是否已经离开
this.rosters = {}; //用户列表
this.rosterLen = 0;//当前课堂人数
this.timerCounter = new TimerCounter(); //计时器
... ... @@ -160,7 +160,7 @@ class ConferApe extends Ape {
//更新角色数据
updateUserInfo() {
if(GlobalConfig.classType==ApeConsts.CLASS_TYPE_2&&GlobalConfig.isH5==true){
if(GlobalConfig.classType==ApeConsts.CLASS_TYPE_ZHIBO&&GlobalConfig.isH5==true){
//直播模式下H5不处理更新信息
console.log("直播模式下H5不处理用户更新信息");
return;
... ... @@ -207,7 +207,7 @@ class ConferApe extends Ape {
}
return;
}
if(GlobalConfig.classType==ApeConsts.CLASS_TYPE_2&&GlobalConfig.isH5){
if(GlobalConfig.classType==ApeConsts.CLASS_TYPE_ZHIBO&&GlobalConfig.isH5){
loger.warn("直播模式H5不能发送课堂控制消息");
return;
}
... ... @@ -308,7 +308,7 @@ class ConferApe extends Ape {
checkHasRecordControl() {
//loger.warn('检测是否有控制录制操作的权限', "isHost", GlobalConfig.isHost, "recordStatus", GlobalConfig.recordStatus,"当前人数:"+this.rosterLen);
//1.如果自己是老师或者当前课堂只有一个人
if (GlobalConfig.isHost || (this.rosterLen <= 1&&GlobalConfig.deviceType!=3)) {
if (GlobalConfig.isHost || (this.rosterLen <= 1&&GlobalConfig.deviceType!=GlobalConfig.deviceH5)) {
return true;
}
//2.如果自己不是老师,需要判断当前课堂内是否有老师,如果有老师就不做操作
... ... @@ -1022,7 +1022,7 @@ class ConferApe extends Ape {
this.rosterLen = Object.keys(this.rosters).length;
GlobalConfig.rosterNumber = this.rosterLen;//记录当前的总人数
newNodeData.rosterLen = this.rosterLen;
if(GlobalConfig.classType!= ApeConsts.CLASS_TYPE_2){
if(GlobalConfig.classType!= ApeConsts.CLASS_TYPE_ZHIBO){
loger.log("人员加入->", newNodeData);
}
... ... @@ -1034,7 +1034,7 @@ class ConferApe extends Ape {
GlobalConfig.rosterNumber = this.rosterLen;//记录当前的总人数
newNodeData.rosterLen = this.rosterLen;
if (nodeId != GlobalConfig.nodeId) {
if(GlobalConfig.classType!= ApeConsts.CLASS_TYPE_2){
if(GlobalConfig.classType!= ApeConsts.CLASS_TYPE_ZHIBO){
loger.log("人员更新信息->", newNodeData);
}
}
... ... @@ -1065,7 +1065,7 @@ class ConferApe extends Ape {
// 因为会出现先收到视频消息后收到人员加入和更新的消息
if(this.rosters[_param.fromNodeId] == null&&this.rosterLen>0){
//H5不做释放处理
if(GlobalConfig.deviceType==3){
if(GlobalConfig.deviceType==GlobalConfig.deviceH5){
loger.warn("H5不做媒体模块的频道释放->当前总人数->"+this.rosterLen, _param);
return ;
}
... ... @@ -1084,8 +1084,9 @@ class ConferApe extends Ape {
//删除用户
rosterDelHandler(nodeId) {
if (GlobalConfig.nodeId == nodeId) {
if(GlobalConfig.classExit==false){
loger.log("自己离开课堂");
if(GlobalConfig.classExit==false||this.isLeave==false){
this.isLeave=true;
loger.log("自己离开课堂","classExit:"+GlobalConfig.classExit);
// 自己退出
this._emit(MessageTypes.CLASS_RUN_EXIT, {'type': 0});
}
... ... @@ -1094,7 +1095,7 @@ class ConferApe extends Ape {
} else {
let user = this.rosters[nodeId];
if (user) {
if(GlobalConfig.classType!= ApeConsts.CLASS_TYPE_2){
if(GlobalConfig.classType!= ApeConsts.CLASS_TYPE_ZHIBO){
loger.log(nodeId, "->离开课堂->身份->", user.userRole);
}
... ... @@ -1204,6 +1205,7 @@ class ConferApe extends Ape {
this.rosterLen = 0;
GlobalConfig.rosterNumber = this.rosterLen;
GlobalConfig.rosters = this.rosters;
this.isLeave=true;
}
}
... ...
... ... @@ -20,7 +20,7 @@ class VideoApe extends Ape {
ApeConsts.VIDEO_SESSION_NAME,
ApeConsts.VIDEO_SESSION_TAG
);
this.isLeave=false;
this.mediaModule = new MediaModule();
this.mediaModule.MEDIA_OBJ_TABLE_ID = ApeConsts.VIDEO_OBJ_TABLE_ID;
this.mediaModule.mediaChannels = {};
... ... @@ -37,7 +37,6 @@ class VideoApe extends Ape {
// Ape Models
this.registerKey(this._session_id, this._session_name, this._session_tag, new ArrayBuffer);
this.registerObj(pdu.RCPDU_REG_REGISTER_TABLE, ApeConsts.VIDEO_OBJ_TABLE_ID, ApeConsts.VIDEO_OBJ_TABLE_NAME, ApeConsts.VIDEO_OBJ_TABLE_TAG, 0, new ArrayBuffer);
// videoApe 监听视频控制消息,用户之间的消息传递
this.on(pdu.RCPDU_SEND_VIDEO_DATA_REQUEST, this.receiveVideoCommandHandler.bind(this));
}
... ... @@ -425,7 +424,7 @@ class VideoApe extends Ape {
this.sendTableUpdateHandler(channelInfo);
//递归检查,800毫秒之后执行
clearTimeout(this.releaseTimeId);
if(GlobalConfig.classType==ApeConsts.CLASS_TYPE_2&&GlobalConfig.isH5){
if(GlobalConfig.classType==ApeConsts.CLASS_TYPE_ZHIBO&&GlobalConfig.isH5){
return;
}
this.releaseTimeId = setTimeout(function () {
... ... @@ -498,6 +497,11 @@ class VideoApe extends Ape {
//发送到mcu同步(更新数据)
sendTableUpdateHandler(_channelInfo) {
//loger.log("video===sendTableUpdateHandler ");
if(GlobalConfig.classExit||this.isLeave){
//已经离开课堂就不再做处理
return;
}
let updateModelPdu = this.packPdu(_channelInfo, _channelInfo.channelId);//let updateModelPdu=this.packPdu({},ApeConsts.VIDEO_OBJ_TABLE_ID+2);
if (updateModelPdu == null) {
... ... @@ -662,7 +666,7 @@ class VideoApe extends Ape {
receiveChannelInfo.mediaType = unpackChannelInfo.mediaType || ApeConsts.MEDIA_TYPE_DEFAULT;
receiveChannelInfo.screenWidth = unpackChannelInfo.screenWidth || GlobalConfig.screenWidth;
receiveChannelInfo.screenHeight = unpackChannelInfo.screenHeight || GlobalConfig.screenHeight;
receiveChannelInfo.deviceType = unpackChannelInfo.deviceType || 0;
receiveChannelInfo.deviceType = unpackChannelInfo.deviceType || GlobalConfig.devicePC;
receiveChannelInfo.optionJsonData = unpackChannelInfo.optionJsonData || "";
//消息不是自己同步的,需要处理
if (unpackChannelInfo.status == ApeConsts.CHANNEL_STATUS_OPENING) {
... ... @@ -782,7 +786,7 @@ class VideoApe extends Ape {
mediaChannelInfo.mediaType = _param.mediaType || ApeConsts.MEDIA_TYPE_DEFAULT;
mediaChannelInfo.screenWidth = _param.screenWidth || GlobalConfig.screenWidth;
mediaChannelInfo.screenHeight = _param.screenHeight || GlobalConfig.screenHeight;
mediaChannelInfo.deviceType = _param.deviceType || 0;
mediaChannelInfo.deviceType = _param.deviceType || GlobalConfig.devicePC;
mediaChannelInfo.optionJsonData = _param.optionJsonData || "";
mediaChannelInfo.m3u8Url = "";
mediaChannelInfo.rtmpUrl = "";
... ... @@ -884,6 +888,9 @@ class VideoApe extends Ape {
}
return null;
}
stopApe(){
this.isLeave=true;
}
}
export default VideoApe;
... ...
... ... @@ -245,7 +245,7 @@ class WebRtcApe extends Emiter {
$("#"+this.xdyRemote + uid).remove();
}
}
if (user && (user.deviceType == 1 || user.deviceType == 2)) {
if (user && (user.deviceType == GlobalConfig.deviceIOS || user.deviceType == GlobalConfig.deviceAndroid)) {
this.remoteVideoList[user.nodeId] = stream;
}
}
... ...
... ... @@ -105,7 +105,7 @@ class MCU extends Emiter {
pduMsg.set("deviceType", "" + GlobalConfig.deviceType);
pduMsg.set("data", joinRequestPdu.toArrayBuffer());
this._everSocket.send(pduMsg.toArrayBuffer());
this._everSocket.send(pduMsg.toArrayBuffer(),joinRequestPdu.type);
}
// EverSocket底层消息处理
... ... @@ -197,7 +197,7 @@ class MCU extends Emiter {
send(msg) {
if (this.connected) {
// loger.log('发送数据到服务端-------------------->');
this._everSocket.send(msg.toArrayBuffer());
this._everSocket.send(msg.toArrayBuffer(),msg.type);
} else {
loger.warn('发送数据到服务端-------------------->失败->未连接到服务端');
this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_SOCKET_DISCONNECT);
... ... @@ -209,7 +209,9 @@ class MCU extends Emiter {
loger.log('leaveMCU');
GlobalConfig.setCurrentStatus(GlobalConfig.statusCode_3);
GlobalConfig.classJoinSuccess = false;
this._everSocket.end();
if( this._everSocket){
this._everSocket.end();
}
}
// 主动建立MCU连接
... ... @@ -223,9 +225,15 @@ class MCU extends Emiter {
loger.log(_classInfo);
_classInfo.classId = parseInt(_classInfo.classId); // classId 必须整形
this.classInfo = _classInfo;
// 创建刷新nodeId
this.classInfo.nodeId = EngineUtils.creatSoleNumberFromTimestamp();
let randNodeId =parseInt(Math.random()*1000)+""+parseInt(Math.random()*1000)+""+parseInt(Math.random()*1000);
//生成的字符串nodeId转换为数字
randNodeId=parseInt(randNodeId);
this.classInfo.nodeId =randNodeId; //EngineUtils.creatSoleNumberFromTimestamp();
GlobalConfig.nodeId = this.classInfo.nodeId; //这是标识自己身份的id
console.log("创建nodeId",GlobalConfig.nodeId);
let nodeInfoRecordPdu = new pdu['RCNodeInfoRecordPdu'];
nodeInfoRecordPdu.name = this.classInfo.userName;
... ...