李勇

1.增加聊天模块支持图片消息;2.增加踢人接口;3.修改CDN地址和m3u8地址拼接规则

@@ -35,7 +35,7 @@ import QuestionApe from 'apes/QuestionApe'; @@ -35,7 +35,7 @@ import QuestionApe from 'apes/QuestionApe';
35 import UTF8 from 'utf-8'; 35 import UTF8 from 'utf-8';
36 36
37 let loger = Loger.getLoger('McuClient'); 37 let loger = Loger.getLoger('McuClient');
38 -let _sdkInfo = { "version": "v1.48.2.20170723", "author": "www.3mang.com" }; 38 +let _sdkInfo = { "version": "v1.49.1.20170724", "author": "www.3mang.com" };
39 39
40 //APE 40 //APE
41 let _sass; 41 let _sass;
@@ -164,7 +164,9 @@ export default class MessageEntrance extends Emiter { @@ -164,7 +164,9 @@ export default class MessageEntrance extends Emiter {
164 this.controlHandUpStatus = this._controlHandUpStatus.bind(this); //控制别人的举手状态 164 this.controlHandUpStatus = this._controlHandUpStatus.bind(this); //控制别人的举手状态
165 this.controlSilenceStatus = this._controlSilenceStatus.bind(this); //改变禁言状态 165 this.controlSilenceStatus = this._controlSilenceStatus.bind(this); //改变禁言状态
166 166
167 - this.sceneTableChange = this._sceneTableChange.bind(this); //控制别人的举手状态 167 + this.sceneTableChange = this._sceneTableChange.bind(this); //切换模块显示
  168 +
  169 + this.kickOutRosterFormNodeId= this._kickOutRosterFormNodeId.bind(this); //把指定nodeId的人踢出课堂
168 170
169 //录制回放 171 //录制回放
170 this.initRecordPlayback = this._initRecordPlayback.bind(this); 172 this.initRecordPlayback = this._initRecordPlayback.bind(this);
@@ -433,7 +435,8 @@ export default class MessageEntrance extends Emiter { @@ -433,7 +435,8 @@ export default class MessageEntrance extends Emiter {
433 GlobalConfig.portal = _param.portal; 435 GlobalConfig.portal = _param.portal;
434 GlobalConfig.isH5=_param.isH5||false;//外部传入的参数,是否是H5 436 GlobalConfig.isH5=_param.isH5||false;//外部传入的参数,是否是H5
435 if(GlobalConfig.isH5==true){ 437 if(GlobalConfig.isH5==true){
436 - GlobalConfig.platform = 3;//3是H5 438 + GlobalConfig.platform = "H5";
  439 + GlobalConfig.deviceType=3//3是H5
437 loger.warn("设备类型是H5"); 440 loger.warn("设备类型是H5");
438 } 441 }
439 //GlobalConfig.userId = _param.userId || "0"; 442 //GlobalConfig.userId = _param.userId || "0";
@@ -1054,6 +1057,17 @@ export default class MessageEntrance extends Emiter { @@ -1054,6 +1057,17 @@ export default class MessageEntrance extends Emiter {
1054 } 1057 }
1055 } 1058 }
1056 1059
  1060 + //将指定nodeId的人踢出课堂
  1061 + _kickOutRosterFormNodeId(_param){
  1062 + if (!_mcu.connected) {
  1063 + loger.warn(GlobalConfig.getCurrentStatus());
  1064 + return { "code": ApeConsts.RETURN_FAILED, "data": "" };
  1065 + }
  1066 + if (_confer_ape) {
  1067 + _confer_ape.kickOutRosterFormNodeId(_param);
  1068 + }
  1069 + }
  1070 +
1057 // 禁言控制 1071 // 禁言控制
1058 _controlSilenceStatus(_param) { 1072 _controlSilenceStatus(_param) {
1059 if (!_mcu.connected) { 1073 if (!_mcu.connected) {
@@ -1244,7 +1258,8 @@ export default class MessageEntrance extends Emiter { @@ -1244,7 +1258,8 @@ export default class MessageEntrance extends Emiter {
1244 GlobalConfig.MS_PLAY_HLS_IP = ipItem; //ip包含了端口 1258 GlobalConfig.MS_PLAY_HLS_IP = ipItem; //ip包含了端口
1245 GlobalConfig.MS_PLAY_HLS_PORT = ""; 1259 GlobalConfig.MS_PLAY_HLS_PORT = "";
1246 loger.log('videoCDNAddr>初始->MSHls', GlobalConfig.MS_PLAY_HLS_IP); 1260 loger.log('videoCDNAddr>初始->MSHls', GlobalConfig.MS_PLAY_HLS_IP);
1247 - } else if (ipItem.indexOf('rtmppull') >= 0) { 1261 + }
  1262 + if (ipItem.indexOf('rtmppull')>= 0) {
1248 //直播的时候rtmp拉流地址 1263 //直播的时候rtmp拉流地址
1249 GlobalConfig.MS_PLAY_RTMP_IP = ipItem; //ip包含了端口 1264 GlobalConfig.MS_PLAY_RTMP_IP = ipItem; //ip包含了端口
1250 GlobalConfig.MS_PLAY_RTMP_PORT = ''; 1265 GlobalConfig.MS_PLAY_RTMP_PORT = '';
@@ -1838,12 +1853,12 @@ export default class MessageEntrance extends Emiter { @@ -1838,12 +1853,12 @@ export default class MessageEntrance extends Emiter {
1838 1853
1839 //音乐共享模块加入频道成功,同步到MCU服务器上的数据 1854 //音乐共享模块加入频道成功,同步到MCU服务器上的数据
1840 musicShareApeJoinChannelSuccess() { 1855 musicShareApeJoinChannelSuccess() {
1841 - loger.log("伴音MUSIC模块加入频道成功->isHost=", GlobalConfig.isHost, "length=", GlobalConfig.sharedMusicList.length);  
1842 - console.log("伴音MUSIC模块共享模数据->", GlobalConfig.sharedMusicList); 1856 + loger.log("伴音MUSIC模块加入频道成功->isHost=", GlobalConfig.isHost, "length=", GlobalConfig.musicListPrepare.length);
  1857 + console.log("伴音MUSIC模块共享模数据->", GlobalConfig.musicListPrepare);
1843 //如果是主持人,那么需要判断一下文档模块同步的数据和从sass获取的文档数据是否相同,如果mcu服务器不存在的,需要上传 1858 //如果是主持人,那么需要判断一下文档模块同步的数据和从sass获取的文档数据是否相同,如果mcu服务器不存在的,需要上传
1844 - if (GlobalConfig.isHost && GlobalConfig.sharedMusicList.length > 0) {  
1845 - for (let i = 0; i < GlobalConfig.sharedMusicList.length; i++) {  
1846 - let value = GlobalConfig.sharedMusicList[i]; 1859 + if (GlobalConfig.isHost && GlobalConfig.musicListPrepare.length > 0) {
  1860 + for (let i = 0; i < GlobalConfig.musicListPrepare.length; i++) {
  1861 + let value = GlobalConfig.musicListPrepare[i];
1847 if (value) { 1862 if (value) {
1848 let paramInfo = { 1863 let paramInfo = {
1849 "status": 0, 1864 "status": 0,
@@ -24,6 +24,7 @@ ApeConsts.CLASS_PAUSING = "class.update"; //更新当前的状态信息 @@ -24,6 +24,7 @@ ApeConsts.CLASS_PAUSING = "class.update"; //更新当前的状态信息
24 ApeConsts.CLASS_ACTION_CLOSE_ALL = 1; //所有人关闭课堂 24 ApeConsts.CLASS_ACTION_CLOSE_ALL = 1; //所有人关闭课堂
25 ApeConsts.CLASS_ACTION_HANDUP_STATUS_CHANGE = 2; //更改用户的举手状态 25 ApeConsts.CLASS_ACTION_HANDUP_STATUS_CHANGE = 2; //更改用户的举手状态
26 ApeConsts.USER_ACTION_SILENCE_STATUS_CHANGE = 3; //更改用户的禁言状态 26 ApeConsts.USER_ACTION_SILENCE_STATUS_CHANGE = 3; //更改用户的禁言状态
  27 +ApeConsts.CLASS_ACTION_KICK_OUT_ROSTER=4; //指定的人踢出课堂
27 28
28 //课堂类型 1:1v1(2路流) 2:直播(1路流) 3:小班课(可以多路流) 29 //课堂类型 1:1v1(2路流) 2:直播(1路流) 3:小班课(可以多路流)
29 ApeConsts.CLASS_TYPE_1 = 1; // 互动课堂,通过MS转发音视频,不能进行H5观看 1v1(2路流) 30 ApeConsts.CLASS_TYPE_1 = 1; // 互动课堂,通过MS转发音视频,不能进行H5观看 1v1(2路流)
@@ -58,6 +58,7 @@ class ChatApe extends Ape { @@ -58,6 +58,7 @@ class ChatApe extends Ape {
58 chatSendPdu.initiator = this._classInfo.nodeId;//发起人 58 chatSendPdu.initiator = this._classInfo.nodeId;//发起人
59 chatSendPdu.peer = parseInt(_messageInfo.to);//发送给谁,公聊的时候是0,私聊的时候是指定的用户id 59 chatSendPdu.peer = parseInt(_messageInfo.to);//发送给谁,公聊的时候是0,私聊的时候是指定的用户id
60 60
  61 + chatSendPdu.msgType=parseInt(_messageInfo.msgType)||0;
61 chatSendPdu.userData = this._rCArrayBufferUtil.strToUint8Array("h5" + _messageInfo.message); 62 chatSendPdu.userData = this._rCArrayBufferUtil.strToUint8Array("h5" + _messageInfo.message);
62 chatSendPdu.fromName = this._rCArrayBufferUtil.strToUint8Array("h5" + this._classInfo.userName); 63 chatSendPdu.fromName = this._rCArrayBufferUtil.strToUint8Array("h5" + this._classInfo.userName);
63 chatSendPdu.fromRole = this._classInfo.userRole;// classRole已经废弃 64 chatSendPdu.fromRole = this._classInfo.userRole;// classRole已经废弃
@@ -91,6 +91,7 @@ class ConferApe extends Ape { @@ -91,6 +91,7 @@ class ConferApe extends Ape {
91 adapterPdu.item.push(adapterItemPdu); 91 adapterPdu.item.push(adapterItemPdu);
92 this.sendUniform(adapterPdu, true); 92 this.sendUniform(adapterPdu, true);
93 } 93 }
  94 +
94 //获取角色信息 95 //获取角色信息
95 getNodeInfo() { 96 getNodeInfo() {
96 let nodeInfoRecordPdu = new pdu['RCNodeInfoRecordPdu']; 97 let nodeInfoRecordPdu = new pdu['RCNodeInfoRecordPdu'];
@@ -225,7 +226,7 @@ class ConferApe extends Ape { @@ -225,7 +226,7 @@ class ConferApe extends Ape {
225 sendConferRecordMsg(_param) { 226 sendConferRecordMsg(_param) {
226 if (!this.mcu.connected) { 227 if (!this.mcu.connected) {
227 loger.warn(GlobalConfig.getCurrentStatus()); 228 loger.warn(GlobalConfig.getCurrentStatus());
228 - return { "code": ApeConsts.RETURN_FAILED, "data": "已经断开连接" }; 229 + return {"code": ApeConsts.RETURN_FAILED, "data": "已经断开连接"};
229 } 230 }
230 if (_param == null) { 231 if (_param == null) {
231 loger.warn("控制录制状的消息发送失败,参数错误", _param); 232 loger.warn("控制录制状的消息发送失败,参数错误", _param);
@@ -269,7 +270,7 @@ class ConferApe extends Ape { @@ -269,7 +270,7 @@ class ConferApe extends Ape {
269 //如果是host 270 //如果是host
270 if (GlobalConfig.isHost) { 271 if (GlobalConfig.isHost) {
271 GlobalConfig.classStopTime = EngineUtils.creatTimestampStr(); 272 GlobalConfig.classStopTime = EngineUtils.creatTimestampStr();
272 - this.sendConferRecordMsg({ "recordStatus": true }); 273 + this.sendConferRecordMsg({"recordStatus": true});
273 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE); 274 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE);
274 this._emit(MessageTypes.CLASS_RECORD_START); //课堂开始录制 275 this._emit(MessageTypes.CLASS_RECORD_START); //课堂开始录制
275 } 276 }
@@ -282,14 +283,14 @@ class ConferApe extends Ape { @@ -282,14 +283,14 @@ class ConferApe extends Ape {
282 //强制停止,可以是host之外的身份(比如当前课堂老师异常退出,没有老师,会随机选择一个人来做释放操作) 283 //强制停止,可以是host之外的身份(比如当前课堂老师异常退出,没有老师,会随机选择一个人来做释放操作)
283 if (GlobalConfig.recordStatus) { 284 if (GlobalConfig.recordStatus) {
284 GlobalConfig.classStopTime = EngineUtils.creatTimestampStr(); 285 GlobalConfig.classStopTime = EngineUtils.creatTimestampStr();
285 - this.sendConferRecordMsg({ "recordStatus": false }); 286 + this.sendConferRecordMsg({"recordStatus": false});
286 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE); 287 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE);
287 } 288 }
288 } else { 289 } else {
289 //身份是host,并且当前正在录制中 290 //身份是host,并且当前正在录制中
290 if (GlobalConfig.isHost && GlobalConfig.recordStatus) { 291 if (GlobalConfig.isHost && GlobalConfig.recordStatus) {
291 GlobalConfig.classStopTime = EngineUtils.creatTimestampStr(); 292 GlobalConfig.classStopTime = EngineUtils.creatTimestampStr();
292 - this.sendConferRecordMsg({ "recordStatus": false }); 293 + this.sendConferRecordMsg({"recordStatus": false});
293 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE); 294 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE);
294 } 295 }
295 } 296 }
@@ -336,7 +337,7 @@ class ConferApe extends Ape { @@ -336,7 +337,7 @@ class ConferApe extends Ape {
336 GlobalConfig.classStopTime = EngineUtils.creatTimestampStr(); 337 GlobalConfig.classStopTime = EngineUtils.creatTimestampStr();
337 this.stopRecord(); 338 this.stopRecord();
338 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE); 339 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE);
339 - this.sendUpdaterClassStatusInfo({ "actionType": 0, isStopAllPublishMedia: true }); 340 + this.sendUpdaterClassStatusInfo({"actionType": 0, isStopAllPublishMedia: true});
340 loger.log('restorClass'); 341 loger.log('restorClass');
341 } 342 }
342 343
@@ -378,7 +379,7 @@ class ConferApe extends Ape { @@ -378,7 +379,7 @@ class ConferApe extends Ape {
378 //课堂状态改变 379 //课堂状态改变
379 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE); 380 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE);
380 //同步课堂状态 381 //同步课堂状态
381 - this.sendUpdaterClassStatusInfo({ "actionType": 1, isStopAllPublishMedia: true }); 382 + this.sendUpdaterClassStatusInfo({"actionType": 1, isStopAllPublishMedia: true});
382 383
383 //开始计时 384 //开始计时
384 this.startTimerCounter(); 385 this.startTimerCounter();
@@ -398,7 +399,7 @@ class ConferApe extends Ape { @@ -398,7 +399,7 @@ class ConferApe extends Ape {
398 399
399 this.stopRecord(); 400 this.stopRecord();
400 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE, _param); 401 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE, _param);
401 - this.sendUpdaterClassStatusInfo({ "actionType": 2, isStopAllPublishMedia: true }); 402 + this.sendUpdaterClassStatusInfo({"actionType": 2, isStopAllPublishMedia: true});
402 this.stopTimerCounter(); 403 this.stopTimerCounter();
403 } 404 }
404 405
@@ -412,8 +413,9 @@ class ConferApe extends Ape { @@ -412,8 +413,9 @@ class ConferApe extends Ape {
412 this.stopTimerCounter(); 413 this.stopTimerCounter();
413 this.restorClass(); 414 this.restorClass();
414 //把所有人都踢出课堂 415 //把所有人都踢出课堂
415 - this.sendConferMsg({ "to": 0, "message": "所有人退出课堂", "actionType": ApeConsts.CLASS_ACTION_CLOSE_ALL }); 416 + this.sendConferMsg({"to": 0, "message": "所有人退出课堂", "actionType": ApeConsts.CLASS_ACTION_CLOSE_ALL});
416 } 417 }
  418 +
417 //更新设备信息 419 //更新设备信息
418 updateDeviceInfo(_param) { 420 updateDeviceInfo(_param) {
419 loger.log('更新用户的设备信息->', _param); 421 loger.log('更新用户的设备信息->', _param);
@@ -434,7 +436,7 @@ class ConferApe extends Ape { @@ -434,7 +436,7 @@ class ConferApe extends Ape {
434 GlobalConfig.silenceUsers[_param.userId || _param.nodeId] = _param; 436 GlobalConfig.silenceUsers[_param.userId || _param.nodeId] = _param;
435 } 437 }
436 438
437 - this.sendUpdaterClassStatusInfo({ silenceUsers: GlobalConfig.silenceUsers }); 439 + this.sendUpdaterClassStatusInfo({silenceUsers: GlobalConfig.silenceUsers});
438 } 440 }
439 441
440 changeSilenceStatus(_param) { 442 changeSilenceStatus(_param) {
@@ -443,6 +445,24 @@ class ConferApe extends Ape { @@ -443,6 +445,24 @@ class ConferApe extends Ape {
443 this.updateUserInfo(); 445 this.updateUserInfo();
444 } 446 }
445 447
  448 + //将指定nodeId的人踢出课堂
  449 + kickOutRosterFormNodeId(_param) {
  450 + if(GlobalConfig.isNormal){
  451 + loger.warn("普通身份没有踢人的权限");
  452 + return;
  453 + }
  454 + if (_param && _param.nodeId) {
  455 + this.sendConferMsg({
  456 + "to": parseInt(_param.nodeId),
  457 + "message": "" + _param.nodeId + "踢出课堂",
  458 + "actionType": ApeConsts.CLASS_ACTION_KICK_OUT_ROSTER
  459 + });
  460 + } else {
  461 + loger.warn("踢人失败-参数无效")
  462 + console.log(_param);
  463 + }
  464 + }
  465 +
446 //控制举手状态 466 //控制举手状态
447 controlHandUpStatus(_param) { 467 controlHandUpStatus(_param) {
448 //控制用户的举手状态 468 //控制用户的举手状态
@@ -456,7 +476,11 @@ class ConferApe extends Ape { @@ -456,7 +476,11 @@ class ConferApe extends Ape {
456 if (_param && _param.isHandUp == true) { 476 if (_param && _param.isHandUp == true) {
457 msgObj.isHandUp = true; 477 msgObj.isHandUp = true;
458 } 478 }
459 - this.sendConferMsg({ "to": _param.nodeId, "message": JSON.stringify(msgObj), "actionType": ApeConsts.CLASS_ACTION_HANDUP_STATUS_CHANGE }); 479 + this.sendConferMsg({
  480 + "to": _param.nodeId,
  481 + "message": JSON.stringify(msgObj),
  482 + "actionType": ApeConsts.CLASS_ACTION_HANDUP_STATUS_CHANGE
  483 + });
460 } 484 }
461 485
462 //切换举手状态 486 //切换举手状态
@@ -470,6 +494,7 @@ class ConferApe extends Ape { @@ -470,6 +494,7 @@ class ConferApe extends Ape {
470 } 494 }
471 this.updateUserInfo(); 495 this.updateUserInfo();
472 } 496 }
  497 +
473 //课堂的场景模块发送改变 498 //课堂的场景模块发送改变
474 sceneTableChange(_param) { 499 sceneTableChange(_param) {
475 if (GlobalConfig.isRecordPlayBack) { 500 if (GlobalConfig.isRecordPlayBack) {
@@ -483,7 +508,7 @@ class ConferApe extends Ape { @@ -483,7 +508,7 @@ class ConferApe extends Ape {
483 //保存数据到Sass 508 //保存数据到Sass
484 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE); 509 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE);
485 //同步消息给其他人 510 //同步消息给其他人
486 - this.sendUpdaterClassStatusInfo({ "actionType": 1, isStopAllPublishMedia: false }); 511 + this.sendUpdaterClassStatusInfo({"actionType": 1, isStopAllPublishMedia: false});
487 } 512 }
488 } 513 }
489 514
@@ -550,8 +575,7 @@ class ConferApe extends Ape { @@ -550,8 +575,7 @@ class ConferApe extends Ape {
550 //如果是host ,开始录制 575 //如果是host ,开始录制
551 this.startRecord(); 576 this.startRecord();
552 } else if (GlobalConfig.classStatus == ApeConsts.CLASS_STATUS_WAIT && 577 } else if (GlobalConfig.classStatus == ApeConsts.CLASS_STATUS_WAIT &&
553 - GlobalConfig.isHost && GlobalConfig.isAutoStartClass &&  
554 - !GlobalConfig.isRecordPlayBack) { 578 + GlobalConfig.isHost && GlobalConfig.isAutoStartClass && !GlobalConfig.isRecordPlayBack) {
555 //自动开始上课的4个条件 579 //自动开始上课的4个条件
556 //1.如果自己是host,2.Sass配置的是自动开始上课,3.并且当前是未开始状态,4.当前不是录制回放,开始自动上课 580 //1.如果自己是host,2.Sass配置的是自动开始上课,3.并且当前是未开始状态,4.当前不是录制回放,开始自动上课
557 loger.log('自动开始上课->classStatus:', GlobalConfig.classStatus, " isHost:", GlobalConfig.isHost, " isAutoStartClass:", GlobalConfig.isAutoStartClass, " isRecordPlayBack:", GlobalConfig.isRecordPlayBack); 581 loger.log('自动开始上课->classStatus:', GlobalConfig.classStatus, " isHost:", GlobalConfig.isHost, " isAutoStartClass:", GlobalConfig.isAutoStartClass, " isRecordPlayBack:", GlobalConfig.isRecordPlayBack);
@@ -593,7 +617,7 @@ class ConferApe extends Ape { @@ -593,7 +617,7 @@ class ConferApe extends Ape {
593 GlobalConfig.recordTimestamp = GlobalConfig.recordTimestamp + 1; 617 GlobalConfig.recordTimestamp = GlobalConfig.recordTimestamp + 1;
594 } 618 }
595 //loger.log('课堂进行时间',GlobalConfig.classTimestamp); 619 //loger.log('课堂进行时间',GlobalConfig.classTimestamp);
596 - this._emit(MessageTypes.CLASS_UPDATE_TIMER, { "classTimestamp": GlobalConfig.classTimestamp }); 620 + this._emit(MessageTypes.CLASS_UPDATE_TIMER, {"classTimestamp": GlobalConfig.classTimestamp});
597 621
598 if (GlobalConfig.classTimestamp % GlobalConfig.updateClassInfoDelay == 0) { 622 if (GlobalConfig.classTimestamp % GlobalConfig.updateClassInfoDelay == 0) {
599 //如果是host身份,需要同步时间给其他人,同时把当前的状态上传到服务器 623 //如果是host身份,需要同步时间给其他人,同时把当前的状态上传到服务器
@@ -602,7 +626,7 @@ class ConferApe extends Ape { @@ -602,7 +626,7 @@ class ConferApe extends Ape {
602 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE); 626 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE);
603 627
604 //同步消息给其他人 628 //同步消息给其他人
605 - this.sendUpdaterClassStatusInfo({ "actionType": 1, isStopAllPublishMedia: false }); 629 + this.sendUpdaterClassStatusInfo({"actionType": 1, isStopAllPublishMedia: false});
606 } 630 }
607 } 631 }
608 632
@@ -619,9 +643,9 @@ class ConferApe extends Ape { @@ -619,9 +643,9 @@ class ConferApe extends Ape {
619 643
620 //处理课堂更新的信息 644 //处理课堂更新的信息
621 if (model && model.classStatusInfo) { 645 if (model && model.classStatusInfo) {
622 - try{  
623 - model.classStatusInfo.silenceUsers=JSON.parse( model.classStatusInfo.silenceUsers);  
624 - }catch (err){ 646 + try {
  647 + model.classStatusInfo.silenceUsers = JSON.parse(model.classStatusInfo.silenceUsers);
  648 + } catch (err) {
625 649
626 } 650 }
627 651
@@ -670,15 +694,21 @@ class ConferApe extends Ape { @@ -670,15 +694,21 @@ class ConferApe extends Ape {
670 chatMsg.toNodeID = chatReceivePdu.peer; 694 chatMsg.toNodeID = chatReceivePdu.peer;
671 chatMsg.message = this._rCArrayBufferUtil.uint8ArrayToStr(chatReceivePdu.userData, 2); 695 chatMsg.message = this._rCArrayBufferUtil.uint8ArrayToStr(chatReceivePdu.userData, 2);
672 chatMsg.actionType = chatReceivePdu.actionType; 696 chatMsg.actionType = chatReceivePdu.actionType;
673 - loger.log("conferMsgComingHandler", chatMsg); //{"fromNodeID":418883112,"toNodeID":0,"message":"所有人退出课堂","actionType":1} 697 + loger.log("课堂控制消息", chatMsg); //{"fromNodeID":418883112,"toNodeID":0,"message":"所有人退出课堂","actionType":1}
674 switch (chatMsg.actionType) { 698 switch (chatMsg.actionType) {
675 case ApeConsts.CLASS_ACTION_CLOSE_ALL: 699 case ApeConsts.CLASS_ACTION_CLOSE_ALL:
676 loger.log(chatMsg.message); 700 loger.log(chatMsg.message);
677 //收到课堂关闭,所有人都退出,执行自己关闭的流程 701 //收到课堂关闭,所有人都退出,执行自己关闭的流程
678 - this._emit(MessageTypes.CLASS_RUN_EXIT, { 'type': 1 }); 702 + this._emit(MessageTypes.CLASS_RUN_EXIT, {'type': 1});
  703 + break;
  704 + case ApeConsts.CLASS_ACTION_KICK_OUT_ROSTER:
  705 + if (chatMsg.toNodeID == GlobalConfig.nodeId) {
  706 + //自己被踢出课堂
  707 + this._emit(MessageTypes.CLASS_RUN_EXIT, {'type': 2});
  708 + }
679 break; 709 break;
680 case ApeConsts.CLASS_ACTION_HANDUP_STATUS_CHANGE: 710 case ApeConsts.CLASS_ACTION_HANDUP_STATUS_CHANGE:
681 - console.log('chatMsg', chatMsg); 711 + //console.log('chatMsg', chatMsg);
682 let msgObj = null; 712 let msgObj = null;
683 try { 713 try {
684 msgObj = JSON.parse(chatMsg.message); 714 msgObj = JSON.parse(chatMsg.message);
@@ -709,8 +739,9 @@ class ConferApe extends Ape { @@ -709,8 +739,9 @@ class ConferApe extends Ape {
709 //收到父级页面的消息,需要广播发送出去 739 //收到父级页面的消息,需要广播发送出去
710 onThirdReciveParentMessage(_msg) { 740 onThirdReciveParentMessage(_msg) {
711 loger.log('收到页面的消息->广播给其他模块->', _msg); 741 loger.log('收到页面的消息->广播给其他模块->', _msg);
712 - this.sendThirdBroadcastData({ to: 0, message: _msg }); 742 + this.sendThirdBroadcastData({to: 0, message: _msg});
713 } 743 }
  744 +
714 //发送第三方广播消息 745 //发送第三方广播消息
715 sendThirdBroadcastData(_param) { 746 sendThirdBroadcastData(_param) {
716 loger.log("发送第三方广播消息->", _param); 747 loger.log("发送第三方广播消息->", _param);
@@ -790,10 +821,10 @@ class ConferApe extends Ape { @@ -790,10 +821,10 @@ class ConferApe extends Ape {
790 //自己加入的时候,需要做一下判断操作,如果满足以下3个条件就要暂停课堂: 821 //自己加入的时候,需要做一下判断操作,如果满足以下3个条件就要暂停课堂:
791 // 1.当前课堂只有自己;2.自己的身份不是host;3当前的课堂状态为(CLASS_STATUS_STARTED= 1;//直播中) 822 // 1.当前课堂只有自己;2.自己的身份不是host;3当前的课堂状态为(CLASS_STATUS_STARTED= 1;//直播中)
792 let rosterLen = Object.keys(this.rosters).length; 823 let rosterLen = Object.keys(this.rosters).length;
793 - GlobalConfig.rosterNumber=rosterLen;//记录当前的总人数 824 + GlobalConfig.rosterNumber = rosterLen;//记录当前的总人数
794 if (rosterLen < 1 && !GlobalConfig.isHost && GlobalConfig.classStatus == ApeConsts.CLASS_STATUS_STARTED) { 825 if (rosterLen < 1 && !GlobalConfig.isHost && GlobalConfig.classStatus == ApeConsts.CLASS_STATUS_STARTED) {
795 loger.warn("当前课堂没有老师->暂停课堂"); 826 loger.warn("当前课堂没有老师->暂停课堂");
796 - this.pauseClass({ isForce: true }); 827 + this.pauseClass({isForce: true});
797 this.stopRecord(true); 828 this.stopRecord(true);
798 } 829 }
799 //处理用户信息 830 //处理用户信息
@@ -813,7 +844,7 @@ class ConferApe extends Ape { @@ -813,7 +844,7 @@ class ConferApe extends Ape {
813 } else if (nodeData.userId == GlobalConfig.userId && GlobalConfig.userId != "0") { 844 } else if (nodeData.userId == GlobalConfig.userId && GlobalConfig.userId != "0") {
814 loger.log("异地登陆->userId->", GlobalConfig.userId); 845 loger.log("异地登陆->userId->", GlobalConfig.userId);
815 this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_CLASS_REMOTE_LANDING); 846 this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_CLASS_REMOTE_LANDING);
816 - this._emit(MessageTypes.CLASS_RUN_EXIT, { 'type': 1 }); 847 + this._emit(MessageTypes.CLASS_RUN_EXIT, {'type': 1});
817 } 848 }
818 } 849 }
819 /*if (parseInt(nodeId) > GlobalConfig.nodeId) { 850 /*if (parseInt(nodeId) > GlobalConfig.nodeId) {
@@ -839,6 +870,7 @@ class ConferApe extends Ape { @@ -839,6 +870,7 @@ class ConferApe extends Ape {
839 //处理用户信息 870 //处理用户信息
840 this.unPackRosterInfo(nodeId, nodeData); 871 this.unPackRosterInfo(nodeId, nodeData);
841 } 872 }
  873 +
842 //处理用户信息 874 //处理用户信息
843 unPackRosterInfo(nodeId, nodeData) { 875 unPackRosterInfo(nodeId, nodeData) {
844 let rosterExists = this.rosters[nodeId]; 876 let rosterExists = this.rosters[nodeId];
@@ -859,13 +891,13 @@ class ConferApe extends Ape { @@ -859,13 +891,13 @@ class ConferApe extends Ape {
859 } 891 }
860 if (!rosterExists) { 892 if (!rosterExists) {
861 loger.log("人员加入->", newNodeData); 893 loger.log("人员加入->", newNodeData);
862 - this._emit(MessageTypes.CLASS_INSERT_ROSTER, { "nodeId": nodeId, "nodeData": newNodeData }); 894 + this._emit(MessageTypes.CLASS_INSERT_ROSTER, {"nodeId": nodeId, "nodeData": newNodeData});
863 this.emitRosterChange(); 895 this.emitRosterChange();
864 896
865 } else { 897 } else {
866 //loger.log("更新人员列表数据,rosterExists已经存在",rosterExists); 898 //loger.log("更新人员列表数据,rosterExists已经存在",rosterExists);
867 loger.log("人员更新信息->", newNodeData); 899 loger.log("人员更新信息->", newNodeData);
868 - this._emit(MessageTypes.CLASS_UPDATE_ROSTER, { "nodeId": nodeId, "nodeData": newNodeData }); 900 + this._emit(MessageTypes.CLASS_UPDATE_ROSTER, {"nodeId": nodeId, "nodeData": newNodeData});
869 } 901 }
870 902
871 } 903 }
@@ -873,7 +905,7 @@ class ConferApe extends Ape { @@ -873,7 +905,7 @@ class ConferApe extends Ape {
873 //踢出用户 905 //踢出用户
874 kickOutRoster() { 906 kickOutRoster() {
875 this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_CLASS_KICK_OUT); 907 this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_CLASS_KICK_OUT);
876 - this._emit(MessageTypes.CLASS_RUN_EXIT, { 'type': 1 }); 908 + this._emit(MessageTypes.CLASS_RUN_EXIT, {'type': 1});
877 } 909 }
878 910
879 //视频模块发生更新,人员状态需要更新 911 //视频模块发生更新,人员状态需要更新
@@ -882,7 +914,7 @@ class ConferApe extends Ape { @@ -882,7 +914,7 @@ class ConferApe extends Ape {
882 //如果视频消息中channel的占用人 fromNodeId在人员列表中不存在,需要释放这channel,因为这个有可能是之前没释放成功的 914 //如果视频消息中channel的占用人 fromNodeId在人员列表中不存在,需要释放这channel,因为这个有可能是之前没释放成功的
883 if (_param && _param.status == ApeConsts.CHANNEL_STATUS_OPENING && this.rosters[_param.fromNodeId] == null) { 915 if (_param && _param.status == ApeConsts.CHANNEL_STATUS_OPENING && this.rosters[_param.fromNodeId] == null) {
884 loger.log("媒体模块被占用->占有人已经不存在课堂中->释放->", _param); 916 loger.log("媒体模块被占用->占有人已经不存在课堂中->释放->", _param);
885 - this._emit(MessageTypes.CLASS_NONENTITY_ROSTER, { "nodeId": _param.fromNodeId }); 917 + this._emit(MessageTypes.CLASS_NONENTITY_ROSTER, {"nodeId": _param.fromNodeId});
886 } 918 }
887 919
888 /* if (_param && _param.status == ApeConsts.CHANNEL_STATUS_OPENING) { 920 /* if (_param && _param.status == ApeConsts.CHANNEL_STATUS_OPENING) {
@@ -912,6 +944,7 @@ class ConferApe extends Ape { @@ -912,6 +944,7 @@ class ConferApe extends Ape {
912 } 944 }
913 }*/ 945 }*/
914 } 946 }
  947 +
915 //设备状态更新 948 //设备状态更新
916 updaterUserDeviecStatusChange(_data) { 949 updaterUserDeviecStatusChange(_data) {
917 loger.log("音视频设备状态更新->", _data); 950 loger.log("音视频设备状态更新->", _data);
@@ -923,7 +956,7 @@ class ConferApe extends Ape { @@ -923,7 +956,7 @@ class ConferApe extends Ape {
923 if (GlobalConfig.nodeId == nodeId) { 956 if (GlobalConfig.nodeId == nodeId) {
924 loger.log("自己离开课堂"); 957 loger.log("自己离开课堂");
925 // 自己退出 958 // 自己退出
926 - this._emit(MessageTypes.CLASS_RUN_EXIT, { 'type': 0 }); 959 + this._emit(MessageTypes.CLASS_RUN_EXIT, {'type': 0});
927 } else { 960 } else {
928 let user = this.rosters[nodeId]; 961 let user = this.rosters[nodeId];
929 if (user) { 962 if (user) {
@@ -931,7 +964,7 @@ class ConferApe extends Ape { @@ -931,7 +964,7 @@ class ConferApe extends Ape {
931 } 964 }
932 delete this.rosters[nodeId]; 965 delete this.rosters[nodeId];
933 this.emitRosterChange(); 966 this.emitRosterChange();
934 - this._emit(MessageTypes.CLASS_DELETE_ROSTER, { "nodeId": nodeId }); 967 + this._emit(MessageTypes.CLASS_DELETE_ROSTER, {"nodeId": nodeId});
935 968
936 //当前人员列表中抽一个人来检查离开人员是否占用频道 969 //当前人员列表中抽一个人来检查离开人员是否占用频道
937 for (let key in this.rosters) { 970 for (let key in this.rosters) {
@@ -939,7 +972,7 @@ class ConferApe extends Ape { @@ -939,7 +972,7 @@ class ConferApe extends Ape {
939 //如果抽到的人是自己就处理以下操作 972 //如果抽到的人是自己就处理以下操作
940 if (randNodeId == GlobalConfig.nodeId) { 973 if (randNodeId == GlobalConfig.nodeId) {
941 loger.log(randNodeId, "有权限检查离开的人员是否占用channel"); 974 loger.log(randNodeId, "有权限检查离开的人员是否占用channel");
942 - this._emit(MessageTypes.CLASS_NONENTITY_ROSTER, { "nodeId": nodeId }); 975 + this._emit(MessageTypes.CLASS_NONENTITY_ROSTER, {"nodeId": nodeId});
943 //如果离开的人员是老师,需要暂停当前的课堂 976 //如果离开的人员是老师,需要暂停当前的课堂
944 977
945 if (user && user.role == ApeConsts.NR_HOST) { 978 if (user && user.role == ApeConsts.NR_HOST) {
@@ -47,7 +47,8 @@ class MediaModule { @@ -47,7 +47,8 @@ class MediaModule {
47 path = "http://" + GlobalConfig.MS_PLAY_HLS_IP 47 path = "http://" + GlobalConfig.MS_PLAY_HLS_IP
48 + port + "/live/" 48 + port + "/live/"
49 + _param.streamId 49 + _param.streamId
50 - + "/"+fileName; 50 + +".m3u8";//新版的规则,不需要加playlist 20170724
  51 + //+ "/"+fileName;//
51 52
52 53
53 } else { 54 } else {
@@ -718,6 +718,7 @@ message RCChatSendDataRequestPdu { @@ -718,6 +718,7 @@ message RCChatSendDataRequestPdu {
718 required bytes user_data = 4; 718 required bytes user_data = 4;
719 required string from_role = 5; 719 required string from_role = 5;
720 required bytes from_name = 6; 720 required bytes from_name = 6;
  721 + optional uint32 msgType = 7 [default =0];//当前消息类型,0是文字消息 1是图片消息
721 } 722 }
722 723
723 message RCDocSendDataModelPdu { 724 message RCDocSendDataModelPdu {