李勇

1.添加人员进入和人员离开的监听

2.修改变量定义命名
@@ -73,7 +73,7 @@ return /******/ (function(modules) { // webpackBootstrap @@ -73,7 +73,7 @@ return /******/ (function(modules) { // webpackBootstrap
73 /******/ } 73 /******/ }
74 74
75 /******/ var hotApplyOnUpdate = true; 75 /******/ var hotApplyOnUpdate = true;
76 -/******/ var hotCurrentHash = "6e29fc3a1208eaf1fcd2"; // eslint-disable-line no-unused-vars 76 +/******/ var hotCurrentHash = "334c795f44fe3fd40f79"; // eslint-disable-line no-unused-vars
77 /******/ var hotCurrentModuleData = {}; 77 /******/ var hotCurrentModuleData = {};
78 /******/ var hotCurrentParents = []; // eslint-disable-line no-unused-vars 78 /******/ var hotCurrentParents = []; // eslint-disable-line no-unused-vars
79 79
@@ -788,7 +788,7 @@ return /******/ (function(modules) { // webpackBootstrap @@ -788,7 +788,7 @@ return /******/ (function(modules) { // webpackBootstrap
788 _wb_ape.on('*', function (type, data) { 788 _wb_ape.on('*', function (type, data) {
789 return _this._emit(type, data); 789 return _this._emit(type, data);
790 }); 790 });
791 - _wb_ape.on(_MessageTypes2.default.ANNO_UPDATE, _this.annoUpdateHandler.bind(_this)); 791 + _wb_ape.on(_MessageTypes2.default.ANNOTATION_UPDATE, _this.annoUpdateHandler.bind(_this));
792 792
793 //公开外部调用的方法 793 //公开外部调用的方法
794 _this.init = _this._init; 794 _this.init = _this._init;
@@ -976,7 +976,7 @@ return /******/ (function(modules) { // webpackBootstrap @@ -976,7 +976,7 @@ return /******/ (function(modules) { // webpackBootstrap
976 } 976 }
977 } 977 }
978 978
979 - // 白板笔记更新 979 + // 白板笔记更新(svg)
980 980
981 }, { 981 }, {
982 key: 'annoUpdateHandler', 982 key: 'annoUpdateHandler',
@@ -984,7 +984,7 @@ return /******/ (function(modules) { // webpackBootstrap @@ -984,7 +984,7 @@ return /******/ (function(modules) { // webpackBootstrap
984 var activeDocId = _confer_ape.activeDocId; 984 var activeDocId = _confer_ape.activeDocId;
985 var docItem = _doc_ape.docList[activeDocId]; 985 var docItem = _doc_ape.docList[activeDocId];
986 if (docItem && annoInfo.id == docItem.wbid) { 986 if (docItem && annoInfo.id == docItem.wbid) {
987 - this._emit(_MessageTypes2.default.DOC_ANNO, annoInfo); 987 + this._emit(_MessageTypes2.default.DOC_ANNOTATION, annoInfo);
988 } 988 }
989 } 989 }
990 990
@@ -996,9 +996,9 @@ return /******/ (function(modules) { // webpackBootstrap @@ -996,9 +996,9 @@ return /******/ (function(modules) { // webpackBootstrap
996 loger.log('Doc Show ->' + docItem.id + '|' + docItem.curPageNo); 996 loger.log('Doc Show ->' + docItem.id + '|' + docItem.curPageNo);
997 var annoInfo = _wb_ape.annoInfos[docItem.wbid]; 997 var annoInfo = _wb_ape.annoInfos[docItem.wbid];
998 if (annoInfo) { 998 if (annoInfo) {
999 - this._emit(_MessageTypes2.default.DOC_ANNO, annoInfo); 999 + this._emit(_MessageTypes2.default.DOC_ANNOTATION, annoInfo);
1000 } else { 1000 } else {
1001 - this._emit(_MessageTypes2.default.DOC_ANNO); 1001 + this._emit(_MessageTypes2.default.DOC_ANNOTATION);
1002 } 1002 }
1003 } 1003 }
1004 1004
@@ -1581,6 +1581,15 @@ return /******/ (function(modules) { // webpackBootstrap @@ -1581,6 +1581,15 @@ return /******/ (function(modules) { // webpackBootstrap
1581 this._log(Loger.ERROR, msg); 1581 this._log(Loger.ERROR, msg);
1582 } 1582 }
1583 }, { 1583 }, {
  1584 + key: 'data',
  1585 + value: function data() {
  1586 + for (var _len4 = arguments.length, msg = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
  1587 + msg[_key4] = arguments[_key4];
  1588 + }
  1589 +
  1590 + this._log(Loger.DATA, msg);
  1591 + }
  1592 + }, {
1584 key: '_log', 1593 key: '_log',
1585 value: function _log(type, msg) { 1594 value: function _log(type, msg) {
1586 msg = JSON.stringify(msg); 1595 msg = JSON.stringify(msg);
@@ -1597,6 +1606,9 @@ return /******/ (function(modules) { // webpackBootstrap @@ -1597,6 +1606,9 @@ return /******/ (function(modules) { // webpackBootstrap
1597 case Loger.ERROR: 1606 case Loger.ERROR:
1598 console.error(logMsg); 1607 console.error(logMsg);
1599 break; 1608 break;
  1609 + case Loger.DATA:
  1610 + console.log(logMsg);
  1611 + break;
1600 } 1612 }
1601 } 1613 }
1602 } 1614 }
@@ -1610,7 +1622,7 @@ return /******/ (function(modules) { // webpackBootstrap @@ -1610,7 +1622,7 @@ return /******/ (function(modules) { // webpackBootstrap
1610 Loger.ERROR = 2; 1622 Loger.ERROR = 2;
1611 Loger.NO = Infinity; 1623 Loger.NO = Infinity;
1612 Loger.logLevel = Loger.LOG; 1624 Loger.logLevel = Loger.LOG;
1613 - 1625 + Loger.DATA = 5;
1614 var _default = { 1626 var _default = {
1615 getLoger: function getLoger(info) { 1627 getLoger: function getLoger(info) {
1616 return new Loger(info); 1628 return new Loger(info);
@@ -1621,7 +1633,8 @@ return /******/ (function(modules) { // webpackBootstrap @@ -1621,7 +1633,8 @@ return /******/ (function(modules) { // webpackBootstrap
1621 LOG: Loger.LOG, 1633 LOG: Loger.LOG,
1622 WARN: Loger.WARN, 1634 WARN: Loger.WARN,
1623 ERROR: Loger.ERROR, 1635 ERROR: Loger.ERROR,
1624 - NO: Loger.NO 1636 + NO: Loger.NO,
  1637 + DATA: Loger.DATA
1625 }; 1638 };
1626 exports.default = _default; 1639 exports.default = _default;
1627 ; 1640 ;
@@ -1676,24 +1689,28 @@ return /******/ (function(modules) { // webpackBootstrap @@ -1676,24 +1689,28 @@ return /******/ (function(modules) { // webpackBootstrap
1676 //会议信息和操作事件定义 1689 //会议信息和操作事件定义
1677 MessageTypes.CLASS_SHOW_DETAIL = 'class_detail.message'; 1690 MessageTypes.CLASS_SHOW_DETAIL = 'class_detail.message';
1678 MessageTypes.CLASS_SHOW_ROSTER_NUM = 'roster_num.message'; 1691 MessageTypes.CLASS_SHOW_ROSTER_NUM = 'roster_num.message';
  1692 + MessageTypes.CLASS_INSERT_ROSTER = 'roster_insert.message';
  1693 + MessageTypes.CLASS_DELETE_ROSTER = 'roster_delete.message';
1679 MessageTypes.CLASS_EXIT = 'class.exit'; 1694 MessageTypes.CLASS_EXIT = 'class.exit';
1680 1695
1681 //聊天模块事件定义 1696 //聊天模块事件定义
1682 - MessageTypes.CHAT_RECEIVE = 'chat.message'; 1697 + MessageTypes.CHAT_RECEIVE = 'chat.receive';
1683 1698
1684 //视频模块事件定义 1699 //视频模块事件定义
1685 - MessageTypes.VIDEO_SHOW = 'video.message'; 1700 + MessageTypes.VIDEO_RECEIVE = 'video.receive';
1686 1701
1687 //文档模块事件定义 1702 //文档模块事件定义
1688 - MessageTypes.DOC_SHOW = 'document.message'; 1703 + MessageTypes.DOC_SHOW = 'document.show';
1689 MessageTypes.DOC_SWITCH = 'document.switch'; 1704 MessageTypes.DOC_SWITCH = 'document.switch';
1690 MessageTypes.DOC_UPDATE = 'document.update'; 1705 MessageTypes.DOC_UPDATE = 'document.update';
1691 MessageTypes.DOC_DEL = 'document.delete'; 1706 MessageTypes.DOC_DEL = 'document.delete';
1692 - MessageTypes.DOC_ANNO = 'document.anno'; //笔记 1707 + MessageTypes.DOC_ANNOTATION = 'document.annotation'; //笔记
1693 1708
1694 //笔记事件定义 1709 //笔记事件定义
1695 - MessageTypes.ANNO_UPDATE = 'anno_update';  
1696 - MessageTypes.AUDIO_SHOW = 'audio.message'; 1710 + MessageTypes.ANNOTATION_UPDATE = 'annotation.update';
  1711 +
  1712 + //音频
  1713 + MessageTypes.AUDIO_RECEIVE = 'audio.receive';
1697 1714
1698 //错误事件定义 1715 //错误事件定义
1699 MessageTypes.NET_ERROR = 'net_error'; 1716 MessageTypes.NET_ERROR = 'net_error';
@@ -2314,7 +2331,7 @@ return /******/ (function(modules) { // webpackBootstrap @@ -2314,7 +2331,7 @@ return /******/ (function(modules) { // webpackBootstrap
2314 2331
2315 var pduMsg = _index2.default.create_join_class_request_pdu(joinRequestPdu.type, confInfo.nodeId, confInfo.confId, 0, _ApeConsts2.default.BROADCAST_CHANNEL_ID, true, _PduConsts2.default.DP_TOP, confInfo.topNodeID, _PduConsts2.default.SEG_ONCE); 2332 var pduMsg = _index2.default.create_join_class_request_pdu(joinRequestPdu.type, confInfo.nodeId, confInfo.confId, 0, _ApeConsts2.default.BROADCAST_CHANNEL_ID, true, _PduConsts2.default.DP_TOP, confInfo.topNodeID, _PduConsts2.default.SEG_ONCE);
2316 2333
2317 - pduMsg.set("site", confInfo.siteId); 2334 + pduMsg.set("site", confInfo.siteId); //课堂号对应的名称
2318 pduMsg.set("userId", confInfo.userId); 2335 pduMsg.set("userId", confInfo.userId);
2319 pduMsg.set("userName", _base64Js2.default.fromByteArray(_ArrayBufferUtil2.default.strToUint8Array(confInfo.userName))); 2336 pduMsg.set("userName", _base64Js2.default.fromByteArray(_ArrayBufferUtil2.default.strToUint8Array(confInfo.userName)));
2320 pduMsg.set("userRole", confInfo.userRole); 2337 pduMsg.set("userRole", confInfo.userRole);
@@ -2332,12 +2349,14 @@ return /******/ (function(modules) { // webpackBootstrap @@ -2332,12 +2349,14 @@ return /******/ (function(modules) { // webpackBootstrap
2332 var pduMsg = _index2.default.decode_pdu(data); 2349 var pduMsg = _index2.default.decode_pdu(data);
2333 var pduType = pduMsg.get("type"); 2350 var pduType = pduMsg.get("type");
2334 var pduData = pduMsg.get("data"); 2351 var pduData = pduMsg.get("data");
  2352 + //loger.data('MCU-FirstLayer封装消息', 'type', pdu.id2type(pduMsg.type), pduMsg.type, 'sessionId', ApeConsts(pduMsg.sessionId), pduMsg.sessionId);
2335 loger.log('MCU-FirstLayer封装消息', 'type', _index2.default.id2type(pduMsg.type), pduMsg.type, 'sessionId', (0, _ApeConsts2.default)(pduMsg.sessionId), pduMsg.sessionId); 2353 loger.log('MCU-FirstLayer封装消息', 'type', _index2.default.id2type(pduMsg.type), pduMsg.type, 'sessionId', (0, _ApeConsts2.default)(pduMsg.sessionId), pduMsg.sessionId);
2336 switch (pduType) { 2354 switch (pduType) {
2337 case _PduType2.default.RCPDU_CONNECT_PROVIDER_RESPONSE: 2355 case _PduType2.default.RCPDU_CONNECT_PROVIDER_RESPONSE:
2338 //加入会议请求返回数据处理 2356 //加入会议请求返回数据处理
2339 var joinConfPdu = _index2.default['RCConferenceJoinResponsePdu'].decode(pduData); 2357 var joinConfPdu = _index2.default['RCConferenceJoinResponsePdu'].decode(pduData);
2340 var pduResultCode = joinConfPdu.get("result"); 2358 var pduResultCode = joinConfPdu.get("result");
  2359 + loger.warn('RCPDU_CONNECT_PROVIDER_RESPONSE ->pduResultCode:' + pduResultCode);
2341 switch (pduResultCode) { 2360 switch (pduResultCode) {
2342 case _PduConsts2.default.RET_SUCCESS: 2361 case _PduConsts2.default.RET_SUCCESS:
2343 //加入成功 2362 //加入成功
@@ -13270,8 +13289,15 @@ return /******/ (function(modules) { // webpackBootstrap @@ -13270,8 +13289,15 @@ return /******/ (function(modules) { // webpackBootstrap
13270 }); 13289 });
13271 exports.default = RCPduPackage; 13290 exports.default = RCPduPackage;
13272 function RCPduPackage(targe_type_id) {}; 13291 function RCPduPackage(targe_type_id) {};
13273 - RCPduPackage.RCPDU_CONNECT_PROVIDER_REQUEST = 0;  
13274 - RCPduPackage.RCPDU_CONNECT_PROVIDER_RESPONSE = 1; 13292 +
  13293 + RCPduPackage.RCPDU_CONNECT_PROVIDER_REQUEST = 0; //加入MCU会议的请求
  13294 + RCPduPackage.RCPDU_CONNECT_PROVIDER_RESPONSE = 1; //返回MCU会议请求结果
  13295 +
  13296 + //下面两个是在入会成功之后,创建pdu包时设置的type值
  13297 + RCPduPackage.RCPDU_UNIFORM_SEND_DATA_REQUEST = 125; //发送uniform_pdu
  13298 + RCPduPackage.RCPDU_SEND_DATA_REQUEST = 120; //入会成功之后,客户端接收消息都通过这个,发送私聊的消息也用这个
  13299 +
  13300 +
13275 RCPduPackage.RCPDU_CONFERENCE_JOIN_REQUEST = 2; 13301 RCPduPackage.RCPDU_CONFERENCE_JOIN_REQUEST = 2;
13276 RCPduPackage.RCPDU_CONFERENCE_JOIN_RESPONSE = 3; 13302 RCPduPackage.RCPDU_CONFERENCE_JOIN_RESPONSE = 3;
13277 RCPduPackage.RCPDU_CONFERENCE_INVITE_REQUEST = 10; 13303 RCPduPackage.RCPDU_CONFERENCE_INVITE_REQUEST = 10;
@@ -13304,9 +13330,9 @@ return /******/ (function(modules) { // webpackBootstrap @@ -13304,9 +13330,9 @@ return /******/ (function(modules) { // webpackBootstrap
13304 RCPduPackage.RCPDU_CHANNEL_LEAVE_REQUEST = 105; 13330 RCPduPackage.RCPDU_CHANNEL_LEAVE_REQUEST = 105;
13305 RCPduPackage.RCPDU_CHANNEL_RELEASE_REQUEST = 106; 13331 RCPduPackage.RCPDU_CHANNEL_RELEASE_REQUEST = 106;
13306 RCPduPackage.RCPDU_CHANNEL_RELEASE_INDICATION = 107; 13332 RCPduPackage.RCPDU_CHANNEL_RELEASE_INDICATION = 107;
13307 - RCPduPackage.RCPDU_SEND_DATA_REQUEST = 120; 13333 +
13308 RCPduPackage.RCPDU_SEND_DATA_INDICATION = 121; 13334 RCPduPackage.RCPDU_SEND_DATA_INDICATION = 121;
13309 - RCPduPackage.RCPDU_UNIFORM_SEND_DATA_REQUEST = 125; 13335 +
13310 RCPduPackage.RCPDU_UNIFORM_SEND_DATA_INDICATION = 126; 13336 RCPduPackage.RCPDU_UNIFORM_SEND_DATA_INDICATION = 126;
13311 RCPduPackage.RCPDU_TOKEN_GRAB_REQUEST = 130; 13337 RCPduPackage.RCPDU_TOKEN_GRAB_REQUEST = 130;
13312 RCPduPackage.RCPDU_TOKEN_GRAB_CONFIRM = 131; 13338 RCPduPackage.RCPDU_TOKEN_GRAB_CONFIRM = 131;
@@ -13385,12 +13411,12 @@ return /******/ (function(modules) { // webpackBootstrap @@ -13385,12 +13411,12 @@ return /******/ (function(modules) { // webpackBootstrap
13385 exports.default = PduConsts; 13411 exports.default = PduConsts;
13386 function PduConsts() {} 13412 function PduConsts() {}
13387 13413
13388 - PduConsts.NT_TERMINAL = 0;  
13389 - PduConsts.NT_MULTIPORT_TERMINAL = 1; 13414 + //nodeType ,目前在加入课堂的时候用到 NT_TERMINAL,其他两个还没用到
  13415 + PduConsts.NT_TERMINAL = 0; //终端适配器
  13416 + PduConsts.NT_MULTIPORT_TERMINAL = 1; //多端口ERMINAL
13390 PduConsts.NT_MCU = 2; 13417 PduConsts.NT_MCU = 2;
13391 13418
13392 - // PduPriority  
13393 - 13419 + // PduPriority 发送pdu包的 优先级
13394 PduConsts.DP_TOP = 0; 13420 PduConsts.DP_TOP = 0;
13395 PduConsts.DP_HIGH = 1; 13421 PduConsts.DP_HIGH = 1;
13396 PduConsts.DP_MEDIUM = 2; 13422 PduConsts.DP_MEDIUM = 2;
@@ -13399,7 +13425,8 @@ return /******/ (function(modules) { // webpackBootstrap @@ -13399,7 +13425,8 @@ return /******/ (function(modules) { // webpackBootstrap
13399 // PduSegment 13425 // PduSegment
13400 PduConsts.SEG_BEGIN = 0; 13426 PduConsts.SEG_BEGIN = 0;
13401 PduConsts.SEG_END = 1; 13427 PduConsts.SEG_END = 1;
13402 - PduConsts.SEG_ONCE = 2; 13428 + PduConsts.SEG_ONCE = 2; //目前发送消息封包的时候都用的这个
  13429 +
13403 13430
13404 // PduReturnType 13431 // PduReturnType
13405 PduConsts.RET_SUCCESS = 0; 13432 PduConsts.RET_SUCCESS = 0;
@@ -13757,6 +13784,8 @@ return /******/ (function(modules) { // webpackBootstrap @@ -13757,6 +13784,8 @@ return /******/ (function(modules) { // webpackBootstrap
13757 }, { 13784 }, {
13758 key: 'rosterUpdateHandler', 13785 key: 'rosterUpdateHandler',
13759 value: function rosterUpdateHandler(nodeId, nodeData) { 13786 value: function rosterUpdateHandler(nodeId, nodeData) {
  13787 + var userDataObj = _pdus2.default['RCNodeInfoUserDataPdu'].decode(nodeData.userData);
  13788 + loger.log("更新人员列表数据", nodeId, userDataObj);
13760 if (nodeData.role === _ApeConsts2.default.NR_MASTER || nodeData.role === _ApeConsts2.default.NR_SLAVE) { 13789 if (nodeData.role === _ApeConsts2.default.NR_MASTER || nodeData.role === _ApeConsts2.default.NR_SLAVE) {
13761 this.hostNodeId = nodeData.nodeId; 13790 this.hostNodeId = nodeData.nodeId;
13762 this.hostUserId = nodeData.userId; 13791 this.hostUserId = nodeData.userId;
@@ -13768,19 +13797,27 @@ return /******/ (function(modules) { // webpackBootstrap @@ -13768,19 +13797,27 @@ return /******/ (function(modules) { // webpackBootstrap
13768 var rosterExists = this.rosters[nodeId]; 13797 var rosterExists = this.rosters[nodeId];
13769 this.rosters[nodeId] = nodeData; 13798 this.rosters[nodeId] = nodeData;
13770 if (!rosterExists) { 13799 if (!rosterExists) {
  13800 + this._emit(_MessageTypes2.default.CLASS_INSERT_ROSTER, { "nodeId": nodeId, "nodeData": nodeData });
13771 this.emitRosterChange(); 13801 this.emitRosterChange();
13772 } 13802 }
13773 } 13803 }
  13804 +
  13805 + //删除用户
  13806 +
13774 }, { 13807 }, {
13775 key: 'rosterDelHandler', 13808 key: 'rosterDelHandler',
13776 value: function rosterDelHandler(nodeId) { 13809 value: function rosterDelHandler(nodeId) {
13777 delete this.rosters[nodeId]; 13810 delete this.rosters[nodeId];
  13811 + this._emit(_MessageTypes2.default.CLASS_DELETE_ROSTER, { "nodeId": nodeId });
13778 this.emitRosterChange(); 13812 this.emitRosterChange();
13779 // 自己退出 13813 // 自己退出
13780 if (nodeId == this._confInfo.nodeId) { 13814 if (nodeId == this._confInfo.nodeId) {
13781 this._emit(_MessageTypes2.default.CLASS_EXIT); 13815 this._emit(_MessageTypes2.default.CLASS_EXIT);
13782 } 13816 }
13783 } 13817 }
  13818 +
  13819 + //广播当前的人数
  13820 +
13784 }, { 13821 }, {
13785 key: 'emitRosterChange', 13822 key: 'emitRosterChange',
13786 value: function emitRosterChange() { 13823 value: function emitRosterChange() {
@@ -15072,7 +15109,7 @@ return /******/ (function(modules) { // webpackBootstrap @@ -15072,7 +15109,7 @@ return /******/ (function(modules) { // webpackBootstrap
15072 15109
15073 // this._notify(RCApeEvent.E_VIDEO_DATA, videoReceivePdu.sessionId, videoReceivePdu.channelId, video_data); 15110 // this._notify(RCApeEvent.E_VIDEO_DATA, videoReceivePdu.sessionId, videoReceivePdu.channelId, video_data);
15074 loger.log('视频消息处理 videoIncomingHandler.', video_data); 15111 loger.log('视频消息处理 videoIncomingHandler.', video_data);
15075 - this._emit(_MessageTypes2.default.VIDEO_SHOW, video_data); 15112 + this._emit(_MessageTypes2.default.VIDEO_RECEIVE, video_data);
15076 } 15113 }
15077 }, { 15114 }, {
15078 key: 'tableUpdateHandler', 15115 key: 'tableUpdateHandler',
@@ -15115,7 +15152,7 @@ return /******/ (function(modules) { // webpackBootstrap @@ -15115,7 +15152,7 @@ return /******/ (function(modules) { // webpackBootstrap
15115 key: 'emitVideoChange', 15152 key: 'emitVideoChange',
15116 value: function emitVideoChange() { 15153 value: function emitVideoChange() {
15117 15154
15118 - this._emit(_MessageTypes2.default.VIDEO_SHOW, { 15155 + this._emit(_MessageTypes2.default.VIDEO_RECEIVE, {
15119 activeChannelId: this.activeChannelId, 15156 activeChannelId: this.activeChannelId,
15120 HLSURL: this.activeURL 15157 HLSURL: this.activeURL
15121 }); 15158 });
@@ -15383,7 +15420,7 @@ return /******/ (function(modules) { // webpackBootstrap @@ -15383,7 +15420,7 @@ return /******/ (function(modules) { // webpackBootstrap
15383 svg: _utf2.default.getStringFromBytes(uncompressedBytes) 15420 svg: _utf2.default.getStringFromBytes(uncompressedBytes)
15384 }; 15421 };
15385 this.annoInfos[recordId] = annoInfo; 15422 this.annoInfos[recordId] = annoInfo;
15386 - this._emit(_MessageTypes2.default.ANNO_UPDATE, annoInfo); 15423 + this._emit(_MessageTypes2.default.ANNOTATION_UPDATE, annoInfo);
15387 } else { 15424 } else {
15388 loger.log('白板动作忽略,类型:', (0, _ApeConsts2.default)(recordInfo.type)); 15425 loger.log('白板动作忽略,类型:', (0, _ApeConsts2.default)(recordInfo.type));
15389 } 15426 }
@@ -586,7 +586,7 @@ client.sendChatMsg(paramInfo); @@ -586,7 +586,7 @@ client.sendChatMsg(paramInfo);
586 586
587 <p>示例代码</p> 587 <p>示例代码</p>
588 588
589 -<pre><code>client.on(MessageTypes.VIDEO_SHOW, function(callbackData){ 589 +<pre><code>client.on(MessageTypes.VIDEO_RECEIVE, function(callbackData){
590 //..... 590 //.....
591 }); 591 });
592 </code></pre> 592 </code></pre>
@@ -604,7 +604,7 @@ client.sendChatMsg(paramInfo); @@ -604,7 +604,7 @@ client.sendChatMsg(paramInfo);
604 604
605 <p>示例代码</p> 605 <p>示例代码</p>
606 606
607 -<pre><code>client.on(MessageTypes.DOC_ANNO,function(callbackData){ 607 +<pre><code>client.on(MessageTypes.DOC_ANNOTATION,function(callbackData){
608 //..... 608 //.....
609 }); 609 });
610 </code></pre> 610 </code></pre>
@@ -273,7 +273,7 @@ client初始化成功之后,加入会议。 @@ -273,7 +273,7 @@ client初始化成功之后,加入会议。
273 ### 视频显示 事件回调 ### 273 ### 视频显示 事件回调 ###
274 示例代码 274 示例代码
275 275
276 - client.on(MessageTypes.VIDEO_SHOW, function(callbackData){ 276 + client.on(MessageTypes.VIDEO_RECEIVE, function(callbackData){
277 //..... 277 //.....
278 }); 278 });
279 279
@@ -287,7 +287,7 @@ client初始化成功之后,加入会议。 @@ -287,7 +287,7 @@ client初始化成功之后,加入会议。
287 ### 文档笔记 事件回调 ### 287 ### 文档笔记 事件回调 ###
288 示例代码 288 示例代码
289 289
290 - client.on(MessageTypes.DOC_ANNO,function(callbackData){ 290 + client.on(MessageTypes.DOC_ANNOTATION,function(callbackData){
291 //..... 291 //.....
292 }); 292 });
293 293
1 # DOCS FOLDER 1 # DOCS FOLDER
  2 +wrcp 主要负责和MCU服务端通讯部分的
  3 +
  4 +
  5 +1.协议上 senddata是顶层协议壳。所有消息包都嵌套打在 这个 pdu中
  6 +
  7 +2.
  8 +从会议流程上看,分以下几类:
  9 +1、connectprovider(内部嵌套joinconference包):加入会议协议,分为request和response两组。
  10 +2、joinsession(内部嵌套注册表的操作包):加入应用,分为request和response
  11 +3、joinchannel:加入channel
  12 +4、adapterpdu 中嵌套注册表操作pdu
  13 + mcu中的注册表是有客户端通过adapterpdu来维护的,mcu本身不维护这个数据
  14 + 我特别强调这个,就是想说明,会议的所有控制逻辑不是mcu完成的,而是客户端完成的
  15 +
  16 +3.每个应用就是一个session,(joinsession就是加入这个应用),客户端加入这个应用后,就能从mcu的注册标中活的这个应用的所有信息。
  17 +conference这个应用会保留会议的主要信息如用户列表等,而且很多会议控制我觉得也会在这个应用中。
  18 +
  19 +然后特定应用如聊天就是负责聊天的数据转发,需要先joinsession然后在joinchannel(相当于聊天的数据通道),这样客户端会通过senddatapdu嵌套chatsenddatapdu来发送聊天channel的消息,其他客户端只要加入了聊天应用的聊天channel,就会收到聊天消息。
  20 +
  21 +每个应用在joinsession时会嵌套adapterpdu,其中带上了需要维护的注册表信息(定义 registrykey和object)
  22 +注册表常用的就是 table,几乎所有app都维护了一个table
  23 +
  24 +比如一个会议中会维护三个视频通道,这样在table中就会有三条记录(以视频channel id作为索引
  25 +
  26 +所有用户加入视频应用后都会获得这个信息,且记录发生改变时会广播给全网用户。
  27 +
  28 +具体到这个表格的存储呢,mcu仅仅知道 id 和 一个 pdu生成的字符串还有owner信息。具体这个记录的内容,mcu没有关心。
  29 +
  30 +比如想定义一个会议的控制行为,很可能的操作就是:在conference这个应用的某个表格下插入一个特定id的string值。然后通过修改这个值,然后与会的人知道当前是什么行为
  31 +
  32 +再比如,tabbar中的多个tab选项,每个选项对应一个id,其属性可以保存在conference中一个表中,这样属性值中可以有visble选项,老师切换时,将相关id属性同步成true,mcu会广播给所有客户端,这样所有的与会人员就知道切换tab了。
@@ -76,7 +76,7 @@ export default class MessageEntrance extends Emiter { @@ -76,7 +76,7 @@ export default class MessageEntrance extends Emiter {
76 76
77 _wb_ape = new WhiteBoardApe(); 77 _wb_ape = new WhiteBoardApe();
78 _wb_ape.on('*', (type, data) => this._emit(type, data)); 78 _wb_ape.on('*', (type, data) => this._emit(type, data));
79 - _wb_ape.on(MessageTypes.ANNO_UPDATE, this.annoUpdateHandler.bind(this)); 79 + _wb_ape.on(MessageTypes.ANNOTATION_UPDATE, this.annoUpdateHandler.bind(this));
80 80
81 //公开外部调用的方法 81 //公开外部调用的方法
82 this.init=this._init; 82 this.init=this._init;
@@ -229,12 +229,12 @@ export default class MessageEntrance extends Emiter { @@ -229,12 +229,12 @@ export default class MessageEntrance extends Emiter {
229 } 229 }
230 } 230 }
231 231
232 - // 白板笔记更新 232 + // 白板笔记更新(svg)
233 annoUpdateHandler(annoInfo) { 233 annoUpdateHandler(annoInfo) {
234 const activeDocId = _confer_ape.activeDocId; 234 const activeDocId = _confer_ape.activeDocId;
235 const docItem = _doc_ape.docList[activeDocId]; 235 const docItem = _doc_ape.docList[activeDocId];
236 if (docItem && annoInfo.id == docItem.wbid) { 236 if (docItem && annoInfo.id == docItem.wbid) {
237 - this._emit(MessageTypes.DOC_ANNO, annoInfo); 237 + this._emit(MessageTypes.DOC_ANNOTATION, annoInfo);
238 } 238 }
239 } 239 }
240 240
@@ -243,9 +243,9 @@ export default class MessageEntrance extends Emiter { @@ -243,9 +243,9 @@ export default class MessageEntrance extends Emiter {
243 loger.log('Doc Show ->' + docItem.id + '|' + docItem.curPageNo); 243 loger.log('Doc Show ->' + docItem.id + '|' + docItem.curPageNo);
244 const annoInfo = _wb_ape.annoInfos[docItem.wbid]; 244 const annoInfo = _wb_ape.annoInfos[docItem.wbid];
245 if (annoInfo) { 245 if (annoInfo) {
246 - this._emit(MessageTypes.DOC_ANNO, annoInfo); 246 + this._emit(MessageTypes.DOC_ANNOTATION, annoInfo);
247 } else { 247 } else {
248 - this._emit(MessageTypes.DOC_ANNO); 248 + this._emit(MessageTypes.DOC_ANNOTATION);
249 249
250 } 250 }
251 } 251 }
@@ -41,7 +41,9 @@ class Loger { @@ -41,7 +41,9 @@ class Loger {
41 error(...msg) { 41 error(...msg) {
42 this._log(Loger.ERROR, msg); 42 this._log(Loger.ERROR, msg);
43 } 43 }
44 - 44 + data(...msg) {
  45 + this._log(Loger.DATA, msg);
  46 + }
45 _log(type, msg) { 47 _log(type, msg) {
46 msg = JSON.stringify(msg); 48 msg = JSON.stringify(msg);
47 49
@@ -57,6 +59,9 @@ class Loger { @@ -57,6 +59,9 @@ class Loger {
57 case Loger.ERROR: 59 case Loger.ERROR:
58 console.error(logMsg); 60 console.error(logMsg);
59 break; 61 break;
  62 + case Loger.DATA:
  63 + console.log(logMsg);
  64 + break;
60 } 65 }
61 } 66 }
62 } 67 }
@@ -67,7 +72,7 @@ Loger.WARN = 1; @@ -67,7 +72,7 @@ Loger.WARN = 1;
67 Loger.ERROR = 2; 72 Loger.ERROR = 2;
68 Loger.NO = Infinity; 73 Loger.NO = Infinity;
69 Loger.logLevel = Loger.LOG; 74 Loger.logLevel = Loger.LOG;
70 - 75 +Loger.DATA = 5;
71 export default { 76 export default {
72 getLoger: function getLoger(info) { 77 getLoger: function getLoger(info) {
73 return new Loger(info); 78 return new Loger(info);
@@ -79,5 +84,6 @@ export default { @@ -79,5 +84,6 @@ export default {
79 WARN: Loger.WARN, 84 WARN: Loger.WARN,
80 ERROR: Loger.ERROR, 85 ERROR: Loger.ERROR,
81 NO: Loger.NO, 86 NO: Loger.NO,
  87 + DATA: Loger.DATA,
82 }; 88 };
83 89
@@ -27,24 +27,28 @@ MessageTypes.CLASS_JOIN_SUCCESS = 'join.class.success'; @@ -27,24 +27,28 @@ MessageTypes.CLASS_JOIN_SUCCESS = 'join.class.success';
27 //会议信息和操作事件定义 27 //会议信息和操作事件定义
28 MessageTypes.CLASS_SHOW_DETAIL = 'class_detail.message'; 28 MessageTypes.CLASS_SHOW_DETAIL = 'class_detail.message';
29 MessageTypes.CLASS_SHOW_ROSTER_NUM = 'roster_num.message'; 29 MessageTypes.CLASS_SHOW_ROSTER_NUM = 'roster_num.message';
  30 +MessageTypes.CLASS_INSERT_ROSTER = 'roster_insert.message';
  31 +MessageTypes.CLASS_DELETE_ROSTER = 'roster_delete.message';
30 MessageTypes.CLASS_EXIT = 'class.exit'; 32 MessageTypes.CLASS_EXIT = 'class.exit';
31 33
32 //聊天模块事件定义 34 //聊天模块事件定义
33 -MessageTypes.CHAT_RECEIVE = 'chat.message'; 35 +MessageTypes.CHAT_RECEIVE = 'chat.receive';
34 36
35 //视频模块事件定义 37 //视频模块事件定义
36 -MessageTypes.VIDEO_SHOW = 'video.message'; 38 +MessageTypes.VIDEO_RECEIVE = 'video.receive';
37 39
38 //文档模块事件定义 40 //文档模块事件定义
39 -MessageTypes.DOC_SHOW = 'document.message'; 41 +MessageTypes.DOC_SHOW = 'document.show';
40 MessageTypes.DOC_SWITCH = 'document.switch'; 42 MessageTypes.DOC_SWITCH = 'document.switch';
41 MessageTypes.DOC_UPDATE = 'document.update'; 43 MessageTypes.DOC_UPDATE = 'document.update';
42 MessageTypes.DOC_DEL='document.delete'; 44 MessageTypes.DOC_DEL='document.delete';
43 -MessageTypes.DOC_ANNO = 'document.anno';//笔记 45 +MessageTypes.DOC_ANNOTATION = 'document.annotation';//笔记
44 46
45 //笔记事件定义 47 //笔记事件定义
46 -MessageTypes.ANNO_UPDATE = 'anno_update';  
47 -MessageTypes.AUDIO_SHOW='audio.message'; 48 +MessageTypes.ANNOTATION_UPDATE = 'annotation.update';
  49 +
  50 +//音频
  51 +MessageTypes.AUDIO_RECEIVE='audio.receive';
48 52
49 //错误事件定义 53 //错误事件定义
50 MessageTypes.NET_ERROR = 'net_error'; 54 MessageTypes.NET_ERROR = 'net_error';
@@ -112,6 +112,8 @@ class ConferApe extends Ape { @@ -112,6 +112,8 @@ class ConferApe extends Ape {
112 112
113 //更新人员列表数据 113 //更新人员列表数据
114 rosterUpdateHandler(nodeId, nodeData) { 114 rosterUpdateHandler(nodeId, nodeData) {
  115 + var userDataObj=pdu['RCNodeInfoUserDataPdu'].decode(nodeData.userData);
  116 + loger.log("更新人员列表数据",nodeId,userDataObj);
115 if (nodeData.role === ApeConsts.NR_MASTER || 117 if (nodeData.role === ApeConsts.NR_MASTER ||
116 nodeData.role === ApeConsts.NR_SLAVE) { 118 nodeData.role === ApeConsts.NR_SLAVE) {
117 this.hostNodeId = nodeData.nodeId; 119 this.hostNodeId = nodeData.nodeId;
@@ -125,14 +127,15 @@ class ConferApe extends Ape { @@ -125,14 +127,15 @@ class ConferApe extends Ape {
125 let rosterExists = this.rosters[nodeId]; 127 let rosterExists = this.rosters[nodeId];
126 this.rosters[nodeId] = nodeData; 128 this.rosters[nodeId] = nodeData;
127 if (!rosterExists) { 129 if (!rosterExists) {
  130 + this._emit(MessageTypes.CLASS_INSERT_ROSTER, {"nodeId":nodeId,"nodeData":nodeData});
128 this.emitRosterChange(); 131 this.emitRosterChange();
129 } 132 }
130 -  
131 -  
132 } 133 }
133 134
  135 + //删除用户
134 rosterDelHandler(nodeId) { 136 rosterDelHandler(nodeId) {
135 delete this.rosters[nodeId]; 137 delete this.rosters[nodeId];
  138 + this._emit(MessageTypes.CLASS_DELETE_ROSTER, {"nodeId":nodeId});
136 this.emitRosterChange(); 139 this.emitRosterChange();
137 // 自己退出 140 // 自己退出
138 if (nodeId == this._confInfo.nodeId) { 141 if (nodeId == this._confInfo.nodeId) {
@@ -140,6 +143,7 @@ class ConferApe extends Ape { @@ -140,6 +143,7 @@ class ConferApe extends Ape {
140 } 143 }
141 } 144 }
142 145
  146 + //广播当前的人数
143 emitRosterChange() { 147 emitRosterChange() {
144 this._emit(MessageTypes.CLASS_SHOW_ROSTER_NUM, Object.keys(this.rosters).length); 148 this._emit(MessageTypes.CLASS_SHOW_ROSTER_NUM, Object.keys(this.rosters).length);
145 } 149 }
@@ -60,7 +60,7 @@ class VideoChat extends Ape { @@ -60,7 +60,7 @@ class VideoChat extends Ape {
60 60
61 // this._notify(RCApeEvent.E_VIDEO_DATA, videoReceivePdu.sessionId, videoReceivePdu.channelId, video_data); 61 // this._notify(RCApeEvent.E_VIDEO_DATA, videoReceivePdu.sessionId, videoReceivePdu.channelId, video_data);
62 loger.log('视频消息处理 videoIncomingHandler.', video_data); 62 loger.log('视频消息处理 videoIncomingHandler.', video_data);
63 - this._emit(MessageTypes.VIDEO_SHOW, video_data); 63 + this._emit(MessageTypes.VIDEO_RECEIVE, video_data);
64 64
65 } 65 }
66 66
@@ -102,7 +102,7 @@ class VideoChat extends Ape { @@ -102,7 +102,7 @@ class VideoChat extends Ape {
102 102
103 emitVideoChange() { 103 emitVideoChange() {
104 104
105 - this._emit(MessageTypes.VIDEO_SHOW, { 105 + this._emit(MessageTypes.VIDEO_RECEIVE, {
106 activeChannelId: this.activeChannelId, 106 activeChannelId: this.activeChannelId,
107 HLSURL: this.activeURL, 107 HLSURL: this.activeURL,
108 }); 108 });
@@ -63,7 +63,7 @@ class WhiteBoardApe extends Ape { @@ -63,7 +63,7 @@ class WhiteBoardApe extends Ape {
63 svg: UTF8.getStringFromBytes(uncompressedBytes) 63 svg: UTF8.getStringFromBytes(uncompressedBytes)
64 }; 64 };
65 this.annoInfos[recordId] = annoInfo; 65 this.annoInfos[recordId] = annoInfo;
66 - this._emit(MessageTypes.ANNO_UPDATE, annoInfo); 66 + this._emit(MessageTypes.ANNOTATION_UPDATE, annoInfo);
67 } else { 67 } else {
68 loger.log('白板动作忽略,类型:', ApeConsts(recordInfo.type)); 68 loger.log('白板动作忽略,类型:', ApeConsts(recordInfo.type));
69 } 69 }
@@ -66,7 +66,7 @@ class MCU extends Emiter { @@ -66,7 +66,7 @@ class MCU extends Emiter {
66 PduConsts.SEG_ONCE 66 PduConsts.SEG_ONCE
67 ); 67 );
68 68
69 - pduMsg.set("site", confInfo.siteId); 69 + pduMsg.set("site", confInfo.siteId);//课堂号对应的名称
70 pduMsg.set("userId", confInfo.userId); 70 pduMsg.set("userId", confInfo.userId);
71 pduMsg.set("userName", Base64.fromByteArray(ArrayBufferUtil.strToUint8Array(confInfo.userName))); 71 pduMsg.set("userName", Base64.fromByteArray(ArrayBufferUtil.strToUint8Array(confInfo.userName)));
72 pduMsg.set("userRole", confInfo.userRole); 72 pduMsg.set("userRole", confInfo.userRole);
@@ -81,12 +81,14 @@ class MCU extends Emiter { @@ -81,12 +81,14 @@ class MCU extends Emiter {
81 let pduMsg = pdu.decode_pdu(data); 81 let pduMsg = pdu.decode_pdu(data);
82 let pduType = pduMsg.get("type"); 82 let pduType = pduMsg.get("type");
83 let pduData = pduMsg.get("data"); 83 let pduData = pduMsg.get("data");
  84 + //loger.data('MCU-FirstLayer封装消息', 'type', pdu.id2type(pduMsg.type), pduMsg.type, 'sessionId', ApeConsts(pduMsg.sessionId), pduMsg.sessionId);
84 loger.log('MCU-FirstLayer封装消息', 'type', pdu.id2type(pduMsg.type), pduMsg.type, 'sessionId', ApeConsts(pduMsg.sessionId), pduMsg.sessionId); 85 loger.log('MCU-FirstLayer封装消息', 'type', pdu.id2type(pduMsg.type), pduMsg.type, 'sessionId', ApeConsts(pduMsg.sessionId), pduMsg.sessionId);
85 switch (pduType) { 86 switch (pduType) {
86 case PduType.RCPDU_CONNECT_PROVIDER_RESPONSE: 87 case PduType.RCPDU_CONNECT_PROVIDER_RESPONSE:
87 //加入会议请求返回数据处理 88 //加入会议请求返回数据处理
88 let joinConfPdu = pdu['RCConferenceJoinResponsePdu'].decode(pduData); 89 let joinConfPdu = pdu['RCConferenceJoinResponsePdu'].decode(pduData);
89 let pduResultCode = joinConfPdu.get("result"); 90 let pduResultCode = joinConfPdu.get("result");
  91 + loger.warn( 'RCPDU_CONNECT_PROVIDER_RESPONSE ->pduResultCode:'+pduResultCode);
90 switch (pduResultCode) { 92 switch (pduResultCode) {
91 case PduConsts.RET_SUCCESS: 93 case PduConsts.RET_SUCCESS:
92 //加入成功 94 //加入成功
1 export default function PduConsts() {} 1 export default function PduConsts() {}
2 2
3 -PduConsts.NT_TERMINAL = 0;  
4 -PduConsts.NT_MULTIPORT_TERMINAL = 1; 3 +
  4 +//nodeType ,目前在加入课堂的时候用到 NT_TERMINAL,其他两个还没用到
  5 +PduConsts.NT_TERMINAL = 0;//终端适配器
  6 +PduConsts.NT_MULTIPORT_TERMINAL = 1;//多端口ERMINAL
5 PduConsts.NT_MCU = 2; 7 PduConsts.NT_MCU = 2;
6 8
7 -// PduPriority  
8 9
  10 +// PduPriority 发送pdu包的 优先级
9 PduConsts.DP_TOP = 0; 11 PduConsts.DP_TOP = 0;
10 PduConsts.DP_HIGH = 1; 12 PduConsts.DP_HIGH = 1;
11 PduConsts.DP_MEDIUM = 2; 13 PduConsts.DP_MEDIUM = 2;
@@ -14,7 +16,9 @@ PduConsts.DP_LOW = 3; @@ -14,7 +16,9 @@ PduConsts.DP_LOW = 3;
14 // PduSegment 16 // PduSegment
15 PduConsts.SEG_BEGIN = 0; 17 PduConsts.SEG_BEGIN = 0;
16 PduConsts.SEG_END = 1; 18 PduConsts.SEG_END = 1;
17 -PduConsts.SEG_ONCE = 2; 19 +PduConsts.SEG_ONCE = 2; //目前发送消息封包的时候都用的这个
  20 +
  21 +
18 22
19 // PduReturnType 23 // PduReturnType
20 PduConsts.RET_SUCCESS = 0; 24 PduConsts.RET_SUCCESS = 0;
1 export default function RCPduPackage(targe_type_id) {}; 1 export default function RCPduPackage(targe_type_id) {};
2 -RCPduPackage.RCPDU_CONNECT_PROVIDER_REQUEST = 0;  
3 -RCPduPackage.RCPDU_CONNECT_PROVIDER_RESPONSE = 1; 2 +
  3 +RCPduPackage.RCPDU_CONNECT_PROVIDER_REQUEST = 0;//加入MCU会议的请求
  4 +RCPduPackage.RCPDU_CONNECT_PROVIDER_RESPONSE = 1;//返回MCU会议请求结果
  5 +
  6 +//下面两个是在入会成功之后,创建pdu包时设置的type值
  7 +RCPduPackage.RCPDU_UNIFORM_SEND_DATA_REQUEST = 125;//发送uniform_pdu
  8 +RCPduPackage.RCPDU_SEND_DATA_REQUEST = 120;//入会成功之后,客户端接收消息都通过这个,发送私聊的消息也用这个
  9 +
  10 +
4 RCPduPackage.RCPDU_CONFERENCE_JOIN_REQUEST = 2; 11 RCPduPackage.RCPDU_CONFERENCE_JOIN_REQUEST = 2;
5 RCPduPackage.RCPDU_CONFERENCE_JOIN_RESPONSE = 3; 12 RCPduPackage.RCPDU_CONFERENCE_JOIN_RESPONSE = 3;
6 RCPduPackage.RCPDU_CONFERENCE_INVITE_REQUEST = 10; 13 RCPduPackage.RCPDU_CONFERENCE_INVITE_REQUEST = 10;
@@ -33,9 +40,9 @@ RCPduPackage.RCPDU_CHANNEL_JOIN_RESPONSE = 104; @@ -33,9 +40,9 @@ RCPduPackage.RCPDU_CHANNEL_JOIN_RESPONSE = 104;
33 RCPduPackage.RCPDU_CHANNEL_LEAVE_REQUEST = 105; 40 RCPduPackage.RCPDU_CHANNEL_LEAVE_REQUEST = 105;
34 RCPduPackage.RCPDU_CHANNEL_RELEASE_REQUEST = 106; 41 RCPduPackage.RCPDU_CHANNEL_RELEASE_REQUEST = 106;
35 RCPduPackage.RCPDU_CHANNEL_RELEASE_INDICATION = 107; 42 RCPduPackage.RCPDU_CHANNEL_RELEASE_INDICATION = 107;
36 -RCPduPackage.RCPDU_SEND_DATA_REQUEST = 120; 43 +
37 RCPduPackage.RCPDU_SEND_DATA_INDICATION = 121; 44 RCPduPackage.RCPDU_SEND_DATA_INDICATION = 121;
38 -RCPduPackage.RCPDU_UNIFORM_SEND_DATA_REQUEST = 125; 45 +
39 RCPduPackage.RCPDU_UNIFORM_SEND_DATA_INDICATION = 126; 46 RCPduPackage.RCPDU_UNIFORM_SEND_DATA_INDICATION = 126;
40 RCPduPackage.RCPDU_TOKEN_GRAB_REQUEST = 130; 47 RCPduPackage.RCPDU_TOKEN_GRAB_REQUEST = 130;
41 RCPduPackage.RCPDU_TOKEN_GRAB_CONFIRM = 131; 48 RCPduPackage.RCPDU_TOKEN_GRAB_CONFIRM = 131;