李勇

1.录制回放消息和视频匹配部分忽略屏幕共享的消息;2.处理直播模式时H5的消息处理

@@ -63,7 +63,7 @@ export default class MessageEntrance extends Emiter { @@ -63,7 +63,7 @@ export default class MessageEntrance extends Emiter {
63 super(); 63 super();
64 this.lastClassActiveTime=0;//最后一次课堂激活的时间戳 64 this.lastClassActiveTime=0;//最后一次课堂激活的时间戳
65 //sdk 信息 65 //sdk 信息
66 - GlobalConfig.sdkVersion = "v2.31.1.20171120"; 66 + GlobalConfig.sdkVersion = "v2.31.10.20171122";
67 loger.warn("sdkVersion:" + GlobalConfig.sdkVersion); 67 loger.warn("sdkVersion:" + GlobalConfig.sdkVersion);
68 console.log("sdkVersion:" + GlobalConfig.sdkVersion); 68 console.log("sdkVersion:" + GlobalConfig.sdkVersion);
69 //设置 69 //设置
@@ -644,7 +644,7 @@ export default class MessageEntrance extends Emiter { @@ -644,7 +644,7 @@ export default class MessageEntrance extends Emiter {
644 644
645 645
646 //如果没有名字的时候需要随机生成 646 //如果没有名字的时候需要随机生成
647 - let randUserId =parseInt(Math.random()*1000)+""+parseInt(Math.random()*1000)+""+parseInt(Math.random()*1000); 647 + let randUserId =parseInt(Math.random()*1000)+"_"+parseInt(Math.random()*1000)+"_"+parseInt(Math.random()*1000);
648 if (GlobalConfig.userRole == ApeConsts.host) { 648 if (GlobalConfig.userRole == ApeConsts.host) {
649 randUserId = "T" + randUserId; 649 randUserId = "T" + randUserId;
650 } else if (GlobalConfig.userRole == ApeConsts.assistant) { 650 } else if (GlobalConfig.userRole == ApeConsts.assistant) {
@@ -1051,6 +1051,13 @@ export default class MessageEntrance extends Emiter { @@ -1051,6 +1051,13 @@ export default class MessageEntrance extends Emiter {
1051 1051
1052 //开始MCU选点操作 1052 //开始MCU选点操作
1053 _getFastestMcuServer(_callback) { 1053 _getFastestMcuServer(_callback) {
  1054 + //不再做MCU http测速
  1055 + if (_callback) {
  1056 + _callback(null);
  1057 + }
  1058 + return;
  1059 +
  1060 + //正常的测试流程
1054 if (_ipManager) { 1061 if (_ipManager) {
1055 _ipManager.getFastestMcuServer(GlobalConfig.mcuListFinal, _callback); 1062 _ipManager.getFastestMcuServer(GlobalConfig.mcuListFinal, _callback);
1056 } else { 1063 } else {
@@ -1184,7 +1191,7 @@ export default class MessageEntrance extends Emiter { @@ -1184,7 +1191,7 @@ export default class MessageEntrance extends Emiter {
1184 1191
1185 //判断是否需要获取加入音视频通话频道的channelKey 1192 //判断是否需要获取加入音视频通话频道的channelKey
1186 if (GlobalConfig.appCertificate) { 1193 if (GlobalConfig.appCertificate) {
1187 - loger.log("加入视频通话模块->需要先获取channelKey") 1194 + //loger.log("加入视频通话模块->需要先获取channelKey")
1188 //获取channelKey 1195 //获取channelKey
1189 _sass.getChannelKeyToken((_data)=> { 1196 _sass.getChannelKeyToken((_data)=> {
1190 //{"code":200,"channelKey":"005AQAoAEQzQUQxNzFDOEQwOEU3OTVGMjlCMzZDRUZENTNGOTU0RDY4N0ZGMUEQANylukzO70ocgrNX9hlkNNWvpLBZ9buDAy/fuVkAAA==","uid":"751373669"} 1197 //{"code":200,"channelKey":"005AQAoAEQzQUQxNzFDOEQwOEU3OTVGMjlCMzZDRUZENTNGOTU0RDY4N0ZGMUEQANylukzO70ocgrNX9hlkNNWvpLBZ9buDAy/fuVkAAA==","uid":"751373669"}
@@ -1194,7 +1201,7 @@ export default class MessageEntrance extends Emiter { @@ -1194,7 +1201,7 @@ export default class MessageEntrance extends Emiter {
1194 this._joinClassSuccessSeting(); 1201 this._joinClassSuccessSeting();
1195 }) 1202 })
1196 } else { 1203 } else {
1197 - loger.log("加入视频通话模块->不需要获取channelKey") 1204 + //loger.log("加入视频通话模块->不需要获取channelKey")
1198 this._joinClassSuccessSeting(); 1205 this._joinClassSuccessSeting();
1199 } 1206 }
1200 } 1207 }
@@ -1283,7 +1290,7 @@ export default class MessageEntrance extends Emiter { @@ -1283,7 +1290,7 @@ export default class MessageEntrance extends Emiter {
1283 this._emit(MessageTypes.CLASS_JOIN_SUCCESS, joinClassSuccessCallBackData); 1290 this._emit(MessageTypes.CLASS_JOIN_SUCCESS, joinClassSuccessCallBackData);
1284 1291
1285 //主讲人和老师可以设置旁录 1292 //主讲人和老师可以设置旁录
1286 - if (GlobalConfig.appId && !GlobalConfig.openFlash) { 1293 + if (GlobalConfig.appId && !GlobalConfig.openFlash&&GlobalConfig.deviceType!=GlobalConfig.deviceH5) {
1287 //加入之前先设置旁录地址,老师和主讲人开启旁路 1294 //加入之前先设置旁录地址,老师和主讲人开启旁路
1288 if (_webRtc && GlobalConfig.isTeachOrAssistant) { 1295 if (_webRtc && GlobalConfig.isTeachOrAssistant) {
1289 let curTimestamp = new Date().getTime(); 1296 let curTimestamp = new Date().getTime();
@@ -2568,7 +2575,7 @@ export default class MessageEntrance extends Emiter { @@ -2568,7 +2575,7 @@ export default class MessageEntrance extends Emiter {
2568 docJoinChannelSuccess() { 2575 docJoinChannelSuccess() {
2569 let interval=new Date().getTime()-parseInt(this.lastClassActiveTime); 2576 let interval=new Date().getTime()-parseInt(this.lastClassActiveTime);
2570 interval=interval/1000; 2577 interval=interval/1000;
2571 - loger.log("最后一次记录的时间->"+this.lastClassActiveTime,"当前时间:"+new Date().getTime(),"间隔:"+interval+"秒"); 2578 + //loger.log("最后一次记录的时间->"+this.lastClassActiveTime,"当前时间:"+new Date().getTime(),"间隔:"+interval+"秒");
2572 loger.log("文档加入频道成功->isHost=", GlobalConfig.isHost, "当前总人数:", GlobalConfig.rosterNumber, "sassDoclength=", GlobalConfig.docListPrepare.length); 2579 loger.log("文档加入频道成功->isHost=", GlobalConfig.isHost, "当前总人数:", GlobalConfig.rosterNumber, "sassDoclength=", GlobalConfig.docListPrepare.length);
2573 2580
2574 2581
@@ -83,12 +83,7 @@ class EverSocket extends Emiter { @@ -83,12 +83,7 @@ class EverSocket extends Emiter {
83 loger.warn('发送到MCU的数据文件超过10k-->byteLength->'+len,"type:"+type); 83 loger.warn('发送到MCU的数据文件超过10k-->byteLength->'+len,"type:"+type);
84 return; 84 return;
85 } 85 }
86 -  
87 - this.sendToMcuList.push("c2s_"+EngineUtils.creatTimestampStr()+"_"+len+"_"+type);  
88 - if(this.sendToMcuList.length>80){  
89 - loger.log("发送到MCU数据统计->",this.sendToMcuList);  
90 - this.sendToMcuList=[];  
91 - } 86 + this.send2mcu(len,type);
92 } 87 }
93 this.websocket.send(data); 88 this.websocket.send(data);
94 } else { 89 } else {
@@ -96,6 +91,32 @@ class EverSocket extends Emiter { @@ -96,6 +91,32 @@ class EverSocket extends Emiter {
96 } 91 }
97 } 92 }
98 93
  94 + //统计发送到MCU的数据
  95 + /*
  96 + * len 长度
  97 + * type 类型
  98 + * */
  99 + send2mcu(len,type){
  100 + this.sendToMcuList.push(""+len+":"+type);
  101 + if(this.sendToMcuList.length>=50){
  102 + loger.log("发送到MCU数据统计->",this.sendToMcuList);
  103 + this.sendToMcuList=[];
  104 + }
  105 + }
  106 +
  107 + //统计收到MCU的数据
  108 + /*
  109 + * len 长度
  110 + * type 类型
  111 + * */
  112 + mcu2client(len,type){
  113 + this.receiveFromMcuList.push(""+len+":"+type);
  114 + if(this.receiveFromMcuList.length>50){
  115 + loger.log("收到MCU数据统计->",this.receiveFromMcuList);
  116 + this.receiveFromMcuList=[];
  117 + }
  118 + }
  119 +
99 _setConnected(isConn = true) { 120 _setConnected(isConn = true) {
100 this._connected = isConn; 121 this._connected = isConn;
101 if (this._connected) { 122 if (this._connected) {
@@ -218,18 +239,17 @@ class EverSocket extends Emiter { @@ -218,18 +239,17 @@ class EverSocket extends Emiter {
218 const bufferData = messageEvent.data; 239 const bufferData = messageEvent.data;
219 //loger.log('RECEIVE-->byteLength->',bufferData.byteLength); 240 //loger.log('RECEIVE-->byteLength->',bufferData.byteLength);
220 let len=bufferData.byteLength; 241 let len=bufferData.byteLength;
221 - this.receiveFromMcuList.push("s2c_"+EngineUtils.creatTimestampStr()+"_"+len);  
222 - if(this.receiveFromMcuList.length>80){  
223 - loger.log("收到MCU数据统计->",this.receiveFromMcuList);  
224 - this.receiveFromMcuList=[];  
225 - }  
226 if (len> 0) { 242 if (len> 0) {
227 this._emit(EverSocket.MESSAGE, bufferData); 243 this._emit(EverSocket.MESSAGE, bufferData);
  244 + this.mcu2client(len,"消息");
  245 + }else {
  246 + this.mcu2client(0,"回应");
228 } 247 }
229 } 248 }
230 249
231 _sendPingHandler() { 250 _sendPingHandler() {
232 if (this._connected) { 251 if (this._connected) {
  252 + this.send2mcu(0,"心跳");
233 this.websocket.send(new ArrayBuffer); 253 this.websocket.send(new ArrayBuffer);
234 } else { 254 } else {
235 this._reConnection(); 255 this._reConnection();
@@ -1240,7 +1240,10 @@ class RecordPlayBackParse extends Emiter { @@ -1240,7 +1240,10 @@ class RecordPlayBackParse extends Emiter {
1240 } 1240 }
1241 1241
1242 } 1242 }
1243 - this.videoPublishMessages.push(videoChannelInfo); 1243 + //****1310721是屏幕共享和外部流 不需要匹配*****
  1244 + if(parseInt(videoChannelInfo.channelId)<1310721){
  1245 + this.videoPublishMessages.push(videoChannelInfo);
  1246 + }
1244 } 1247 }
1245 this.mediaChannleList[videoChannelInfo.channelId][timestamp] = { 1248 this.mediaChannleList[videoChannelInfo.channelId][timestamp] = {
1246 parseData: videoChannelInfo, 1249 parseData: videoChannelInfo,
@@ -28,393 +28,385 @@ import RecordPlayBackParse from 'RecordPlayBackParse'; @@ -28,393 +28,385 @@ import RecordPlayBackParse from 'RecordPlayBackParse';
28 const loger = Loger.getLoger('Ape'); 28 const loger = Loger.getLoger('Ape');
29 29
30 export default class Ape extends Emiter { 30 export default class Ape extends Emiter {
31 - constructor(session_id,  
32 - session_name,  
33 - session_tag) {  
34 - super();  
35 - this._session_id = session_id;  
36 - this._channel_id = session_id; // session_id === channel_id  
37 - this._session_name = session_name;  
38 - this._session_tag = session_tag;  
39 - this._session_channels = {};  
40 - this._adapter_pdu = new pdu['RCAdapterPdu'];  
41 - this._classInfo = null;  
42 - this._rCArrayBufferUtil = ArrayBufferUtil;  
43 - this._apeDelayed = true;  
44 - this._apeDelayedMsgs = [];  
45 - this._apeDelayedTimer = 0;  
46 -  
47 - //Ape 通用消息处理  
48 - this.on(pdu.RCPDU_SESSION_JOIN_RESPONSE, this._joinSessionHandler.bind(this));  
49 - this.on(pdu.RCPDU_CHANNEL_JOIN_RESPONSE, this._joinChannelHandler.bind(this));  
50 - this.on(pdu.RCPDU_REG_ADAPTER, this._pduMessageHandler.bind(this));  
51 -  
52 - //先收到onJoinSessionHandlerSuccess 后收到 onJoinChannelHandlerSuccess  
53 -  
54 - // 监听底层MCU课堂  
55 - this.mcu = McuObj;  
56 - this.mcu.on(MessageTypes.CLASS_JOIN_MCU_SUCCESS, this._mcuConferenceJoinSuccessHandler.bind(this));  
57 - this.mcu.registerApe(this);  
58 -  
59 - //录制回放  
60 - this.recordPlayBackParse = RecordPlayBackParse;  
61 - this.recordPlayBackParse.on(RecordPlayBackParse.CLASS_JOIN_RECORD_PLAYBACK_SUCCESS, this._joinRecordPlaybackSuccessHandler.bind(this));  
62 - this.recordPlayBackParse.registerApe(this); 31 + constructor(session_id,
  32 + session_name,
  33 + session_tag) {
  34 + super();
  35 + this._session_id = session_id;
  36 + this._channel_id = session_id; // session_id === channel_id
  37 + this._session_name = session_name;
  38 + this._session_tag = session_tag;
  39 + this._session_channels = {};
  40 + this._adapter_pdu = new pdu['RCAdapterPdu'];
  41 + this._classInfo = null;
  42 + this._rCArrayBufferUtil = ArrayBufferUtil;
  43 + this._apeDelayed = true;
  44 + this._apeDelayedMsgs = [];
  45 + this._apeDelayedTimer = 0;
  46 +
  47 + //Ape 通用消息处理
  48 + this.on(pdu.RCPDU_SESSION_JOIN_RESPONSE, this._joinSessionHandler.bind(this));
  49 + this.on(pdu.RCPDU_CHANNEL_JOIN_RESPONSE, this._joinChannelHandler.bind(this));
  50 + this.on(pdu.RCPDU_REG_ADAPTER, this._pduMessageHandler.bind(this));
  51 +
  52 + //先收到onJoinSessionHandlerSuccess 后收到 onJoinChannelHandlerSuccess
  53 +
  54 + // 监听底层MCU课堂
  55 + this.mcu = McuObj;
  56 + this.mcu.on(MessageTypes.CLASS_JOIN_MCU_SUCCESS, this._mcuConferenceJoinSuccessHandler.bind(this));
  57 + this.mcu.registerApe(this);
  58 +
  59 + //录制回放
  60 + this.recordPlayBackParse = RecordPlayBackParse;
  61 + this.recordPlayBackParse.on(RecordPlayBackParse.CLASS_JOIN_RECORD_PLAYBACK_SUCCESS, this._joinRecordPlaybackSuccessHandler.bind(this));
  62 + this.recordPlayBackParse.registerApe(this);
  63 +
  64 + }
  65 +
  66 + regResponsePduHandler() {
  67 +
  68 + }
  69 +
  70 + //停止APE一切操作
  71 + stopApe() {
  72 + // loger.log("stopApe==============================");
  73 + }
  74 +
  75 + // 消息处理
  76 + _pduMessageHandler(regBuffer, _seekTime) {
  77 + let seekTime = _seekTime || 0;//这个只有在录制回放的时候才有
  78 + this._pduRegAdapterHandler(regBuffer, seekTime);
  79 + }
  80 +
  81 + // 数据同步处理
  82 + _pduRegAdapterHandler(regBuffer, seekTime) {
  83 + let regPdu = pdu['RCAdapterPdu'].decode(regBuffer);
  84 + let regItems = regPdu.item;
  85 + let regItemSize = regItems.length;
  86 + //console.log("RCAdapterPdu数据同步处理",regPdu);
  87 + //loger.log(this._session_name + '数据同步消息');
  88 + //loger.log(this._session_name + '数据同步消息.同步条数', regItemSize,"seekTime->",seekTime);
  89 + for (var i = 0; i < regItemSize; ++i) {
  90 + let regItem = regItems[i];
  91 + let regItemType = regItem.type;
  92 + let regItemData = regItem.itemData;
  93 +
  94 + //根据数据包中的type处理数据是否同步
  95 + if (pdu.RCPDU_REG_UPDATE_OBJ !== regItemType) {
  96 + if (pdu.RCPDU_REG_RESPONSE_OBJ == regItemType) {
  97 + let regResponsePdu = pdu['RCRegistryResponseObjPdu'].decode(regItemData);
  98 + this.regResponsePduHandler(regResponsePdu);
  99 + }
  100 + // 只处理两种类型
  101 + continue;
  102 + }
63 103
  104 + //具体的数据包
  105 + let regUpdatedItem = pdu['RCRegistryUpdateObjPdu'].decode(regItemData);
  106 + let sub_type = regUpdatedItem.subType;
  107 + let object_id = regUpdatedItem.objId;
  108 + let user_data = regUpdatedItem.userData;
  109 +
  110 + //loger.log('REG OBJECT EVENT ->', pdu.id2type(sub_type));
  111 + switch (sub_type) {
  112 + case pdu.RCPDU_REG_ROSTER_INSERT_PDU:
  113 + //let rosterInsertData = pdu['RCRegstryRosterInsertItemPdu'].decode(user_data);
  114 + //loger.log('RCPDU_REG_ROSTER_INSERT_PDU---->');
  115 + try{
  116 + let rosterInsertData = pdu['RCRegistryRosterInsertItemPdu'].decode(user_data);
  117 + let rosterInsertItems = rosterInsertData.items;
  118 + let rosterInsertItemsLen = rosterInsertItems.length;
  119 + for (let i = 0; i < rosterInsertItemsLen; ++i) {
  120 + let record = rosterInsertItems[i];
  121 + let recordId = record.item_id;
  122 + let recordData = pdu['RCNodeInfoRecordPdu'].decode(record.item_data);
  123 + this.rosterInsertHandler(recordId, recordData);
  124 + }
  125 + }catch (err){
  126 + console.log("RCPDU_REG_ROSTER_INSERT_PDU err",err)
  127 + }
  128 + break;
  129 + case pdu.RCPDU_REG_ROSTER_DELETE_PDU:
  130 + let rosterDelData = pdu['RCRegistryRosterDeleteItemPdu'].decode(user_data);
  131 + this.rosterDelHandler(rosterDelData.nodeId);
  132 + break;
  133 + case pdu.RCPDU_REG_ROSTER_UPDATE_PDU:
  134 + let rosterUpdateData = pdu['RCRegistryRosterUpdateItemPdu'].decode(user_data);
  135 + let rosterUpdateItems = rosterUpdateData.items;
  136 + let rosterUpdateItemsLen = rosterUpdateItems.length;
  137 + for (let i = 0; i < rosterUpdateItemsLen; ++i) {
  138 + let node = rosterUpdateItems[i];
  139 + let nodeId = node.nodeId;
  140 + let nodeData = pdu['RCNodeInfoRecordPdu'].decode(node.nodeData);
  141 + this.rosterUpdateHandler(nodeId, nodeData);
  142 + }
  143 + break;
  144 + case pdu.RCPDU_REG_TABLE_INSERT_PDU:
  145 + let tableInsertData = pdu['RCRegistryTableInsertItemPdu'].decode(user_data);
  146 + let tableInsertItems = tableInsertData.items;
  147 + let tableInsertItemsLen = tableInsertItems.length;
  148 + for (let i = 0; i < tableInsertItemsLen; ++i) {
  149 + let insertItem = tableInsertItems[i];
  150 + //loger.log("insertItem",insertItem);
  151 + this.tableInsertHandler(insertItem.owner, insertItem.itemIdx, insertItem.itemData);
  152 + }
  153 +
  154 + //文档数据数组内部自己处理数组
  155 + this.tableInsertApeHandler(tableInsertItems, seekTime);
  156 + break;
  157 + case pdu.RCPDU_REG_TABLE_DELETE_PDU:
  158 + let tableDeleteData = pdu['RCRegistryTableDeleteItemPdu'].decode(user_data);
  159 + //console.log("tableDeleteData",object_id,tableDeleteData);
  160 + this.tableDeleteHandler(object_id, tableDeleteData);
  161 + break;
  162 + case pdu.RCPDU_REG_TABLE_UPDATE_PDU:
  163 + let tableUpdateData = pdu['RCRegistryTableUpdateItemPdu'].decode(user_data);
  164 + let tableUpdateItems = tableUpdateData.items;
  165 + let tableUpdateItemsLen = tableUpdateItems.length;
  166 + //loger.log("RCRegistryTableUpdateItemPdu " + tableUpdateItemsLen);
  167 + //loger.log(tableUpdateData);
  168 +
  169 +
  170 + for (let i = 0; i < tableUpdateItemsLen; ++i) {
  171 + let tableItem = tableUpdateItems[i];
  172 + this.tableUpdateHandler(tableItem.owner, tableItem.itemIdx, tableItem.itemData, seekTime);
  173 + }
  174 +
  175 + //白板,文档数据数组内部自己处理数组
  176 + this.tableUpdateApeHandler(tableUpdateItems, seekTime);
  177 + break;
  178 + case pdu.RCPDU_REG_QUEUE_UPDATE_PDU:
  179 + case pdu.RCPDU_REG_QUEUE_DELETE_PDU:
  180 + case pdu.RCPDU_REG_QUEUE_INSERT_PDU:
  181 + loger.warn('REG QUEUE ARE IGNORED');
  182 + break;
  183 +
  184 + }
64 } 185 }
  186 + }
65 187
66 - regResponsePduHandler() { 188 + rosterInsertHandler(recordId, recordData) {
  189 + // loger.warn(this._session_name + ' rosterInsertHandler 应有子类具体覆盖处理.');
  190 + }
67 191
68 - } 192 + rosterUpdateHandler(nodeId, nodeData) {
  193 + //loger.warn(this._session_name + ' rosterUpdateHandler 应有子类具体覆盖处理.');
  194 + }
69 195
70 - //停止APE一切操作  
71 - stopApe() {  
72 - // loger.log("stopApe==============================");  
73 - } 196 + rosterDelHandler(recordData) {
  197 + //loger.warn(this._session_name + ' rosterDelHandler 应有子类具体覆盖处理.');
  198 + }
74 199
75 - // 消息处理  
76 - _pduMessageHandler(regBuffer,_seekTime) {  
77 - let seekTime=_seekTime||0;//这个只有在录制回放的时候才有  
78 - /* loger.warn('APE->收到消息处理->',GlobalConfig.mcuDelay,GlobalConfig.messageDelay);  
79 - //延迟处理消息(3个条件--->ape允许延迟&&客户端设置需要延迟&&Sass设置的延迟时间大于0)  
80 - if (this._apeDelayed&&GlobalConfig.messageDelay&&GlobalConfig.mcuDelay>0) {  
81 - loger.warn('延迟处理消息->',GlobalConfig.mcuDelay);  
82 - setTimeout(() => {  
83 - this._pduRegAdapterHandler(regBuffer,seekTime);  
84 - }, GlobalConfig.mcuDelay*1000);//mcuDelay单位是秒,这里需要换算为毫秒  
85 - return;  
86 - }  
87 -*/  
88 - //不延迟,立即处理  
89 - this._pduRegAdapterHandler(regBuffer,seekTime);  
90 - } 200 + tableInsertHandler(tableId, record) {
  201 + //loger.warn(this._session_name + ' tableInsertHandler 应有子类具体覆盖处理.');
  202 + }
91 203
92 - // 数据同步处理  
93 - _pduRegAdapterHandler(regBuffer,seekTime) {  
94 - let regPdu = pdu['RCAdapterPdu'].decode(regBuffer);  
95 - let regItems = regPdu.item;  
96 - let regItemSize = regItems.length;  
97 - //console.log("RCAdapterPdu数据同步处理",regPdu);  
98 - //loger.log(this._session_name + '数据同步消息');  
99 - //loger.log(this._session_name + '数据同步消息.同步条数', regItemSize,"seekTime->",seekTime);  
100 - for (var i = 0; i < regItemSize; ++i) {  
101 - let regItem = regItems[i];  
102 - let regItemType = regItem.type;  
103 - let regItemData = regItem.itemData;  
104 -  
105 - //根据数据包中的type处理数据是否同步  
106 -  
107 - if (pdu.RCPDU_REG_UPDATE_OBJ !== regItemType) {  
108 - if (pdu.RCPDU_REG_RESPONSE_OBJ == regItemType) {  
109 - let regResponsePdu = pdu['RCRegistryResponseObjPdu'].decode(regItemData);  
110 - this.regResponsePduHandler(regResponsePdu);  
111 - }  
112 - // 只处理两种类型  
113 - continue;  
114 - } 204 + tableUpdateHandler(ownerId, recordId, recordData, seekTime) {
  205 + //loger.warn(this._session_name + ' tableUpdateHandler 应有子类具体覆盖处理.');
  206 + }
115 207
116 - //具体的数据包  
117 - let regUpdatedItem = pdu['RCRegistryUpdateObjPdu'].decode(regItemData);  
118 - let sub_type = regUpdatedItem.subType;  
119 - let object_id = regUpdatedItem.objId;  
120 - let user_data = regUpdatedItem.userData;  
121 -  
122 - //loger.log('REG OBJECT EVENT ->', pdu.id2type(sub_type));  
123 - switch (sub_type) {  
124 - case pdu.RCPDU_REG_ROSTER_INSERT_PDU:  
125 - //let rosterInsertData = pdu['RCRegstryRosterInsertItemPdu'].decode(user_data);  
126 - //loger.log('RCPDU_REG_ROSTER_INSERT_PDU---->');  
127 - console.log(user_data);  
128 - let rosterInsertData = pdu['RCRegistryRosterInsertItemPdu'].decode(user_data);  
129 - let rosterInsertItems = rosterInsertData.items;  
130 - let rosterInsertItemsLen = rosterInsertItems.length;  
131 - for (let i = 0; i < rosterInsertItemsLen; ++i) {  
132 - let record = rosterInsertItems[i];  
133 - let recordId = record.item_id;  
134 - let recordData = pdu['RCNodeInfoRecordPdu'].decode(record.item_data);  
135 - this.rosterInsertHandler(recordId, recordData);  
136 - }  
137 - break;  
138 - case pdu.RCPDU_REG_ROSTER_DELETE_PDU:  
139 - let rosterDelData = pdu['RCRegistryRosterDeleteItemPdu'].decode(user_data);  
140 - this.rosterDelHandler(rosterDelData.nodeId);  
141 - break;  
142 - case pdu.RCPDU_REG_ROSTER_UPDATE_PDU:  
143 - let rosterUpdateData = pdu['RCRegistryRosterUpdateItemPdu'].decode(user_data);  
144 - let rosterUpdateItems = rosterUpdateData.items;  
145 - let rosterUpdateItemsLen = rosterUpdateItems.length;  
146 - for (let i = 0; i < rosterUpdateItemsLen; ++i) {  
147 - let node = rosterUpdateItems[i];  
148 - let nodeId = node.nodeId;  
149 - let nodeData = pdu['RCNodeInfoRecordPdu'].decode(node.nodeData);  
150 - this.rosterUpdateHandler(nodeId, nodeData);  
151 - }  
152 - break;  
153 - case pdu.RCPDU_REG_TABLE_INSERT_PDU:  
154 - let tableInsertData = pdu['RCRegistryTableInsertItemPdu'].decode(user_data);  
155 - let tableInsertItems = tableInsertData.items;  
156 - let tableInsertItemsLen = tableInsertItems.length;  
157 - for (let i = 0; i < tableInsertItemsLen; ++i) {  
158 - let insertItem = tableInsertItems[i];  
159 - //loger.log("insertItem",insertItem);  
160 - this.tableInsertHandler(insertItem.owner, insertItem.itemIdx, insertItem.itemData);  
161 - }  
162 -  
163 - //文档数据数组内部自己处理数组  
164 - this.tableInsertApeHandler(tableInsertItems,seekTime);  
165 - break;  
166 - case pdu.RCPDU_REG_TABLE_DELETE_PDU:  
167 - let tableDeleteData = pdu['RCRegistryTableDeleteItemPdu'].decode(user_data);  
168 - //console.log("tableDeleteData",object_id,tableDeleteData);  
169 - this.tableDeleteHandler(object_id, tableDeleteData);  
170 - break;  
171 - case pdu.RCPDU_REG_TABLE_UPDATE_PDU:  
172 - let tableUpdateData = pdu['RCRegistryTableUpdateItemPdu'].decode(user_data);  
173 - let tableUpdateItems = tableUpdateData.items;  
174 - let tableUpdateItemsLen = tableUpdateItems.length;  
175 - //loger.log("RCRegistryTableUpdateItemPdu " + tableUpdateItemsLen);  
176 - //loger.log(tableUpdateData);  
177 -  
178 -  
179 - for (let i = 0; i < tableUpdateItemsLen; ++i) {  
180 - let tableItem = tableUpdateItems[i];  
181 - this.tableUpdateHandler(tableItem.owner, tableItem.itemIdx, tableItem.itemData,seekTime);  
182 - }  
183 -  
184 - //白板,文档数据数组内部自己处理数组  
185 - this.tableUpdateApeHandler(tableUpdateItems,seekTime);  
186 - break;  
187 - case pdu.RCPDU_REG_QUEUE_UPDATE_PDU:  
188 - case pdu.RCPDU_REG_QUEUE_DELETE_PDU:  
189 - case pdu.RCPDU_REG_QUEUE_INSERT_PDU:  
190 - loger.warn('REG QUEUE ARE IGNORED');  
191 - break; 208 + tableUpdateApeHandler(tableUpdateItems, seekTime) {
192 209
193 - }  
194 - }  
195 - } 210 + }
196 211
197 - rosterInsertHandler(recordId, recordData) {  
198 - // loger.warn(this._session_name + ' rosterInsertHandler 应有子类具体覆盖处理.');  
199 - } 212 + tableInsertApeHandler(tableInsertItems, seekTime) {
200 213
201 - rosterUpdateHandler(nodeId, nodeData) {  
202 - //loger.warn(this._session_name + ' rosterUpdateHandler 应有子类具体覆盖处理.');  
203 - } 214 + }
204 215
205 - rosterDelHandler(recordData) {  
206 - //loger.warn(this._session_name + ' rosterDelHandler 应有子类具体覆盖处理.');  
207 - } 216 + tableDeleteHandler(tableId, record) {
  217 + //loger.warn(this._session_name + ' tableDelHandler 应有子类具体覆盖处理.');
  218 + }
208 219
209 - tableInsertHandler(tableId, record) {  
210 - //loger.warn(this._session_name + ' tableInsertHandler 应有子类具体覆盖处理.');  
211 - } 220 + onJoinChannelHandlerSuccess() {
  221 + //loger.warn(this._session_name + ' onJoinChannelHandlerSuccess 应有子类具体覆盖处理.');
  222 + }
212 223
213 - tableUpdateHandler(ownerId, recordId, recordData,seekTime) {  
214 - //loger.warn(this._session_name + ' tableUpdateHandler 应有子类具体覆盖处理.');  
215 - }  
216 - tableUpdateApeHandler(tableUpdateItems,seekTime){ 224 + onJoinSessionHandlerSuccess() {
  225 + //loger.warn(this._session_name + ' onJoinSessionHandlerSuccess 应有子类具体覆盖处理.');
  226 + }
217 227
218 - }  
219 - tableInsertApeHandler(tableInsertItems,seekTime){ 228 + //录制状态发生改变后ape模块数据更新
  229 + updaterRecordApeStatus(_data) {
  230 + loger.warn(this._session_name + 'updaterRecordApeStatus->应有子类具体覆盖处理.');
  231 + }
220 232
221 - }  
222 - tableDeleteHandler(tableId, record) {  
223 - //loger.warn(this._session_name + ' tableDelHandler 应有子类具体覆盖处理.');  
224 - } 233 + // 加入Session处理
  234 + _joinSessionHandler(data) {
  235 + //loger.log(this._session_name, ' -> 加入Session');
  236 + this.onJoinSessionHandlerSuccess();
  237 + }
225 238
226 - onJoinChannelHandlerSuccess() {  
227 - //loger.warn(this._session_name + ' onJoinChannelHandlerSuccess 应有子类具体覆盖处理.'); 239 + // 加入Channel处理
  240 + _joinChannelHandler(data) {
  241 + let joinedChannel = pdu['RCChannelJoinResponsePdu'].decode(data);
  242 + if (joinedChannel.result === pdu.RET_SUCCESS) {
  243 + //loger.log(this._session_name, ' -> 加入Channel成功. ChannelId', joinedChannel.requestedChannelId);
  244 + this._session_channels[joinedChannel.requestedChannelId] = ApeConsts.CJS_JOINNED;
  245 + this.onJoinChannelHandlerSuccess();
  246 + } else {
  247 + loger.warn(this._session_name, ' -> 加入Channel失败.', joinedChannel);
228 } 248 }
229 -  
230 - onJoinSessionHandlerSuccess() {  
231 - //loger.warn(this._session_name + ' onJoinSessionHandlerSuccess 应有子类具体覆盖处理.'); 249 + }
  250 +
  251 + // 依赖的课堂创建完毕 - 发起Ape加入
  252 + _mcuConferenceJoinSuccessHandler(_data) {
  253 + //loger.log('创建Ape->',
  254 + // 'SessionId',
  255 + // this._session_id,
  256 + // 'SessionName',
  257 + // this._session_name,
  258 + // 'SessionTag',
  259 + // this._session_tag);
  260 +
  261 + // 课堂依赖底层课堂信息
  262 + //this._classInfo = classInfo;
  263 + this._classInfo = GlobalConfig.getClassInfo();
  264 +
  265 + var joinSessionPdu = new pdu['RCSessionJoinRequestPdu'];
  266 + joinSessionPdu.id = this._session_id;
  267 + joinSessionPdu.name = this._session_name;
  268 + joinSessionPdu.tag = this._session_tag;
  269 + joinSessionPdu.sessionData = this._adapter_pdu.toArrayBuffer();
  270 + this.sendUniform(joinSessionPdu, true);
  271 +
  272 + var joinChannelPdu = new pdu['RCChannelJoinRequestPdu'];
  273 + joinChannelPdu.initiator = this.mcu.classInfo.nodeId;
  274 + joinChannelPdu.channelId = this._session_id;
  275 + this.send(joinChannelPdu);
  276 + }
  277 +
  278 + // 依赖的录制回放创建完毕 - 发起Ape加入
  279 + _joinRecordPlaybackSuccessHandler(_data) {
  280 + loger.log('录制回放->Ape已经创建完毕->',
  281 + 'SessionId',
  282 + this._session_id,
  283 + 'SessionName',
  284 + this._session_name,
  285 + 'SessionTag',
  286 + this._session_tag);
  287 + }
  288 +
  289 + // 注册Key对象
  290 + registerKey(id, name, tag, user_data) {
  291 + let adapterItemPdu = new pdu['RCAdapterItemPdu'];
  292 + adapterItemPdu.type = pdu.RCPDU_REG_REGISTER_KEY;
  293 +
  294 + // pack register key pdus
  295 + let registerKeyPdu = new pdu['RCRegistryRegisterKeyPdu'];
  296 + registerKeyPdu.id = id;
  297 + registerKeyPdu.name = name;
  298 + registerKeyPdu.tag = tag;
  299 + if (user_data.length) {
  300 + registerKeyPdu.userData = user_data;
232 } 301 }
233 - //录制状态发生改变后ape模块数据更新  
234 - updaterRecordApeStatus(_data){  
235 - loger.warn(this._session_name + 'updaterRecordApeStatus->应有子类具体覆盖处理.'); 302 +
  303 + adapterItemPdu.itemData = registerKeyPdu.toArrayBuffer();
  304 + this._adapter_pdu.item.push(adapterItemPdu);
  305 + }
  306 +
  307 + // 注册Object对象 等同于flash中的 RCRegistryOperator
  308 + registerObj(type, id, name, tag, owner, user_data) {
  309 + let adapterItemPdu = new pdu['RCAdapterItemPdu'];
  310 + adapterItemPdu.type = pdu.RCPDU_REG_REGISTER_OBJ;
  311 +
  312 + let registerObjPdu = new pdu['RCRegistryRegisterObjPdu'];
  313 + registerObjPdu.type = type;
  314 + registerObjPdu.objId = id;
  315 + registerObjPdu.name = name;
  316 + registerObjPdu.tag = tag;
  317 + if (owner) {
  318 + registerObjPdu.owner = owner;
236 } 319 }
237 - // 加入Session处理  
238 - _joinSessionHandler(data) {  
239 - //loger.log(this._session_name, ' -> 加入Session');  
240 - this.onJoinSessionHandlerSuccess(); 320 + if (user_data.length) {
  321 + registerObjPdu.userData = user_data;
241 } 322 }
242 323
243 - // 加入Channel处理  
244 - _joinChannelHandler(data) {  
245 - let joinedChannel = pdu['RCChannelJoinResponsePdu'].decode(data);  
246 - if (joinedChannel.result === pdu.RET_SUCCESS) {  
247 - //loger.log(this._session_name, ' -> 加入Channel成功. ChannelId', joinedChannel.requestedChannelId);  
248 - this._session_channels[joinedChannel.requestedChannelId] = ApeConsts.CJS_JOINNED;  
249 - this.onJoinChannelHandlerSuccess();  
250 - } else {  
251 - loger.warn(this._session_name, ' -> 加入Channel失败.', joinedChannel);  
252 - }  
253 - } 324 + adapterItemPdu.itemData = registerObjPdu.toArrayBuffer();
  325 + this._adapter_pdu.item.push(adapterItemPdu);
  326 + }
254 327
255 - // 依赖的课堂创建完毕 - 发起Ape加入  
256 - _mcuConferenceJoinSuccessHandler(_data) {  
257 - //loger.log('创建Ape->',  
258 - // 'SessionId',  
259 - // this._session_id,  
260 - // 'SessionName',  
261 - // this._session_name,  
262 - // 'SessionTag',  
263 - // this._session_tag);  
264 -  
265 - // 课堂依赖底层课堂信息  
266 - //this._classInfo = classInfo;  
267 - this._classInfo = GlobalConfig.getClassInfo();  
268 -  
269 - var joinSessionPdu = new pdu['RCSessionJoinRequestPdu'];  
270 - joinSessionPdu.id = this._session_id;  
271 - joinSessionPdu.name = this._session_name;  
272 - joinSessionPdu.tag = this._session_tag;  
273 - joinSessionPdu.sessionData = this._adapter_pdu.toArrayBuffer();  
274 - this.sendUniform(joinSessionPdu, true);  
275 -  
276 - var joinChannelPdu = new pdu['RCChannelJoinRequestPdu'];  
277 - joinChannelPdu.initiator = this.mcu.classInfo.nodeId;  
278 - joinChannelPdu.channelId = this._session_id;  
279 - this.send(joinChannelPdu); 328 + send(appPdu) {
  329 + //loger.log('Ape发送数据NORMAL PDU');
  330 + if (!this.mcu || !this.mcu.connected || GlobalConfig.classExit) {
  331 + this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_SEND_FAILED_NO_JOIN);
  332 + return;
280 } 333 }
281 -  
282 - // 依赖的录制回放创建完毕 - 发起Ape加入  
283 - _joinRecordPlaybackSuccessHandler(_data) {  
284 - loger.log('录制回放->Ape已经创建完毕->',  
285 - 'SessionId',  
286 - this._session_id,  
287 - 'SessionName',  
288 - this._session_name,  
289 - 'SessionTag',  
290 - this._session_tag); 334 + if (!this._classInfo) {
  335 + loger.warn('Ape发送数据NORMAL PDU->失败->ape课堂数据无效->', this._classInfo);
  336 + return;
291 } 337 }
  338 + let normalPdu = pdu.create_normal_pdu(
  339 + appPdu.type,
  340 + this._classInfo.nodeId,
  341 + this._classInfo.classId,
  342 + this._session_id,
  343 + this._channel_id,
  344 + true,
  345 + true,
  346 + PduConsts.DP_TOP,
  347 + this._classInfo.topNodeID,
  348 + PduConsts.SEG_ONCE
  349 + );
  350 + normalPdu.data = appPdu.toArrayBuffer();
  351 + // Mcu发送
  352 + this.mcu.send(normalPdu);
  353 + }
  354 +
  355 + // 发送当前APE(session uniform包)
  356 + sendUniform(appPdu, top) {
  357 + if (!this.mcu || !this.mcu.connected || GlobalConfig.classExit) {
292 358
293 - // 注册Key对象  
294 - registerKey(id, name, tag, user_data) {  
295 - let adapterItemPdu = new pdu['RCAdapterItemPdu'];  
296 - adapterItemPdu.type = pdu.RCPDU_REG_REGISTER_KEY;  
297 -  
298 - // pack register key pdus  
299 - let registerKeyPdu = new pdu['RCRegistryRegisterKeyPdu'];  
300 - registerKeyPdu.id = id;  
301 - registerKeyPdu.name = name;  
302 - registerKeyPdu.tag = tag;  
303 - if (user_data.length) {  
304 - registerKeyPdu.userData = user_data;  
305 - }  
306 -  
307 - adapterItemPdu.itemData = registerKeyPdu.toArrayBuffer();  
308 - this._adapter_pdu.item.push(adapterItemPdu);  
309 } 359 }
310 -  
311 - // 注册Object对象 等同于flash中的 RCRegistryOperator  
312 - registerObj(type, id, name, tag, owner, user_data) {  
313 - let adapterItemPdu = new pdu['RCAdapterItemPdu'];  
314 - adapterItemPdu.type = pdu.RCPDU_REG_REGISTER_OBJ;  
315 -  
316 - let registerObjPdu = new pdu['RCRegistryRegisterObjPdu'];  
317 - registerObjPdu.type = type;  
318 - registerObjPdu.objId = id;  
319 - registerObjPdu.name = name;  
320 - registerObjPdu.tag = tag;  
321 - if (owner) {  
322 - registerObjPdu.owner = owner;  
323 - }  
324 - if (user_data.length) {  
325 - registerObjPdu.userData = user_data;  
326 - }  
327 -  
328 - adapterItemPdu.itemData = registerObjPdu.toArrayBuffer();  
329 - this._adapter_pdu.item.push(adapterItemPdu); 360 + if (!this._classInfo) {
  361 + loger.warn('Ape发送数据UNIFORM PDU->失败->ape课堂数据无效->', this._classInfo);
  362 + return;
330 } 363 }
331 -  
332 - send(appPdu) {  
333 - //loger.log('Ape发送数据NORMAL PDU');  
334 - //console.log(appPdu);  
335 - //loger.log('当前的状态============',GlobalConfig.getCurrentStatus().code);  
336 - /* if (GlobalConfig.getCurrentStatus().code == 0 || GlobalConfig.getCurrentStatus().code == 1) {  
337 - this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_SEND_FAILED_NO_JOIN);  
338 - return;  
339 - }*/  
340 - if(!this.mcu||!this.mcu.connected){  
341 - this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_SEND_FAILED_NO_JOIN);  
342 - return;  
343 - }  
344 - if(!this._classInfo){  
345 - loger.warn('Ape发送数据NORMAL PDU->失败->ape课堂数据无效->', this._classInfo);  
346 - return;  
347 - }  
348 - let normalPdu = pdu.create_normal_pdu(  
349 - appPdu.type,  
350 - this._classInfo.nodeId,  
351 - this._classInfo.classId,  
352 - this._session_id,  
353 - this._channel_id,  
354 - true,  
355 - true,  
356 - PduConsts.DP_TOP,  
357 - this._classInfo.topNodeID,  
358 - PduConsts.SEG_ONCE  
359 - );  
360 - normalPdu.data = appPdu.toArrayBuffer();  
361 - // Mcu发送  
362 - this.mcu.send(normalPdu); 364 + let uniformPdu = pdu.create_uniform_pdu(
  365 + appPdu.type,
  366 + this._classInfo.nodeId,
  367 + this._classInfo.classId,
  368 + this._session_id,
  369 + top ? ApeConsts.BROADCAST_CHANNEL_ID : this._channel_id,
  370 + true,
  371 + PduConsts.DP_TOP,
  372 + top ? this._classInfo.topNodeID : (appPdu.peer || 0),
  373 + PduConsts.SEG_ONCE
  374 + );
  375 + uniformPdu.data = appPdu.toArrayBuffer();
  376 + // Mcu发送
  377 + if (this.mcu) {
  378 + this.mcu.send(uniformPdu);
  379 + } else {
  380 + loger.warn('MCU为空->无法发送消息', uniformPdu);
363 } 381 }
364 382
365 - // 发送当前APE(session uniform包)  
366 - sendUniform(appPdu, top) {  
367 - if(!this._classInfo){  
368 - loger.warn('Ape发送数据UNIFORM PDU->失败->ape课堂数据无效->', this._classInfo);  
369 - return;  
370 - }  
371 - let uniformPdu = pdu.create_uniform_pdu(  
372 - appPdu.type,  
373 - this._classInfo.nodeId,  
374 - this._classInfo.classId,  
375 - this._session_id,  
376 - top ? ApeConsts.BROADCAST_CHANNEL_ID : this._channel_id,  
377 - true,  
378 - PduConsts.DP_TOP,  
379 - top ? this._classInfo.topNodeID : (appPdu.peer || 0),  
380 - PduConsts.SEG_ONCE  
381 - );  
382 - uniformPdu.data = appPdu.toArrayBuffer();  
383 - // Mcu发送  
384 - if(this.mcu){  
385 - this.mcu.send(uniformPdu);  
386 - }else {  
387 - loger.warn('MCU为空->无法发送消息',uniformPdu);  
388 - } 383 + }
389 384
  385 + sendChatUniform(appPdu, top) {
  386 + //loger.log('当前的状态============',GlobalConfig.getCurrentStatus().code);
  387 + if (!this.mcu || !this.mcu.connected || GlobalConfig.classExit) {
  388 + this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_SEND_FAILED_NO_JOIN);
  389 + return;
390 } 390 }
391 -  
392 - sendChatUniform(appPdu, top) {  
393 - //console.log(appPdu);  
394 - //loger.log('当前的状态============',GlobalConfig.getCurrentStatus().code);  
395 - if (GlobalConfig.getCurrentStatus().code == 0 || GlobalConfig.getCurrentStatus().code == 1) {  
396 - this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_SEND_FAILED_NO_JOIN);  
397 - return;  
398 - }  
399 - if(!this._classInfo){  
400 - loger.warn("课堂数据还未获取,不能发送消息");  
401 - return;  
402 - }  
403 - let uniformPdu = pdu.create_uniform_pdu(  
404 - appPdu.type,  
405 - this._classInfo.nodeId,  
406 - this._classInfo.classId,  
407 - this._session_id,  
408 - top ? ApeConsts.BROADCAST_CHANNEL_ID : this._channel_id,  
409 - true,  
410 - PduConsts.DP_TOP,  
411 - 0,//flash中这个值设置为0  
412 - PduConsts.SEG_ONCE  
413 - );  
414 - uniformPdu.data = appPdu.toArrayBuffer();  
415 - //loger.log('Ape发送数据UNIFORM PDU',uniformPdu);  
416 - // Mcu发送  
417 - this.mcu.send(uniformPdu); 391 + if (!this._classInfo) {
  392 + loger.warn("课堂数据还未获取,不能发送消息");
  393 + return;
418 } 394 }
  395 + let uniformPdu = pdu.create_uniform_pdu(
  396 + appPdu.type,
  397 + this._classInfo.nodeId,
  398 + this._classInfo.classId,
  399 + this._session_id,
  400 + top ? ApeConsts.BROADCAST_CHANNEL_ID : this._channel_id,
  401 + true,
  402 + PduConsts.DP_TOP,
  403 + 0,//flash中这个值设置为0
  404 + PduConsts.SEG_ONCE
  405 + );
  406 + uniformPdu.data = appPdu.toArrayBuffer();
  407 + //loger.log('Ape发送数据UNIFORM PDU',uniformPdu);
  408 + // Mcu发送
  409 + this.mcu.send(uniformPdu);
  410 + }
419 } 411 }
420 412
@@ -194,16 +194,16 @@ ApeConsts.MUSIC_SESSION_TAG = "mis-tag"; @@ -194,16 +194,16 @@ ApeConsts.MUSIC_SESSION_TAG = "mis-tag";
194 ApeConsts.SCREENSHARING_SESSION_TAG = "scr-tag"; 194 ApeConsts.SCREENSHARING_SESSION_TAG = "scr-tag";
195 ApeConsts.QUESTION_SESSION_TAG = "qst-tag"; 195 ApeConsts.QUESTION_SESSION_TAG = "qst-tag";
196 196
197 -ApeConsts.CONFERENCE_OBJ_ROSTER_ID = ((ApeConsts.CONFERENCE_SESSION_ID << 16) + 1); 197 +ApeConsts.CONFERENCE_OBJ_ROSTER_ID = ((ApeConsts.CONFERENCE_SESSION_ID << 16) + 1);//720897
198 ApeConsts.CONFERENCE_OBJ_ROSTER_NAME = "node list"; 198 ApeConsts.CONFERENCE_OBJ_ROSTER_NAME = "node list";
199 ApeConsts.CONFERENCE_OBJ_ROSTER_TAG = "node list tag"; 199 ApeConsts.CONFERENCE_OBJ_ROSTER_TAG = "node list tag";
200 200
201 -ApeConsts.CONFERENCE_OBJ_QUEUE_ID = ((ApeConsts.CONFERENCE_SESSION_ID << 16) + 2); 201 +ApeConsts.CONFERENCE_OBJ_QUEUE_ID = ((ApeConsts.CONFERENCE_SESSION_ID << 16) + 2);//720898
202 ApeConsts.CONFERENCE_OBJ_QUEUE_NAME = "mic list"; 202 ApeConsts.CONFERENCE_OBJ_QUEUE_NAME = "mic list";
203 ApeConsts.CONFERENCE_OBJ_QUEUE_TAG = "mic list tag"; 203 ApeConsts.CONFERENCE_OBJ_QUEUE_TAG = "mic list tag";
204 204
205 // conference tab pages 205 // conference tab pages
206 -ApeConsts.CONFERENCE_OBJ_TABLE_ID = ((ApeConsts.CONFERENCE_SESSION_ID << 16) + 3); 206 +ApeConsts.CONFERENCE_OBJ_TABLE_ID = ((ApeConsts.CONFERENCE_SESSION_ID << 16) + 3);//720899
207 ApeConsts.CONFERENCE_OBJ_TABLE_NAME = "tabbar list"; 207 ApeConsts.CONFERENCE_OBJ_TABLE_NAME = "tabbar list";
208 ApeConsts.CONFERENCE_OBJ_TABLE_TAG = "tabbar list tag"; 208 ApeConsts.CONFERENCE_OBJ_TABLE_TAG = "tabbar list tag";
209 209
@@ -23,6 +23,7 @@ class ConferApe extends Ape { @@ -23,6 +23,7 @@ class ConferApe extends Ape {
23 ApeConsts.CONFERENCE_SESSION_NAME, 23 ApeConsts.CONFERENCE_SESSION_NAME,
24 ApeConsts.CONFERENCE_SESSION_TAG 24 ApeConsts.CONFERENCE_SESSION_TAG
25 ); 25 );
  26 + this.isSendInsterRoster=false;//这个很重要,每次MCU连接成功之后只发一次
26 this.isLeave=false;//记录自己是否已经离开 27 this.isLeave=false;//记录自己是否已经离开
27 this.rosters = {}; //用户列表 28 this.rosters = {}; //用户列表
28 this.rosterLen = 0;//当前课堂人数 29 this.rosterLen = 0;//当前课堂人数
@@ -57,8 +58,11 @@ class ConferApe extends Ape { @@ -57,8 +58,11 @@ class ConferApe extends Ape {
57 58
58 //加入课堂 59 //加入课堂
59 _joinSessionHandler(_data) { 60 _joinSessionHandler(_data) {
60 - //let nodeInfoRecordPdu = this.mcu.mcuClassInfo.self;  
61 - let nodeInfoRecordPdu = this.getNodeInfo(); 61 + if(this.isSendInsterRoster){
  62 + loger.warn("已经发送过insertRoster,不能再次发送");
  63 + return
  64 + }
  65 + let nodeInfoRecordPdu = this.getNodeInfo();
62 66
63 let userDataPdu = new pdu['RCNodeInfoUserDataPdu']; 67 let userDataPdu = new pdu['RCNodeInfoUserDataPdu'];
64 userDataPdu.qq = ''; 68 userDataPdu.qq = '';
@@ -67,14 +71,12 @@ class ConferApe extends Ape { @@ -67,14 +71,12 @@ class ConferApe extends Ape {
67 nodeInfoRecordPdu.userData = userDataPdu.toArrayBuffer(); 71 nodeInfoRecordPdu.userData = userDataPdu.toArrayBuffer();
68 nodeInfoRecordPdu.deviceType = GlobalConfig.deviceType; //设备类型 72 nodeInfoRecordPdu.deviceType = GlobalConfig.deviceType; //设备类型
69 73
70 - //loger.log('开始加入->', nodeInfoRecordPdu);  
71 -  
72 let item = new pdu['RCRegistryRosterItemPdu']; 74 let item = new pdu['RCRegistryRosterItemPdu'];
73 item.nodeId = nodeInfoRecordPdu.nodeId; 75 item.nodeId = nodeInfoRecordPdu.nodeId;
74 item.nodeData = nodeInfoRecordPdu.toArrayBuffer(); 76 item.nodeData = nodeInfoRecordPdu.toArrayBuffer();
75 77
76 let rosterUpdateItem = new pdu['RCRegistryRosterInsertItemPdu']; 78 let rosterUpdateItem = new pdu['RCRegistryRosterInsertItemPdu'];
77 - rosterUpdateItem.type = pdu.RCPDU_REG_ROSTER_UPDATE_PDU; 79 + rosterUpdateItem.type =pdu.RCPDU_REG_ROSTER_UPDATE_PDU;// pdu.RCPDU_REG_ROSTER_INSERT_PDU 暂时用update的类型,MCU第一次会当insert处理,目前insert解包出错
78 rosterUpdateItem.items.push(item); 80 rosterUpdateItem.items.push(item);
79 81
80 let updateObjPdu = new pdu['RCRegistryUpdateObjPdu']; 82 let updateObjPdu = new pdu['RCRegistryUpdateObjPdu'];
@@ -91,6 +93,9 @@ class ConferApe extends Ape { @@ -91,6 +93,9 @@ class ConferApe extends Ape {
91 adapterPdu.type = pdu.RCPDU_REG_ADAPTER; 93 adapterPdu.type = pdu.RCPDU_REG_ADAPTER;
92 adapterPdu.item.push(adapterItemPdu); 94 adapterPdu.item.push(adapterItemPdu);
93 this.sendUniform(adapterPdu, true); 95 this.sendUniform(adapterPdu, true);
  96 +
  97 + this.isSendInsterRoster=true;
  98 + loger.log('发送insertRoster->', nodeInfoRecordPdu);
94 } 99 }
95 100
96 //获取角色信息 101 //获取角色信息
@@ -289,7 +294,7 @@ class ConferApe extends Ape { @@ -289,7 +294,7 @@ class ConferApe extends Ape {
289 loger.warn('目前已经是录制状态->当前课堂人数:' + this.rosterLen); 294 loger.warn('目前已经是录制状态->当前课堂人数:' + this.rosterLen);
290 return false; 295 return false;
291 } 296 }
292 - //如果是host或者当前课堂只有1个人 297 + //如果是host或者当前课堂只有1个人,并且不是H5
293 if (this.checkHasRecordControl()) { 298 if (this.checkHasRecordControl()) {
294 loger.warn('开启录制', "isHost", GlobalConfig.isHost, "recordStatus", GlobalConfig.recordStatus, "当前人数:" + this.rosterLen); 299 loger.warn('开启录制', "isHost", GlobalConfig.isHost, "recordStatus", GlobalConfig.recordStatus, "当前人数:" + this.rosterLen);
295 //如果录制的文件名不存在,需要创建一个名字 300 //如果录制的文件名不存在,需要创建一个名字
@@ -619,6 +624,9 @@ class ConferApe extends Ape { @@ -619,6 +624,9 @@ class ConferApe extends Ape {
619 sendUpdaterClassStatusInfo(_param) { 624 sendUpdaterClassStatusInfo(_param) {
620 //{"actionType": 1,isStopAllPublishMedia:false} //actionType课堂状态 isStopAllPublishMedia是否停止当前的所有推流 625 //{"actionType": 1,isStopAllPublishMedia:false} //actionType课堂状态 isStopAllPublishMedia是否停止当前的所有推流
621 //console.log('发送更新课堂信息->'); 626 //console.log('发送更新课堂信息->');
  627 + if(GlobalConfig.classType==ApeConsts.CLASS_TYPE_ZHIBO&&GlobalConfig.isH5==true){
  628 + return;
  629 + }
622 if (_param == null || EngineUtils.isEmptyObject(_param)) { 630 if (_param == null || EngineUtils.isEmptyObject(_param)) {
623 loger.log('发送更新课堂信息->参数错误'); 631 loger.log('发送更新课堂信息->参数错误');
624 this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG); 632 this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
@@ -733,6 +741,10 @@ class ConferApe extends Ape { @@ -733,6 +741,10 @@ class ConferApe extends Ape {
733 //更新录制进行时间 741 //更新录制进行时间
734 GlobalConfig.recordTimestamp = GlobalConfig.recordTimestamp + 1; 742 GlobalConfig.recordTimestamp = GlobalConfig.recordTimestamp + 1;
735 if (this.checkHasRecordControl()) { 743 if (this.checkHasRecordControl()) {
  744 +
  745 + if(GlobalConfig.classType==ApeConsts.CLASS_TYPE_ZHIBO&&GlobalConfig.isH5==true){
  746 + return;
  747 + }
736 //以一定的时间间隔同步课堂内所有人的累积上课时间 748 //以一定的时间间隔同步课堂内所有人的累积上课时间
737 if (GlobalConfig.recordTimestamp % GlobalConfig.updateRecordTimeDelay == 0) { 749 if (GlobalConfig.recordTimestamp % GlobalConfig.updateRecordTimeDelay == 0) {
738 //保存数据到Sass 750 //保存数据到Sass
@@ -945,7 +957,6 @@ class ConferApe extends Ape { @@ -945,7 +957,6 @@ class ConferApe extends Ape {
945 } 957 }
946 958
947 rosterInsertHandler(nodeId, nodeData) { 959 rosterInsertHandler(nodeId, nodeData) {
948 - //loger.log("人员进入--->");  
949 if (GlobalConfig.nodeId == nodeId) { 960 if (GlobalConfig.nodeId == nodeId) {
950 loger.log("人员进入课堂模块--->自己"); 961 loger.log("人员进入课堂模块--->自己");
951 } else { 962 } else {
@@ -1026,8 +1037,10 @@ class ConferApe extends Ape { @@ -1026,8 +1037,10 @@ class ConferApe extends Ape {
1026 loger.log("人员加入->", newNodeData); 1037 loger.log("人员加入->", newNodeData);
1027 } 1038 }
1028 1039
1029 - this._emit(MessageTypes.CLASS_INSERT_ROSTER, {"nodeId": nodeId, "nodeData": newNodeData});  
1030 - this.emitRosterChange(); 1040 + if(!GlobalConfig.isH5){
  1041 + this._emit(MessageTypes.CLASS_INSERT_ROSTER, {"nodeId": nodeId, "nodeData": newNodeData});
  1042 + this.emitRosterChange();
  1043 + }
1031 } else { 1044 } else {
1032 //loger.log("更新人员列表数据,rosterExists已经存在",rosterExists); 1045 //loger.log("更新人员列表数据,rosterExists已经存在",rosterExists);
1033 this.rosterLen = Object.keys(this.rosters).length; 1046 this.rosterLen = Object.keys(this.rosters).length;
@@ -1038,7 +1051,10 @@ class ConferApe extends Ape { @@ -1038,7 +1051,10 @@ class ConferApe extends Ape {
1038 loger.log("人员更新信息->", newNodeData); 1051 loger.log("人员更新信息->", newNodeData);
1039 } 1052 }
1040 } 1053 }
1041 - this._emit(MessageTypes.CLASS_UPDATE_ROSTER, {"nodeId": nodeId, "nodeData": newNodeData}); 1054 + if(!GlobalConfig.isH5){
  1055 + this._emit(MessageTypes.CLASS_UPDATE_ROSTER, {"nodeId": nodeId, "nodeData": newNodeData});
  1056 + }
  1057 +
1042 } 1058 }
1043 } 1059 }
1044 1060
@@ -1105,29 +1121,33 @@ class ConferApe extends Ape { @@ -1105,29 +1121,33 @@ class ConferApe extends Ape {
1105 this.rosterLen = Object.keys(this.rosters).length; 1121 this.rosterLen = Object.keys(this.rosters).length;
1106 GlobalConfig.rosterNumber = this.rosterLen;//记录当前的总人数 1122 GlobalConfig.rosterNumber = this.rosterLen;//记录当前的总人数
1107 1123
1108 - this.emitRosterChange();  
1109 - this._emit(MessageTypes.CLASS_DELETE_ROSTER, {"nodeId": nodeId, "rosterLen": this.rosterLen});  
1110 -  
1111 - //当前人员列表中抽一个人来检查离开人员是否占用频道  
1112 - for (let key in this.rosters) {  
1113 - let randNodeId = parseInt(key);  
1114 - //判断是否是自己就处理以下操作  
1115 - if (randNodeId == GlobalConfig.nodeId) {  
1116 - loger.log("检查离开的人员是否占用channel");  
1117 - this._emit(MessageTypes.CLASS_NONENTITY_ROSTER, {"nodeId": nodeId, "rosterLen": this.rosterLen});  
1118 - //如果离开的人员是老师,需要暂停当前的课堂  
1119 - if (user && user.role == ApeConsts.NR_HOST) {  
1120 - this.pauseClass(); 1124 + if(!GlobalConfig.isH5) {
  1125 + this.emitRosterChange();
  1126 + this._emit(MessageTypes.CLASS_DELETE_ROSTER, {"nodeId": nodeId, "rosterLen": this.rosterLen});
  1127 +
  1128 + //当前人员列表中抽一个人来检查离开人员是否占用频道
  1129 + for (let key in this.rosters) {
  1130 + let randNodeId = parseInt(key);
  1131 + //判断是否是自己就处理以下操作
  1132 + if (randNodeId == GlobalConfig.nodeId) {
  1133 + loger.log("检查离开的人员是否占用channel");
  1134 + this._emit(MessageTypes.CLASS_NONENTITY_ROSTER, {"nodeId": nodeId, "rosterLen": this.rosterLen});
  1135 + //如果离开的人员是老师,需要暂停当前的课堂
  1136 + if (user && user.role == ApeConsts.NR_HOST) {
  1137 + this.pauseClass();
  1138 + }
1121 } 1139 }
  1140 + return;
1122 } 1141 }
1123 - return;  
1124 } 1142 }
1125 } 1143 }
1126 } 1144 }
1127 1145
1128 //广播当前的人数 1146 //广播当前的人数
1129 emitRosterChange() { 1147 emitRosterChange() {
1130 - this._emit(MessageTypes.CLASS_UPDATE_ROSTER_NUM, Object.keys(this.rosters).length); 1148 + if(!GlobalConfig.isH5){
  1149 + this._emit(MessageTypes.CLASS_UPDATE_ROSTER_NUM, Object.keys(this.rosters).length);
  1150 + }
1131 } 1151 }
1132 1152
1133 ///////数据的封包和解包///////////////////////////////////////// 1153 ///////数据的封包和解包/////////////////////////////////////////
@@ -1206,6 +1226,7 @@ class ConferApe extends Ape { @@ -1206,6 +1226,7 @@ class ConferApe extends Ape {
1206 GlobalConfig.rosterNumber = this.rosterLen; 1226 GlobalConfig.rosterNumber = this.rosterLen;
1207 GlobalConfig.rosters = this.rosters; 1227 GlobalConfig.rosters = this.rosters;
1208 this.isLeave=true; 1228 this.isLeave=true;
  1229 + this.isSendInsterRoster=false;
1209 } 1230 }
1210 1231
1211 } 1232 }
@@ -406,6 +406,12 @@ class VideoApe extends Ape { @@ -406,6 +406,12 @@ class VideoApe extends Ape {
406 loger.warn(GlobalConfig.getCurrentStatus()); 406 loger.warn(GlobalConfig.getCurrentStatus());
407 return {"code": ApeConsts.RETURN_FAILED, "data": "已经断开连接"}; 407 return {"code": ApeConsts.RETURN_FAILED, "data": "已经断开连接"};
408 } 408 }
  409 + clearTimeout(this.releaseTimeId);
  410 + if(GlobalConfig.classType==ApeConsts.CLASS_TYPE_ZHIBO&&GlobalConfig.isH5){
  411 + //直播时H5不处理
  412 + return;
  413 + }
  414 +
409 loger.log("释放nodeId占用的所有频道->", nodeId); 415 loger.log("释放nodeId占用的所有频道->", nodeId);
410 let openingChannelInfo = this.mediaModule.getOpeningMediaChannelForNodeId(nodeId); 416 let openingChannelInfo = this.mediaModule.getOpeningMediaChannelForNodeId(nodeId);
411 if (openingChannelInfo.channelId == 0) { 417 if (openingChannelInfo.channelId == 0) {
@@ -423,10 +429,6 @@ class VideoApe extends Ape { @@ -423,10 +429,6 @@ class VideoApe extends Ape {
423 429
424 this.sendTableUpdateHandler(channelInfo); 430 this.sendTableUpdateHandler(channelInfo);
425 //递归检查,800毫秒之后执行 431 //递归检查,800毫秒之后执行
426 - clearTimeout(this.releaseTimeId);  
427 - if(GlobalConfig.classType==ApeConsts.CLASS_TYPE_ZHIBO&&GlobalConfig.isH5){  
428 - return;  
429 - }  
430 this.releaseTimeId = setTimeout(function () { 432 this.releaseTimeId = setTimeout(function () {
431 loger.warn(nodeId, "检查频道是否占用"); 433 loger.warn(nodeId, "检查频道是否占用");
432 this._releaseNodeIdAllChannel(nodeId); 434 this._releaseNodeIdAllChannel(nodeId);
@@ -501,7 +503,10 @@ class VideoApe extends Ape { @@ -501,7 +503,10 @@ class VideoApe extends Ape {
501 //已经离开课堂就不再做处理 503 //已经离开课堂就不再做处理
502 return; 504 return;
503 } 505 }
504 - 506 + if(GlobalConfig.classType==ApeConsts.CLASS_TYPE_ZHIBO&&GlobalConfig.isH5){
  507 + //直播时H5不做处理
  508 + return;
  509 + }
505 let updateModelPdu = this.packPdu(_channelInfo, _channelInfo.channelId);//let updateModelPdu=this.packPdu({},ApeConsts.VIDEO_OBJ_TABLE_ID+2); 510 let updateModelPdu = this.packPdu(_channelInfo, _channelInfo.channelId);//let updateModelPdu=this.packPdu({},ApeConsts.VIDEO_OBJ_TABLE_ID+2);
506 511
507 if (updateModelPdu == null) { 512 if (updateModelPdu == null) {