李勇

1.会议模块增加消息广播,控制当前会议中的用户状态

2.获取加入会议信息的Sass接口joinParams.do返回的passwordRequired(只判断了学生的),老师的按true处理,但是在MD5验证的时候,这个passwordRequired必须用joinParams.do返回时的值
... ... @@ -47,13 +47,13 @@ export default class MessageEntrance extends Emiter {
constructor() {
super();
//sdk 信息
this.sdkInfo=_sdkInfo;
this.sdkInfo = _sdkInfo;
loger.log(this.sdkInfo);
//初始化状态
GlobalConfig.setCurrentStatus(GlobalConfig.statusCode_0);
this.on(MessageTypes.MCU_ERROR,this._mcuErrorHandler.bind(this));
this.on(MessageTypes.MCU_ERROR, this._mcuErrorHandler.bind(this));
//this.on(MessageTypes.DOC_SHOW, this.docShowHandler.bind(this));
... ... @@ -63,9 +63,9 @@ export default class MessageEntrance extends Emiter {
_sass.on(_sass.SUCCESS, this._sassJoinSuccessHandler.bind(this));//通过SASS平台验证(密码和MD5)
_sass.on(_sass.CLASS_INIT_SUCCESS, this._sassInitSuccessHandler.bind(this));//获取会议初始化信息
_sass.on(_sass.CLASS_GET_CLASS_DETAIL, this._sassGetClassDetailSuccessHandler.bind(this));//获取会议的基本信息
_sass.on(_sass.CLASS_GET_CLASS_PARAM,this._sassGetClassParamSuccessHandler.bind(this));//获取会议的最全信息和历史保存的数据
_sass.on(_sass.CLASS_SAVE_STATUS_INFO_SUCCESS,this._sassSaveClassStatusInfoSuccessHandler.bind(this));//保存会议状态信息
_sass.on(_sass.DELETE_DOCUMENT_SUCCESS,this._sassDeleteDocumentSuccess.bind(this));//sass删除文档成功
_sass.on(_sass.CLASS_GET_CLASS_PARAM, this._sassGetClassParamSuccessHandler.bind(this));//获取会议的最全信息和历史保存的数据
_sass.on(_sass.CLASS_SAVE_STATUS_INFO_SUCCESS, this._sassSaveClassStatusInfoSuccessHandler.bind(this));//保存会议状态信息
_sass.on(_sass.DELETE_DOCUMENT_SUCCESS, this._sassDeleteDocumentSuccess.bind(this));//sass删除文档成功
// 底层MCU消息层
_mcu = Mcu;
... ... @@ -77,6 +77,7 @@ export default class MessageEntrance extends Emiter {
_confer_ape = new ConferApe();
_confer_ape.on('*', (type, data) => this._emit(type, data));
_confer_ape.on(MessageTypes.CLASS_CLOSE, this._doClassClose.bind(this));//会议关闭,所有人都退出
_confer_ape.on(MessageTypes.CLASS_EXIT, this._doClassExit.bind(this));//监听自己的关闭事件
_confer_ape.on(MessageTypes.CLASS_STATUS_INFO_CHANGE, this._onClassStatusInfoChange.bind(this));//当前会议状态信息发生改变
_chat_ape = new ChatApe();
... ... @@ -89,7 +90,7 @@ export default class MessageEntrance extends Emiter {
_doc_ape.on('*', (type, data) => this._emit(type, data));
_doc_ape.on(MessageTypes.DOC_UPDATE, this.docUpdateHandler.bind(this));
_doc_ape.on(MessageTypes.DOC_DELETE, this.docDeleteHandler.bind(this));
_doc_ape.on( DocApe.DOC_JOIN_CHANNEL_SUCCESS,this.docJoinChannelSuccess.bind(this));
_doc_ape.on(DocApe.DOC_JOIN_CHANNEL_SUCCESS, this.docJoinChannelSuccess.bind(this));
_whiteboard_ape = new WhiteBoardApe();
... ... @@ -99,122 +100,129 @@ export default class MessageEntrance extends Emiter {
//公开外部调用的方法
//class
this.init=this._init;
this.joinClass=this._joinClass;
this.leaveClass=this._leaveClass;
this.getMcuClientStatus=this._getMcuClientStatus;
this.getClassDetail=this._getClassDetail;
this.sendStartClass=this._sendStartClass;
this.sendPauseClass=this._sendPauseClass;
this.sendCloseClass=this._sendCloseClass;
this.init = this._init;
this.joinClass = this._joinClass;
this.leaveClass = this._leaveClass;
this.getMcuClientStatus = this._getMcuClientStatus;
this.getClassDetail = this._getClassDetail;
this.sendStartClass = this._sendStartClass;
this.sendPauseClass = this._sendPauseClass;
this.sendCloseClass = this._sendCloseClass;
//chatApe
this.sendChatMsg=this._sendChatMsg;
this.sendChatMsg = this._sendChatMsg;
//videoApe
this.getPlayVideoPath=this._getPlayVideoPath;
this.getPublishVideoPath=this._getPublishVideoPath;
this.publishVideo=this._publishVideo;
this.stopPublishVideo=this._stopPublishVideo;
this.getPlayVideoPath = this._getPlayVideoPath;
this.getPublishVideoPath = this._getPublishVideoPath;
this.publishVideo = this._publishVideo;
this.stopPublishVideo = this._stopPublishVideo;
//whiteBoradApe
this.sendInsertAnnotaion=this._sendInsertAnnotaion;
this.sendInsertAnnotaion = this._sendInsertAnnotaion;
//this.sendDeleteAnnotaion=this._sendDeleteAnnotaion;
this.sendDeleteAllAnnotation=this._sendDeleteAllAnnotation;
this.sendDeleteCurPageAnnotation=this._sendDeleteCurPageAnnotation;
this.sendGotoPrev=this._sendGotoPrev;
this.sendDeleteAllAnnotation = this._sendDeleteAllAnnotation;
this.sendDeleteCurPageAnnotation = this._sendDeleteCurPageAnnotation;
this.sendGotoPrev = this._sendGotoPrev;
//DocApe
this.sendDocumentUpload= this._sendDocumentUpload;//上传文档
this.sendDocumentSwitchDoc= this._sendDocumentSwitchDoc; //切换文档
this.sendDocumentSwitchPage= this._sendDocumentSwitchPage;//翻页
this.sendDocumentDelete= this. _sassDeleteDocument;//删除文档,先通过Sass删除,sass删除成功之后再同步mcu
this.sendDocumentUpload = this._sendDocumentUpload;//上传文档
this.sendDocumentSwitchDoc = this._sendDocumentSwitchDoc; //切换文档
this.sendDocumentSwitchPage = this._sendDocumentSwitchPage;//翻页
this.sendDocumentDelete = this._sassDeleteDocument;//删除文档,先通过Sass删除,sass删除成功之后再同步mcu
//this.sendDocumentDeleteAll= this._documentDeleteAll;//删除所有文档
this.sendDocumentCommand= this._sendDocumentCommand;//操作文档(翻页、缩放、滚动...)
this.sendDocumentCommand = this._sendDocumentCommand;//操作文档(翻页、缩放、滚动...)
}
//mcu异常监听
_mcuErrorHandler(_data,_option){
if(_mcuErrorCallBackFun){
let option=_option||"";
let errorMessage={"code":_data,"reson":MessageTypes.ErrorReson[_data]+" "+option};
loger.error("MCU_ERROR",errorMessage);
_mcuErrorHandler(_data, _option) {
if (_mcuErrorCallBackFun) {
let option = _option || "";
let errorMessage = {"code": _data, "reson": MessageTypes.ErrorReson[_data] + " " + option};
loger.error("MCU_ERROR", errorMessage);
_mcuErrorCallBackFun(errorMessage);
}
}
//获取当前的状态
_getMcuClientStatus(){
_getMcuClientStatus() {
return GlobalConfig.getCurrentStatus();
}
//获取会议信息
_getClassDetail(){
_getClassDetail() {
return GlobalConfig.getClassDetail();
}
//关闭会议,所有人都退出
_doClassClose(_param){
_doClassClose(_param) {
this._leaveClass();
}
//离开会议,断开连接
_doClassExit() {
this._leaveClass();
}
//当前的会议状态信息发生改变,需要保存会议状态到Sass
_onClassStatusInfoChange(_param){
_onClassStatusInfoChange(_param) {
this._sassSaveClassStatusInfo();
}
//Sass
//初始化
_init(_param,_onSuccess,_mcuErrorCallBack){
_initSuccessCallBackFun=_onSuccess;
_mcuErrorCallBackFun=_mcuErrorCallBack;
_init(_param, _onSuccess, _mcuErrorCallBack) {
_initSuccessCallBackFun = _onSuccess;
_mcuErrorCallBackFun = _mcuErrorCallBack;
//{"classId":"1653304953","portal":"112.126.80.182:80","userRole":"normal","userId":0}
//判断传入的参数是否存在
if(_param==null||EngineUtils.isEmptyObject(_param)||_onSuccess==null||_mcuErrorCallBack==null){
if (_param == null || EngineUtils.isEmptyObject(_param) || _onSuccess == null || _mcuErrorCallBack == null) {
loger.error('init初始化失败,参数错误');
this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_CLASS_INIT_PARAM);
return ;
this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_CLASS_INIT_PARAM);
return;
}
//判断必要的参数字段值
if(_param.classId==null||isNaN(_param.classId)||_param.portal==null||_param.portal==""){
loger.error('init初始化失败',_param);
this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_CLASS_INIT_PARAM);
return ;
if (_param.classId == null || isNaN(_param.classId) || _param.portal == null || _param.portal == "") {
loger.error('init初始化失败', _param);
this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_CLASS_INIT_PARAM);
return;
}
loger.log('init',_param);
loger.log('init', _param);
//保存参数
GlobalConfig.classId=_param.classId;
GlobalConfig.portal=_param.portal;
GlobalConfig.userRole=_param.userRole||ApeConsts.normal;
GlobalConfig.userId=_param.userId||"0";
GlobalConfig.classId = parseInt(_param.classId);
GlobalConfig.portal = _param.portal;
GlobalConfig.userRole = _param.userRole || ApeConsts.normal;
GlobalConfig.userId = _param.userId || "0";
//获取课堂校验信息
if(_sass){
if (_sass) {
_sass.getJoinParams(GlobalConfig.getClassInfo());
}
}
//外部请求加入会议
_joinClass(_param,_onSuccess){
_joinClassSuccessCallBackFun=_onSuccess;
_joinClass(_param, _onSuccess) {
_joinClassSuccessCallBackFun = _onSuccess;
//{"userName":"名字","password":""}
if(_param==null||EngineUtils.isEmptyObject(_param)||_onSuccess==null){
this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_CLASS_JOIN_PARAM);
loger.log('不能进入会议,传递的参数不对.',_param);
return ;
if (_param == null || EngineUtils.isEmptyObject(_param) || _onSuccess == null) {
this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_CLASS_JOIN_PARAM);
loger.log('不能进入会议,传递的参数不对.', _param);
return;
}
//判断userName
if(_param.userName==null||_param.userName==""){
if (_param.userName == null || _param.userName == "") {
loger.log('不能进入会议,传递的参数不对.名字不能为空');
this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_CLASS_JOIN_PARAM);
return ;
this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_CLASS_JOIN_PARAM);
return;
}
GlobalConfig.userName=_param.userName;
GlobalConfig.password=_param.password||"";
GlobalConfig.userName = _param.userName;
GlobalConfig.password = _param.password || "";
//开始校验
if(_sass){
if (_sass) {
_sass.passwordAndMd5Checking(GlobalConfig.getClassInfo());
}
}
... ... @@ -223,31 +231,40 @@ export default class MessageEntrance extends Emiter {
_sassInitSuccessHandler(_data) {
//{"siteId":"h5test","passwordRequired":true,"md5":"de399d5540b3da2fbc1eb0a770d4fd66","code":0,"msType":1}
//储存数据
GlobalConfig.md5=_data.md5||"";//这个暂时用假数据,后台接口写完就有数据了
GlobalConfig.msType=_data.msType||1;
GlobalConfig.siteId=_data.siteId||"";
GlobalConfig.classType=_data.meetingType||0;
//host默认需要密码,Sass服务器只判断学生是否需要密码,没有判断老师的
if(GlobalConfig.userRole=="host"){
GlobalConfig.passwordRequired=true;
}else {
GlobalConfig.passwordRequired=_data.passwordRequired||false;
GlobalConfig.md5 = _data.md5 || "";//这个暂时用假数据,后台接口写完就有数据了
GlobalConfig.msType = _data.msType || 1;
GlobalConfig.siteId = _data.siteId || "";
GlobalConfig.classType = _data.meetingType || 0;
/*//host默认需要密码,Sass服务器只判断学生是否需要密码,没有判断老师的
if (GlobalConfig.userRole == "host") {
GlobalConfig.passwordRequired = true;
} else {
GlobalConfig.passwordRequired = _data.passwordRequired || false;
}
*/
GlobalConfig.passwordRequired = _data.passwordRequired || false;//md5验证的时候需要Sass返回的值,不能更改
loger.log('SASS平台获取入会验证信息成功.');
//设置当前的会议状态
GlobalConfig.setCurrentStatus(GlobalConfig.statusCode_1);
if(_initSuccessCallBackFun){
if (_initSuccessCallBackFun) {
//返回给客户端初始化成功的数据
let initSuccessCallBackData={};
initSuccessCallBackData.siteId=GlobalConfig.siteId;
initSuccessCallBackData.classId=GlobalConfig.classId;
initSuccessCallBackData.userRole=GlobalConfig.userRole;
initSuccessCallBackData.userId=GlobalConfig.userId;
initSuccessCallBackData.passwordRequired=GlobalConfig.passwordRequired;
initSuccessCallBackData.classType=GlobalConfig.classType;
let initSuccessCallBackData = {};
initSuccessCallBackData.siteId = GlobalConfig.siteId;
initSuccessCallBackData.classId = GlobalConfig.classId;
initSuccessCallBackData.userRole = GlobalConfig.userRole;
initSuccessCallBackData.userId = GlobalConfig.userId;
initSuccessCallBackData.classType = GlobalConfig.classType;
//host默认需要密码,Sass服务器只判断学生是否需要密码,没有判断老师的
if (GlobalConfig.userRole == ApeConsts.host) {
initSuccessCallBackData.passwordRequired =true;
} else {
initSuccessCallBackData.passwordRequired = GlobalConfig.passwordRequired;
}
_initSuccessCallBackFun(initSuccessCallBackData);
}
... ... @@ -256,30 +273,30 @@ export default class MessageEntrance extends Emiter {
// 通过SASS平台验证
_sassJoinSuccessHandler(_data) {
//返回值
/* flag 数值型 无 True:成功
Flag:失败
h5_mcu_list 字符串 H5muc列表
maxVideoChannels 数值型 最大视频路数
maxAudioChannels 数值型 最大音频路数
h5Module 数值型 H5开关
ms 字符串 Ms列表
mcu 字符串 Mcu列表
rs 字符串 Rs列表
doc 字符串 Doc列表*/
/* {
"record": "112.126.80.182:80",
"flag": "true",
"h5Module": 1,
"maxVideoChannels": 1,
"mcu": "123.56.73.119:7000;123.56.69.230:7000;112.126.80.182:7000",
"ms": "pubms.3mang.com:1935",
"doc": "101.200.150.192:80",
"rs": "pubms.3mang.com:1935",
"type": 1,
"maxAudioChannels": 1,
"h5_mcu_list": "123.56.73.119:7001;123.56.69.230:7001;112.126.80.182:7001"
}*/
/* flag 数值型 无 True:成功
Flag:失败
h5_mcu_list 字符串 H5muc列表
maxVideoChannels 数值型 最大视频路数
maxAudioChannels 数值型 最大音频路数
h5Module 数值型 H5开关
ms 字符串 Ms列表
mcu 字符串 Mcu列表
rs 字符串 Rs列表
doc 字符串 Doc列表*/
/* {
"record": "112.126.80.182:80",
"flag": "true",
"h5Module": 1,
"maxVideoChannels": 1,
"mcu": "123.56.73.119:7000;123.56.69.230:7000;112.126.80.182:7000",
"ms": "pubms.3mang.com:1935",
"doc": "101.200.150.192:80",
"rs": "pubms.3mang.com:1935",
"type": 1,
"maxAudioChannels": 1,
"h5_mcu_list": "123.56.73.119:7001;123.56.69.230:7001;112.126.80.182:7001"
}*/
if (_data.h5_mcu_list) {
//MCU地址默认使用第一个
let server = _data.h5_mcu_list.split(";")[0];
... ... @@ -287,24 +304,24 @@ export default class MessageEntrance extends Emiter {
GlobalConfig.MCUServerPort = server.split(":")[1];
}
GlobalConfig.doc=_data.doc;
GlobalConfig.h5_mcu_list=_data.h5_mcu_list;
GlobalConfig.h5Module=_data.h5Module;
GlobalConfig.mcu=_data.mcu;
GlobalConfig.ms=_data.ms;
GlobalConfig.record=_data.record;
GlobalConfig.rs=_data.rs;
GlobalConfig.maxVideoChannels=_data.maxVideoChannels;
GlobalConfig.maxAudioChannels=_data.maxAudioChannels;
GlobalConfig.maxMediaChannels= _data.maxVideoChannels + _data.maxAudioChannels;
GlobalConfig.doc = _data.doc;
GlobalConfig.h5_mcu_list = _data.h5_mcu_list;
GlobalConfig.h5Module = _data.h5Module;
GlobalConfig.mcu = _data.mcu;
GlobalConfig.ms = _data.ms;
GlobalConfig.record = _data.record;
GlobalConfig.rs = _data.rs;
GlobalConfig.maxVideoChannels = _data.maxVideoChannels;
GlobalConfig.maxAudioChannels = _data.maxAudioChannels;
GlobalConfig.maxMediaChannels = _data.maxVideoChannels + _data.maxAudioChannels;
if(_sass){
if (_sass) {
_sass.getClassDetail();//会议基本信息
}
}
//获取会议所有参数 getClassH5
_sassGetClassDetailSuccessHandler(_data){
_sassGetClassDetailSuccessHandler(_data) {
loger.log('获取getClassDetail完成.');
/* {
"cycle": 0,
... ... @@ -327,24 +344,24 @@ export default class MessageEntrance extends Emiter {
"repeatmonthweekday": 0,
"endcount": 1
}*/
GlobalConfig.classDetail=_data;
GlobalConfig.className=_data.meetingName||"";
GlobalConfig.classBeginTime=_data.beginTime||"";
GlobalConfig.classEndTime=_data.endTime||"";
GlobalConfig.classDetail = _data;
GlobalConfig.className = _data.meetingName || "";
GlobalConfig.classBeginTime = _data.beginTime || "";
GlobalConfig.classEndTime = _data.endTime || "";
//获取会议所有信息和以前保存的会议状态信息
if(_sass){
if (_sass) {
_sass.getClassParam();
}
}
//获取会议所有参数 api/meeting/detail.do? flash中的接口文件是 getClassParam.do
_sassGetClassParamSuccessHandler(_data){
_sassGetClassParamSuccessHandler(_data) {
//console.log(GlobalConfig.classStatusInfo)
loger.log('获取api/meeting/detail.do完成.');
// console.log(_data);
// console.log(_data);
//包含整个会议最全的信息,储存数据
if(_data){
if (_data) {
GlobalConfig.setDocListPrepare(_data.docListPrepare); //提前上传的文档列表
GlobalConfig.setDocRecordList(_data.docRecordList);//
GlobalConfig.setDocList(_data.docList);//
... ... @@ -355,24 +372,24 @@ export default class MessageEntrance extends Emiter {
GlobalConfig.setRsList(_data.rsList);//
}
if(_data.currentInfo){
//根据从Sass获取的数据信息,同步最后一次保存的会议状态信息
if (_data.currentInfo) {
//根据从Sass获取的数据信息,同步最后一次保存的会议状态信息
loger.log("同步最后一次保存过的会议状态信息");
/*//解析BASE64的数据
loger.log("11111111111111111111111111111111");
console.log(GlobalConfig.classStatusInfo);
//已经保存过会议状态信息,读取之前的数据
let _classStatusInfo=EngineUtils.objectFromBase64(_data.currentInfo);
loger.log("classStatusInfo",_classStatusInfo);
GlobalConfig.classStatusInfo=_classStatusInfo;
loger.log("2222222222222222222222222");
console.log(GlobalConfig.classStatusInfo);*/
loger.log("11111111111111111111111111111111");
console.log(GlobalConfig.classStatusInfo);
//已经保存过会议状态信息,读取之前的数据
let _classStatusInfo=EngineUtils.objectFromBase64(_data.currentInfo);
loger.log("classStatusInfo",_classStatusInfo);
GlobalConfig.classStatusInfo=_classStatusInfo;
loger.log("2222222222222222222222222");
console.log(GlobalConfig.classStatusInfo);*/
//console.log(_data.currentInfo);
GlobalConfig.setClassStatusInfo(_data.currentInfo);
console.log(GlobalConfig.classStatusInfo)
}else {
} else {
loger.log("还没有保存过会议状信息");
}
... ... @@ -381,75 +398,82 @@ export default class MessageEntrance extends Emiter {
}
//保存会议状态信息
_sassSaveClassStatusInfo(){
if(GlobalConfig.isHost){
_sassSaveClassStatusInfo() {
if (GlobalConfig.isHost) {
//用get保存数据,数据内容需要转为BASE64
//let _classStatusInfo=EngineUtils.objectToBase64(GlobalConfig.classStatusInfo);
//loger.log("保存会议状态信息",_classStatusInfo);
//_sass.saveClassStatusInfo({"classStatusInfo":_classStatusInfo});//保存会议状态信息
//POST 保存数据
_sass.saveClassStatusInfo({"classStatusInfo":GlobalConfig.classStatusInfo});//保存会议状态信息
}else {
loger.log("没有保存会议状态信息的权限 isHost",GlobalConfig.isHost);
//只有加入会议之后才能保存数据
if (GlobalConfig.getCurrentStatus().code == GlobalConfig.statusCode_2.code) {
//POST 保存数据
_sass.saveClassStatusInfo({"classStatusInfo": GlobalConfig.classStatusInfo});//保存会议状态信息
} else {
loger.error("不能保存会议数据", GlobalConfig.getCurrentStatus());
}
} else {
loger.log("没有保存会议状态信息的权限 isHost", GlobalConfig.isHost);
}
}
//保存会态信息成功
_sassSaveClassStatusInfoSuccessHandler(_data){
loger.log('保存会议状态信息成功.',_data);
_sassSaveClassStatusInfoSuccessHandler(_data) {
loger.log('保存会议状态信息成功.', _data);
}
//Sass校验流程结束之后,开始加入MCU
_joinMCU(){
_joinMCU() {
loger.log('加入底层MCU会议.');
if(_mcu){
if (_mcu) {
_mcu.joinMCU(GlobalConfig.getClassInfo());
}
}
// MCU 会议成功
_joinClassSuccessHandler(_data) {
loger.log('MCU 会议成功.');
GlobalConfig.setCurrentStatus(GlobalConfig.statusCode_2);
//返回给客户数据
if(_joinClassSuccessCallBackFun){
if (_joinClassSuccessCallBackFun) {
//返回给客户端初始化成功的数据
let initSuccessCallBackData={};
let initSuccessCallBackData = {};
//GlobalConfig.MCUServerIP=_data.MCUServerIP;
// GlobalConfig.MCUServerPort=_data.MCUServerPort;
initSuccessCallBackData.doc=GlobalConfig.doc;//文档服务器地址
initSuccessCallBackData.classId=GlobalConfig.classId;
initSuccessCallBackData.className=GlobalConfig.className;
initSuccessCallBackData.h5Module=GlobalConfig.h5Module;
initSuccessCallBackData.isHost=GlobalConfig.isHost;
initSuccessCallBackData.maxAudioChannels=GlobalConfig.maxAudioChannels;
initSuccessCallBackData.maxVideoChannels=GlobalConfig.maxVideoChannels;
initSuccessCallBackData.maxMediaChannels=GlobalConfig.maxMediaChannels;
initSuccessCallBackData.mcuDelay=GlobalConfig.mcuDelay;
initSuccessCallBackData.msType=GlobalConfig.msType;
initSuccessCallBackData.nodeId=GlobalConfig.nodeId;
initSuccessCallBackData.password=GlobalConfig.password;
initSuccessCallBackData.passwordRequired=GlobalConfig.passwordRequired;// 老师的默认是true
initSuccessCallBackData.doc = GlobalConfig.doc;//文档服务器地址
initSuccessCallBackData.classId = GlobalConfig.classId;
initSuccessCallBackData.className = GlobalConfig.className;
initSuccessCallBackData.h5Module = GlobalConfig.h5Module;
initSuccessCallBackData.isHost = GlobalConfig.isHost;
initSuccessCallBackData.maxAudioChannels = GlobalConfig.maxAudioChannels;
initSuccessCallBackData.maxVideoChannels = GlobalConfig.maxVideoChannels;
initSuccessCallBackData.maxMediaChannels = GlobalConfig.maxMediaChannels;
initSuccessCallBackData.mcuDelay = GlobalConfig.mcuDelay;
initSuccessCallBackData.msType = GlobalConfig.msType;
initSuccessCallBackData.nodeId = GlobalConfig.nodeId;
initSuccessCallBackData.password = GlobalConfig.password;
initSuccessCallBackData.passwordRequired = GlobalConfig.passwordRequired;// 老师的默认是true
//GlobalConfig.passwordRequired 老师的默认是true
//GlobalConfig.portal=_data.portal;
initSuccessCallBackData.role=GlobalConfig.role;
initSuccessCallBackData.siteId=GlobalConfig.siteId;
initSuccessCallBackData.topNodeID=GlobalConfig.topNodeID;
initSuccessCallBackData.userId=GlobalConfig.userId;
initSuccessCallBackData.userName=GlobalConfig.userName;
initSuccessCallBackData.userRole=GlobalConfig.userRole;
initSuccessCallBackData.userType=GlobalConfig.userType;
initSuccessCallBackData.siteId=GlobalConfig.siteId;
initSuccessCallBackData.classId=GlobalConfig.classId;
initSuccessCallBackData.userRole=GlobalConfig.userRole;
initSuccessCallBackData.userId=GlobalConfig.userId;
initSuccessCallBackData.passwordRequired=GlobalConfig.passwordRequired;
initSuccessCallBackData.classType=GlobalConfig.classType||ApeConsts.CLASS_TYPE_INTERACT;
loger.log('加入会议成功',initSuccessCallBackData);
initSuccessCallBackData.role = GlobalConfig.role;
initSuccessCallBackData.siteId = GlobalConfig.siteId;
initSuccessCallBackData.topNodeID = GlobalConfig.topNodeID;
initSuccessCallBackData.userId = GlobalConfig.userId;
initSuccessCallBackData.userName = GlobalConfig.userName;
initSuccessCallBackData.userRole = GlobalConfig.userRole;
initSuccessCallBackData.userType = GlobalConfig.userType;
initSuccessCallBackData.siteId = GlobalConfig.siteId;
initSuccessCallBackData.classId = GlobalConfig.classId;
initSuccessCallBackData.userRole = GlobalConfig.userRole;
initSuccessCallBackData.userId = GlobalConfig.userId;
initSuccessCallBackData.passwordRequired = GlobalConfig.passwordRequired;
initSuccessCallBackData.classType = GlobalConfig.classType || ApeConsts.CLASS_TYPE_INTERACT;
loger.log('加入会议成功', initSuccessCallBackData);
_joinClassSuccessCallBackFun(initSuccessCallBackData);
}
... ... @@ -528,28 +552,29 @@ export default class MessageEntrance extends Emiter {
}
//Sass删除文档数据
_sassDeleteDocument(_param){
_sassDeleteDocument(_param) {
//判断传入的参数是否存在
if(_param==null||EngineUtils.isEmptyObject(_param)){
loger.error('sassDeleteDocument失败,参数错误',_param);
this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_DOC_DELETE_FAILED_PARAM);
return ;
if (_param == null || EngineUtils.isEmptyObject(_param)) {
loger.error('sassDeleteDocument失败,参数错误', _param);
this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_DOC_DELETE_FAILED_PARAM);
return;
}
//判断必要的参数字段值
if(_param.itemIdx==null||isNaN(_param.itemIdx)||_param.docId==null||_param.docId==""){
loger.error('sassDeleteDocument失败',_param);
this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_DOC_DELETE_FAILED_PARAM);
return ;
if (_param.itemIdx == null || isNaN(_param.itemIdx) || _param.docId == null || _param.docId == "") {
loger.error('sassDeleteDocument失败', _param);
this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_DOC_DELETE_FAILED_PARAM);
return;
}
loger.log('_sassDeleteDocument',_param);
loger.log('_sassDeleteDocument', _param);
if(_sass){
if (_sass) {
_sass.sassDeleteDocument(_param);
}
}
//Sass删除文档成功之后,同步删除MCU数据
_sassDeleteDocumentSuccess(_param){
loger.log('sassDeleteDocumentSuccess',_param);
_sassDeleteDocumentSuccess(_param) {
loger.log('sassDeleteDocumentSuccess', _param);
this._sendDocumentDelete(_param);
}
... ... @@ -724,7 +749,8 @@ export default class MessageEntrance extends Emiter {
//// 文档变更,白板也需要做处理
docUpdateHandler(_data) {
loger.log('Doc UpdateId ->',_data);
loger.log('Doc UpdateId ->');
console.log(_data);
if(_whiteboard_ape){
_whiteboard_ape.docUpdateHandler(_data);
}
... ...
... ... @@ -19,6 +19,10 @@ ApeConsts.CLASS_PAUSING = "class.pause";//暂停
ApeConsts.CLASS_PAUSING = "class.closed";//关闭
ApeConsts.CLASS_PAUSING = "class.update";//更新当前的状态信息
//课堂控制
ApeConsts.CLASS_ACTION_CLOSE_ALL=1;//所有人关闭会议
//课堂类型
ApeConsts.CLASS_TYPE_INTERACT= 1; // 互动课堂,通过MS转发音视频,不能进行H5观看
ApeConsts.CLASS_TYPE_LIVE= 2; // 直播课堂,通过CDN转发音视频,不能进行音视频互动
... ...
... ... @@ -61,7 +61,7 @@ class ChatApe extends Ape {
chatSendPdu.fromRole = this._classInfo.userRole;// classRole已经废弃
chatSendPdu.isPublic = true;
// if (!(chatSendPdu.isPublic || 0 === chatSendPdu.peer)) {
if (!chatSendPdu && 0!=chatSendPdu.peer) {
if (!chatSendPdu.isPublic && 0!=chatSendPdu.peer) {
//发送给制定的人
loger.log('发送私聊消息.');
this.send(chatSendPdu);
... ...
... ... @@ -11,6 +11,8 @@ import UTF8 from 'utf-8';
import Loger from 'Loger';
import GlobalConfig from 'GlobalConfig';
import EngineUtils from 'EngineUtils';
let loger = Loger.getLoger('ConferApe');
let itemIdx=0;//table插入新数据的计数id,目前用时间戳
let timerCounter;
... ... @@ -57,6 +59,7 @@ class ConferApe extends Ape {
this.on(pdu.RCPDU_SESSION_JOIN_RESPONSE, this._joinSessionHandler.bind(this));
this.on(pdu.RCPDU_CONFERENCE_SEND_DATA_REQUEST, this.conferMsgComingHandler.bind(this));//这个是会议消息类型,flash里在使用这里不再使用,各个模块的消息由模块自己来处理
}
... ... @@ -96,6 +99,48 @@ class ConferApe extends Ape {
this.sendUniform(adapterPdu, true);
}
sendConferMsg(_messageInfo) {
if(this._classInfo===null||EngineUtils.isEmptyObject(this._classInfo)){
loger.log('不能发送会议消息.McuClient还未初始化数据!');
if(GlobalConfig.getCurrentStatus().code==0||GlobalConfig.getCurrentStatus().code==1){
this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_APE_SEND_FAILED_NO_JOIN);
return;
}
return ;
}
// to, message
loger.log('发送会议消息.', _messageInfo);
/* message RCConferenceSendDataRequestPdu {
optional uint32 initiator = 1;
optional uint32 peer = 2;
required bool is_public = 3;
required bytes user_data = 4;
}
*/
let chatSendPdu = new pdu['RCConferenceSendDataRequestPdu'];
chatSendPdu.type = pdu.RCPDU_CONFERENCE_SEND_DATA_REQUEST;
chatSendPdu.initiator = this._classInfo.nodeId;//发起人
chatSendPdu.peer = parseInt(_messageInfo.to);//发送给谁,公聊的时候是0,私聊的时候是指定的用户id
chatSendPdu.userData = this._rCArrayBufferUtil.strToUint8Array("h5" + _messageInfo.message);
//chatSendPdu.userData =UTF8.setBytesFromString(_messageInfo.message);
chatSendPdu.isPublic = true;
chatSendPdu.actionType=_messageInfo.actionType;
// if (!(chatSendPdu.isPublic || 0 === chatSendPdu.peer)) {
if (!chatSendPdu.isPublic && 0!=chatSendPdu.peer) {
//发送给制定的人
loger.log('发送私聊会议消息.');
this.send(chatSendPdu);
} else {
//发送给所有人
loger.log('发送公聊会议消息.');
this.sendChatUniform(chatSendPdu);
}
}
//主动离开会议,发送通知到服务器
leaveClass(){
let nodeInfoRecordPdu = this.mcu.mcuClassInfo.self;
... ... @@ -132,6 +177,13 @@ class ConferApe extends Ape {
}
//还原课堂状态
restorClass(){
GlobalConfig.classStatus=ApeConsts.CLASS_STATUS_WAIT;
GlobalConfig.classStopTime=EngineUtils.creatTimestampStr();
this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE);
this.sendUpdaterClassStatusInfo({"actionType":0});
}
//开始上课
startClass(_param){
... ... @@ -145,7 +197,7 @@ class ConferApe extends Ape {
GlobalConfig.classStatus=ApeConsts.CLASS_STATUS_STARTED;
//_param.actionType=ACTION_TYPE_1;
this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE);
this.sendUpdaterClassStatusInfo(_param);
this.sendUpdaterClassStatusInfo({"actionType":1});
}
//暂停上课
pauseClass(_param){
... ... @@ -158,7 +210,7 @@ class ConferApe extends Ape {
GlobalConfig.classStopTime=EngineUtils.creatTimestampStr();
//_param.actionType=ACTION_TYPE_2;
this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE);
this.sendUpdaterClassStatusInfo(_param);
this.sendUpdaterClassStatusInfo({"actionType":2});
}
//关闭课堂
closeClass(_param){
... ... @@ -167,12 +219,8 @@ class ConferApe extends Ape {
return;
}
//把所有人都踢出课堂,然后把状态值还原为1
GlobalConfig.classStatus=ApeConsts.CLASS_STATUS_WAIT;//
GlobalConfig.classStopTime=EngineUtils.creatTimestampStr();
//_param.actionType=ACTION_TYPE_3;
this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE);
this.sendUpdaterClassStatusInfo(_param);
//把所有人都踢出课堂
this.sendConferMsg({"to":0,"message":"所有人退出会议","actionType":ApeConsts.CLASS_ACTION_CLOSE_ALL});
}
... ... @@ -302,13 +350,86 @@ class ConferApe extends Ape {
try {
let model=this.unPackPdu(owner, itemIdx,itemData);
loger.log('tableUpdateHandler',model);
//处理会议更新的信息
if(model&&model.classStatusInfo){
GlobalConfig.setClassStatusInfo(model.classStatusInfo);
}
switch(GlobalConfig.classStatus){
case ApeConsts.CLASS_STATUS_WAIT:
break;
case ApeConsts.CLASS_STATUS_STARTED:
break;
case ApeConsts.CLASS_STATUS_PAUSE:
break;
case ApeConsts.CLASS_STATUS_CLOSE:
break;
default:
break;
}
//_confer_ape.on(MessageTypes.CLASS_CLOSE, this._doClassClose.bind(this));//会议关闭,所有人都退出
/*{
"itemIdx": 720899,
"from": 161770995,
"owner": 161770995,
"actionType": null,
"classStatusInfo": {
"nodeId": 161770995,
"userId": "0",
"userName": "mcuTest1487161768",
"siteId": "h5test",
"classId": 1730033559,
"className": "mcuClient",
"classType": 1,
"classStatus": 0,
"classStartTime": "2017-2-15-20-30-11",
"classStopTime": "2017-2-15-20-30-28",
"classTimestamp": 0,
"classBeginTime": "2017-02-13 10:00:00",
"classEndTime": "2017-02-22 12:00:00",
"recordStatus": false,
"recordTimestamp": 0,
"recordFileName": "",
"recordDownloadUrl": "xxxxxxxxxxxxxxxxxxxxx",
"serverTimestamp": 161828290,
"activeDocId": 0,
"activeDocCurPage": 1
}
}*/
} catch (e) {
loger.warn('ConferApe table update got exception. itemIdx',itemIdx);
}
}
conferMsgComingHandler(_data) {
//flash RCConferenceSendDataRequestPdu
//loger.warn('conferMsgComingHandler needs to be handled.');
//const recordInfo = pdu['RCWhiteboardDataRequestPdu'].decode(pdu);
//loger.log("conferMsgComingHandler",recordInfo);
var chatReceivePdu = pdu['RCConferenceSendDataRequestPdu'].decode(_data);
var chatMsg = {};
chatMsg.fromNodeID = chatReceivePdu.initiator;
chatMsg.toNodeID = chatReceivePdu.peer;
chatMsg.message = this._rCArrayBufferUtil.uint8ArrayToStr(chatReceivePdu.userData, 2);
chatMsg.actionType=chatReceivePdu.actionType;
loger.log("conferMsgComingHandler",chatMsg);
switch (chatMsg.ctionType){
case ApeConsts.CLASS_ACTION_CLOSE_ALL:
loger.log(chatMsg.message);
//会议关闭,所有人都退出
this._emit(MessageTypes.CLASS_CLOSE);
break;
default:
break;
}
}
rosterInsertHandler(nodeId, nodeData) {
if(GlobalConfig.nodeId==nodeId){
loger.log("自己加入 rosterInsertHandler");
... ...
... ... @@ -188,7 +188,7 @@ class DocApe extends Ape {
}
//更新数据的字段
docDataModel.action=ApeConsts.DOC_ACTION_COMMAND;
docDataModel.scale=parseInt(paramInfo.scale)||100;//默认是100(百分比)
//docDataModel.scale=parseInt(paramInfo.scale)||100;//默认是100(百分比)
this.updaterDoc(docDataModel,docDataModel.itemIdx);
}
... ... @@ -234,14 +234,13 @@ class DocApe extends Ape {
//loger.log('tableInsertHandler---',itemData);
let itemDataInfo = this.unPackPdu(owner, itemIdx, itemData);
this.docList[itemIdx] = itemDataInfo;
loger.log('tableInsertHandler',itemDataInfo);
//this._emit(MessageTypes.DOC_UPLOAD,itemDataInfo);
if(itemDataInfo.visible=="true"||itemDataInfo.visible==true){
if(itemDataInfo.visible==="true"||itemDataInfo.visible===true){
GlobalConfig.activeDocId=itemDataInfo.itemIdx;//当前激活的文档ID
GlobalConfig.activeDocCurPage=itemDataInfo.curPageNo;//当前激活的文档的当前页
}
loger.log('tableInsertHandler 发送给客户端');
console.log(itemDataInfo);
this._emit(MessageTypes.DOC_UPDATE,itemDataInfo);//用添加和更新都统一DOC_UPDATE
}
... ... @@ -268,7 +267,7 @@ class DocApe extends Ape {
let itemDataInfo = this.unPackPdu(owner, itemIdx, itemData);
if(itemDataInfo!=null){
this.docList[itemIdx] = itemDataInfo;
loger.log('tableUpdateHandler',itemDataInfo);
/* switch (itemDataInfo.action){
case DOC_ACTION_SWITCH_DOC:
break;
... ... @@ -281,12 +280,14 @@ class DocApe extends Ape {
}*/
GlobalConfig.activeDocId=0;//默认id
GlobalConfig.activeDocCurPage=1;//默认页数
if(itemDataInfo.visible=="true"||itemDataInfo.visible==true){
if(itemDataInfo&&(itemDataInfo.visible==="true"||itemDataInfo.visible===true)){
GlobalConfig.activeDocId=itemDataInfo.itemIdx;//当前激活的文档ID
GlobalConfig.activeDocCurPage=itemDataInfo.curPageNo;//当前激活的文档的当前页
}
loger.log('tableUpdateHandler 发送给客户端');
console.log(itemDataInfo);
this._emit(MessageTypes.DOC_UPDATE,itemDataInfo);
}else {
loger.log('tableUpdateHandler 数据无效--> itemIdx',itemIdx);
}
... ... @@ -409,8 +410,7 @@ class DocApe extends Ape {
try{
let docModelPdu= pdu['RCDocSendDataModelPdu'].decode(itemData);
//console.log(whiteBoardModelPdu);
//loger.log(docModelPdu);
loger.log(docModelPdu);
return docModelPdu;
}catch (err){
loger.log("文档收到数据 unPackPdu Pdu解析错误,itemIdx="+itemIdx+" err:"+err.message);
... ...
... ... @@ -233,7 +233,8 @@ class WhiteBoardApe extends Ape {
tableInsertHandler(owner, itemIdx,itemData) {
let whiteBoardModel=this.unPackPdu(owner, itemIdx,itemData);
loger.log('tableInsertHandler',whiteBoardModel);
loger.log('tableInsertHandler');
console.log(whiteBoardModel);
if(whiteBoardModel){
if(GlobalConfig.activeDocId==whiteBoardModel.parentId&&GlobalConfig.activeDocCurPage==whiteBoardModel.curPageNo){
loger.log('WHITEBOARD_ANNOTAION_INSERT 显示到界面上',whiteBoardModel);
... ... @@ -244,7 +245,8 @@ class WhiteBoardApe extends Ape {
}
tableUpdateHandler(owner, itemIdx, itemData) {
let whiteBoardModel=this.unPackPdu(owner, itemIdx,itemData);
loger.log('tableUpdateHandler',whiteBoardModel);
loger.log('tableUpdateHandler');
console.log(whiteBoardModel);
if(whiteBoardModel&&whiteBoardModel.parentId==GlobalConfig.activeDocId&&whiteBoardModel.curPageNo==GlobalConfig.activeDocCurPage){
this.updateAandShowAnnotaion();
}
... ... @@ -267,7 +269,8 @@ class WhiteBoardApe extends Ape {
}
//文档更新,白板也要更新
docUpdateHandler(_data){
loger.log("白板收到文档更新的消息docUpdateHandler",_data);
loger.log("白板收到文档更新的消息docUpdateHandler");
console.log(_data);
//如果切换了文档或翻页,清除之前的添加步骤记录
if(_data.action==ApeConsts.DOC_ACTION_SWITCH_DOC){
... ...
... ... @@ -688,6 +688,7 @@ message RCConferenceSendDataRequestPdu {
optional uint32 peer = 2;
required bool is_public = 3;
required bytes user_data = 4;
optional uint32 action_type = 5;//消息的指令类型
}
message RCChatSendDataRequestPdu {
... ...