李勇

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

2.修改变量定义命名
... ... @@ -73,7 +73,7 @@ return /******/ (function(modules) { // webpackBootstrap
/******/ }
/******/ var hotApplyOnUpdate = true;
/******/ var hotCurrentHash = "6e29fc3a1208eaf1fcd2"; // eslint-disable-line no-unused-vars
/******/ var hotCurrentHash = "334c795f44fe3fd40f79"; // eslint-disable-line no-unused-vars
/******/ var hotCurrentModuleData = {};
/******/ var hotCurrentParents = []; // eslint-disable-line no-unused-vars
... ... @@ -788,7 +788,7 @@ return /******/ (function(modules) { // webpackBootstrap
_wb_ape.on('*', function (type, data) {
return _this._emit(type, data);
});
_wb_ape.on(_MessageTypes2.default.ANNO_UPDATE, _this.annoUpdateHandler.bind(_this));
_wb_ape.on(_MessageTypes2.default.ANNOTATION_UPDATE, _this.annoUpdateHandler.bind(_this));
//公开外部调用的方法
_this.init = _this._init;
... ... @@ -976,7 +976,7 @@ return /******/ (function(modules) { // webpackBootstrap
}
}
// 白板笔记更新
// 白板笔记更新(svg)
}, {
key: 'annoUpdateHandler',
... ... @@ -984,7 +984,7 @@ return /******/ (function(modules) { // webpackBootstrap
var activeDocId = _confer_ape.activeDocId;
var docItem = _doc_ape.docList[activeDocId];
if (docItem && annoInfo.id == docItem.wbid) {
this._emit(_MessageTypes2.default.DOC_ANNO, annoInfo);
this._emit(_MessageTypes2.default.DOC_ANNOTATION, annoInfo);
}
}
... ... @@ -996,9 +996,9 @@ return /******/ (function(modules) { // webpackBootstrap
loger.log('Doc Show ->' + docItem.id + '|' + docItem.curPageNo);
var annoInfo = _wb_ape.annoInfos[docItem.wbid];
if (annoInfo) {
this._emit(_MessageTypes2.default.DOC_ANNO, annoInfo);
this._emit(_MessageTypes2.default.DOC_ANNOTATION, annoInfo);
} else {
this._emit(_MessageTypes2.default.DOC_ANNO);
this._emit(_MessageTypes2.default.DOC_ANNOTATION);
}
}
... ... @@ -1581,6 +1581,15 @@ return /******/ (function(modules) { // webpackBootstrap
this._log(Loger.ERROR, msg);
}
}, {
key: 'data',
value: function data() {
for (var _len4 = arguments.length, msg = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
msg[_key4] = arguments[_key4];
}
this._log(Loger.DATA, msg);
}
}, {
key: '_log',
value: function _log(type, msg) {
msg = JSON.stringify(msg);
... ... @@ -1597,6 +1606,9 @@ return /******/ (function(modules) { // webpackBootstrap
case Loger.ERROR:
console.error(logMsg);
break;
case Loger.DATA:
console.log(logMsg);
break;
}
}
}
... ... @@ -1610,7 +1622,7 @@ return /******/ (function(modules) { // webpackBootstrap
Loger.ERROR = 2;
Loger.NO = Infinity;
Loger.logLevel = Loger.LOG;
Loger.DATA = 5;
var _default = {
getLoger: function getLoger(info) {
return new Loger(info);
... ... @@ -1621,7 +1633,8 @@ return /******/ (function(modules) { // webpackBootstrap
LOG: Loger.LOG,
WARN: Loger.WARN,
ERROR: Loger.ERROR,
NO: Loger.NO
NO: Loger.NO,
DATA: Loger.DATA
};
exports.default = _default;
;
... ... @@ -1676,24 +1689,28 @@ return /******/ (function(modules) { // webpackBootstrap
//会议信息和操作事件定义
MessageTypes.CLASS_SHOW_DETAIL = 'class_detail.message';
MessageTypes.CLASS_SHOW_ROSTER_NUM = 'roster_num.message';
MessageTypes.CLASS_INSERT_ROSTER = 'roster_insert.message';
MessageTypes.CLASS_DELETE_ROSTER = 'roster_delete.message';
MessageTypes.CLASS_EXIT = 'class.exit';
//聊天模块事件定义
MessageTypes.CHAT_RECEIVE = 'chat.message';
MessageTypes.CHAT_RECEIVE = 'chat.receive';
//视频模块事件定义
MessageTypes.VIDEO_SHOW = 'video.message';
MessageTypes.VIDEO_RECEIVE = 'video.receive';
//文档模块事件定义
MessageTypes.DOC_SHOW = 'document.message';
MessageTypes.DOC_SHOW = 'document.show';
MessageTypes.DOC_SWITCH = 'document.switch';
MessageTypes.DOC_UPDATE = 'document.update';
MessageTypes.DOC_DEL = 'document.delete';
MessageTypes.DOC_ANNO = 'document.anno'; //笔记
MessageTypes.DOC_ANNOTATION = 'document.annotation'; //笔记
//笔记事件定义
MessageTypes.ANNO_UPDATE = 'anno_update';
MessageTypes.AUDIO_SHOW = 'audio.message';
MessageTypes.ANNOTATION_UPDATE = 'annotation.update';
//音频
MessageTypes.AUDIO_RECEIVE = 'audio.receive';
//错误事件定义
MessageTypes.NET_ERROR = 'net_error';
... ... @@ -2314,7 +2331,7 @@ return /******/ (function(modules) { // webpackBootstrap
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);
pduMsg.set("site", confInfo.siteId);
pduMsg.set("site", confInfo.siteId); //课堂号对应的名称
pduMsg.set("userId", confInfo.userId);
pduMsg.set("userName", _base64Js2.default.fromByteArray(_ArrayBufferUtil2.default.strToUint8Array(confInfo.userName)));
pduMsg.set("userRole", confInfo.userRole);
... ... @@ -2332,12 +2349,14 @@ return /******/ (function(modules) { // webpackBootstrap
var pduMsg = _index2.default.decode_pdu(data);
var pduType = pduMsg.get("type");
var pduData = pduMsg.get("data");
//loger.data('MCU-FirstLayer封装消息', 'type', pdu.id2type(pduMsg.type), pduMsg.type, 'sessionId', ApeConsts(pduMsg.sessionId), pduMsg.sessionId);
loger.log('MCU-FirstLayer封装消息', 'type', _index2.default.id2type(pduMsg.type), pduMsg.type, 'sessionId', (0, _ApeConsts2.default)(pduMsg.sessionId), pduMsg.sessionId);
switch (pduType) {
case _PduType2.default.RCPDU_CONNECT_PROVIDER_RESPONSE:
//加入会议请求返回数据处理
var joinConfPdu = _index2.default['RCConferenceJoinResponsePdu'].decode(pduData);
var pduResultCode = joinConfPdu.get("result");
loger.warn('RCPDU_CONNECT_PROVIDER_RESPONSE ->pduResultCode:' + pduResultCode);
switch (pduResultCode) {
case _PduConsts2.default.RET_SUCCESS:
//加入成功
... ... @@ -13270,8 +13289,15 @@ return /******/ (function(modules) { // webpackBootstrap
});
exports.default = RCPduPackage;
function RCPduPackage(targe_type_id) {};
RCPduPackage.RCPDU_CONNECT_PROVIDER_REQUEST = 0;
RCPduPackage.RCPDU_CONNECT_PROVIDER_RESPONSE = 1;
RCPduPackage.RCPDU_CONNECT_PROVIDER_REQUEST = 0; //加入MCU会议的请求
RCPduPackage.RCPDU_CONNECT_PROVIDER_RESPONSE = 1; //返回MCU会议请求结果
//下面两个是在入会成功之后,创建pdu包时设置的type值
RCPduPackage.RCPDU_UNIFORM_SEND_DATA_REQUEST = 125; //发送uniform_pdu
RCPduPackage.RCPDU_SEND_DATA_REQUEST = 120; //入会成功之后,客户端接收消息都通过这个,发送私聊的消息也用这个
RCPduPackage.RCPDU_CONFERENCE_JOIN_REQUEST = 2;
RCPduPackage.RCPDU_CONFERENCE_JOIN_RESPONSE = 3;
RCPduPackage.RCPDU_CONFERENCE_INVITE_REQUEST = 10;
... ... @@ -13304,9 +13330,9 @@ return /******/ (function(modules) { // webpackBootstrap
RCPduPackage.RCPDU_CHANNEL_LEAVE_REQUEST = 105;
RCPduPackage.RCPDU_CHANNEL_RELEASE_REQUEST = 106;
RCPduPackage.RCPDU_CHANNEL_RELEASE_INDICATION = 107;
RCPduPackage.RCPDU_SEND_DATA_REQUEST = 120;
RCPduPackage.RCPDU_SEND_DATA_INDICATION = 121;
RCPduPackage.RCPDU_UNIFORM_SEND_DATA_REQUEST = 125;
RCPduPackage.RCPDU_UNIFORM_SEND_DATA_INDICATION = 126;
RCPduPackage.RCPDU_TOKEN_GRAB_REQUEST = 130;
RCPduPackage.RCPDU_TOKEN_GRAB_CONFIRM = 131;
... ... @@ -13385,12 +13411,12 @@ return /******/ (function(modules) { // webpackBootstrap
exports.default = PduConsts;
function PduConsts() {}
PduConsts.NT_TERMINAL = 0;
PduConsts.NT_MULTIPORT_TERMINAL = 1;
//nodeType ,目前在加入课堂的时候用到 NT_TERMINAL,其他两个还没用到
PduConsts.NT_TERMINAL = 0; //终端适配器
PduConsts.NT_MULTIPORT_TERMINAL = 1; //多端口ERMINAL
PduConsts.NT_MCU = 2;
// PduPriority
// PduPriority 发送pdu包的 优先级
PduConsts.DP_TOP = 0;
PduConsts.DP_HIGH = 1;
PduConsts.DP_MEDIUM = 2;
... ... @@ -13399,7 +13425,8 @@ return /******/ (function(modules) { // webpackBootstrap
// PduSegment
PduConsts.SEG_BEGIN = 0;
PduConsts.SEG_END = 1;
PduConsts.SEG_ONCE = 2;
PduConsts.SEG_ONCE = 2; //目前发送消息封包的时候都用的这个
// PduReturnType
PduConsts.RET_SUCCESS = 0;
... ... @@ -13757,6 +13784,8 @@ return /******/ (function(modules) { // webpackBootstrap
}, {
key: 'rosterUpdateHandler',
value: function rosterUpdateHandler(nodeId, nodeData) {
var userDataObj = _pdus2.default['RCNodeInfoUserDataPdu'].decode(nodeData.userData);
loger.log("更新人员列表数据", nodeId, userDataObj);
if (nodeData.role === _ApeConsts2.default.NR_MASTER || nodeData.role === _ApeConsts2.default.NR_SLAVE) {
this.hostNodeId = nodeData.nodeId;
this.hostUserId = nodeData.userId;
... ... @@ -13768,19 +13797,27 @@ return /******/ (function(modules) { // webpackBootstrap
var rosterExists = this.rosters[nodeId];
this.rosters[nodeId] = nodeData;
if (!rosterExists) {
this._emit(_MessageTypes2.default.CLASS_INSERT_ROSTER, { "nodeId": nodeId, "nodeData": nodeData });
this.emitRosterChange();
}
}
//删除用户
}, {
key: 'rosterDelHandler',
value: function rosterDelHandler(nodeId) {
delete this.rosters[nodeId];
this._emit(_MessageTypes2.default.CLASS_DELETE_ROSTER, { "nodeId": nodeId });
this.emitRosterChange();
// 自己退出
if (nodeId == this._confInfo.nodeId) {
this._emit(_MessageTypes2.default.CLASS_EXIT);
}
}
//广播当前的人数
}, {
key: 'emitRosterChange',
value: function emitRosterChange() {
... ... @@ -15072,7 +15109,7 @@ return /******/ (function(modules) { // webpackBootstrap
// this._notify(RCApeEvent.E_VIDEO_DATA, videoReceivePdu.sessionId, videoReceivePdu.channelId, video_data);
loger.log('视频消息处理 videoIncomingHandler.', video_data);
this._emit(_MessageTypes2.default.VIDEO_SHOW, video_data);
this._emit(_MessageTypes2.default.VIDEO_RECEIVE, video_data);
}
}, {
key: 'tableUpdateHandler',
... ... @@ -15115,7 +15152,7 @@ return /******/ (function(modules) { // webpackBootstrap
key: 'emitVideoChange',
value: function emitVideoChange() {
this._emit(_MessageTypes2.default.VIDEO_SHOW, {
this._emit(_MessageTypes2.default.VIDEO_RECEIVE, {
activeChannelId: this.activeChannelId,
HLSURL: this.activeURL
});
... ... @@ -15383,7 +15420,7 @@ return /******/ (function(modules) { // webpackBootstrap
svg: _utf2.default.getStringFromBytes(uncompressedBytes)
};
this.annoInfos[recordId] = annoInfo;
this._emit(_MessageTypes2.default.ANNO_UPDATE, annoInfo);
this._emit(_MessageTypes2.default.ANNOTATION_UPDATE, annoInfo);
} else {
loger.log('白板动作忽略,类型:', (0, _ApeConsts2.default)(recordInfo.type));
}
... ...
... ... @@ -586,7 +586,7 @@ client.sendChatMsg(paramInfo);
<p>示例代码</p>
<pre><code>client.on(MessageTypes.VIDEO_SHOW, function(callbackData){
<pre><code>client.on(MessageTypes.VIDEO_RECEIVE, function(callbackData){
//.....
});
</code></pre>
... ... @@ -604,7 +604,7 @@ client.sendChatMsg(paramInfo);
<p>示例代码</p>
<pre><code>client.on(MessageTypes.DOC_ANNO,function(callbackData){
<pre><code>client.on(MessageTypes.DOC_ANNOTATION,function(callbackData){
//.....
});
</code></pre>
... ...
... ... @@ -273,7 +273,7 @@ client初始化成功之后,加入会议。
### 视频显示 事件回调 ###
示例代码
client.on(MessageTypes.VIDEO_SHOW, function(callbackData){
client.on(MessageTypes.VIDEO_RECEIVE, function(callbackData){
//.....
});
... ... @@ -287,7 +287,7 @@ client初始化成功之后,加入会议。
### 文档笔记 事件回调 ###
示例代码
client.on(MessageTypes.DOC_ANNO,function(callbackData){
client.on(MessageTypes.DOC_ANNOTATION,function(callbackData){
//.....
});
... ...
# DOCS FOLDER
wrcp 主要负责和MCU服务端通讯部分的
1.协议上 senddata是顶层协议壳。所有消息包都嵌套打在 这个 pdu中
2.
从会议流程上看,分以下几类:
1、connectprovider(内部嵌套joinconference包):加入会议协议,分为request和response两组。
2、joinsession(内部嵌套注册表的操作包):加入应用,分为request和response
3、joinchannel:加入channel
4、adapterpdu 中嵌套注册表操作pdu
mcu中的注册表是有客户端通过adapterpdu来维护的,mcu本身不维护这个数据
我特别强调这个,就是想说明,会议的所有控制逻辑不是mcu完成的,而是客户端完成的
3.每个应用就是一个session,(joinsession就是加入这个应用),客户端加入这个应用后,就能从mcu的注册标中活的这个应用的所有信息。
conference这个应用会保留会议的主要信息如用户列表等,而且很多会议控制我觉得也会在这个应用中。
然后特定应用如聊天就是负责聊天的数据转发,需要先joinsession然后在joinchannel(相当于聊天的数据通道),这样客户端会通过senddatapdu嵌套chatsenddatapdu来发送聊天channel的消息,其他客户端只要加入了聊天应用的聊天channel,就会收到聊天消息。
每个应用在joinsession时会嵌套adapterpdu,其中带上了需要维护的注册表信息(定义 registrykey和object)
注册表常用的就是 table,几乎所有app都维护了一个table
比如一个会议中会维护三个视频通道,这样在table中就会有三条记录(以视频channel id作为索引
所有用户加入视频应用后都会获得这个信息,且记录发生改变时会广播给全网用户。
具体到这个表格的存储呢,mcu仅仅知道 id 和 一个 pdu生成的字符串还有owner信息。具体这个记录的内容,mcu没有关心。
比如想定义一个会议的控制行为,很可能的操作就是:在conference这个应用的某个表格下插入一个特定id的string值。然后通过修改这个值,然后与会的人知道当前是什么行为
再比如,tabbar中的多个tab选项,每个选项对应一个id,其属性可以保存在conference中一个表中,这样属性值中可以有visble选项,老师切换时,将相关id属性同步成true,mcu会广播给所有客户端,这样所有的与会人员就知道切换tab了。
\ No newline at end of file
... ...
... ... @@ -76,7 +76,7 @@ export default class MessageEntrance extends Emiter {
_wb_ape = new WhiteBoardApe();
_wb_ape.on('*', (type, data) => this._emit(type, data));
_wb_ape.on(MessageTypes.ANNO_UPDATE, this.annoUpdateHandler.bind(this));
_wb_ape.on(MessageTypes.ANNOTATION_UPDATE, this.annoUpdateHandler.bind(this));
//公开外部调用的方法
this.init=this._init;
... ... @@ -229,12 +229,12 @@ export default class MessageEntrance extends Emiter {
}
}
// 白板笔记更新
// 白板笔记更新(svg)
annoUpdateHandler(annoInfo) {
const activeDocId = _confer_ape.activeDocId;
const docItem = _doc_ape.docList[activeDocId];
if (docItem && annoInfo.id == docItem.wbid) {
this._emit(MessageTypes.DOC_ANNO, annoInfo);
this._emit(MessageTypes.DOC_ANNOTATION, annoInfo);
}
}
... ... @@ -243,9 +243,9 @@ export default class MessageEntrance extends Emiter {
loger.log('Doc Show ->' + docItem.id + '|' + docItem.curPageNo);
const annoInfo = _wb_ape.annoInfos[docItem.wbid];
if (annoInfo) {
this._emit(MessageTypes.DOC_ANNO, annoInfo);
this._emit(MessageTypes.DOC_ANNOTATION, annoInfo);
} else {
this._emit(MessageTypes.DOC_ANNO);
this._emit(MessageTypes.DOC_ANNOTATION);
}
}
... ...
... ... @@ -41,7 +41,9 @@ class Loger {
error(...msg) {
this._log(Loger.ERROR, msg);
}
data(...msg) {
this._log(Loger.DATA, msg);
}
_log(type, msg) {
msg = JSON.stringify(msg);
... ... @@ -57,6 +59,9 @@ class Loger {
case Loger.ERROR:
console.error(logMsg);
break;
case Loger.DATA:
console.log(logMsg);
break;
}
}
}
... ... @@ -67,7 +72,7 @@ Loger.WARN = 1;
Loger.ERROR = 2;
Loger.NO = Infinity;
Loger.logLevel = Loger.LOG;
Loger.DATA = 5;
export default {
getLoger: function getLoger(info) {
return new Loger(info);
... ... @@ -79,5 +84,6 @@ export default {
WARN: Loger.WARN,
ERROR: Loger.ERROR,
NO: Loger.NO,
DATA: Loger.DATA,
};
... ...
... ... @@ -27,24 +27,28 @@ MessageTypes.CLASS_JOIN_SUCCESS = 'join.class.success';
//会议信息和操作事件定义
MessageTypes.CLASS_SHOW_DETAIL = 'class_detail.message';
MessageTypes.CLASS_SHOW_ROSTER_NUM = 'roster_num.message';
MessageTypes.CLASS_INSERT_ROSTER = 'roster_insert.message';
MessageTypes.CLASS_DELETE_ROSTER = 'roster_delete.message';
MessageTypes.CLASS_EXIT = 'class.exit';
//聊天模块事件定义
MessageTypes.CHAT_RECEIVE = 'chat.message';
MessageTypes.CHAT_RECEIVE = 'chat.receive';
//视频模块事件定义
MessageTypes.VIDEO_SHOW = 'video.message';
MessageTypes.VIDEO_RECEIVE = 'video.receive';
//文档模块事件定义
MessageTypes.DOC_SHOW = 'document.message';
MessageTypes.DOC_SHOW = 'document.show';
MessageTypes.DOC_SWITCH = 'document.switch';
MessageTypes.DOC_UPDATE = 'document.update';
MessageTypes.DOC_DEL='document.delete';
MessageTypes.DOC_ANNO = 'document.anno';//笔记
MessageTypes.DOC_ANNOTATION = 'document.annotation';//笔记
//笔记事件定义
MessageTypes.ANNO_UPDATE = 'anno_update';
MessageTypes.AUDIO_SHOW='audio.message';
MessageTypes.ANNOTATION_UPDATE = 'annotation.update';
//音频
MessageTypes.AUDIO_RECEIVE='audio.receive';
//错误事件定义
MessageTypes.NET_ERROR = 'net_error';
... ...
... ... @@ -112,6 +112,8 @@ class ConferApe extends Ape {
//更新人员列表数据
rosterUpdateHandler(nodeId, nodeData) {
var userDataObj=pdu['RCNodeInfoUserDataPdu'].decode(nodeData.userData);
loger.log("更新人员列表数据",nodeId,userDataObj);
if (nodeData.role === ApeConsts.NR_MASTER ||
nodeData.role === ApeConsts.NR_SLAVE) {
this.hostNodeId = nodeData.nodeId;
... ... @@ -125,14 +127,15 @@ class ConferApe extends Ape {
let rosterExists = this.rosters[nodeId];
this.rosters[nodeId] = nodeData;
if (!rosterExists) {
this._emit(MessageTypes.CLASS_INSERT_ROSTER, {"nodeId":nodeId,"nodeData":nodeData});
this.emitRosterChange();
}
}
//删除用户
rosterDelHandler(nodeId) {
delete this.rosters[nodeId];
this._emit(MessageTypes.CLASS_DELETE_ROSTER, {"nodeId":nodeId});
this.emitRosterChange();
// 自己退出
if (nodeId == this._confInfo.nodeId) {
... ... @@ -140,6 +143,7 @@ class ConferApe extends Ape {
}
}
//广播当前的人数
emitRosterChange() {
this._emit(MessageTypes.CLASS_SHOW_ROSTER_NUM, Object.keys(this.rosters).length);
}
... ...
... ... @@ -60,7 +60,7 @@ class VideoChat extends Ape {
// this._notify(RCApeEvent.E_VIDEO_DATA, videoReceivePdu.sessionId, videoReceivePdu.channelId, video_data);
loger.log('视频消息处理 videoIncomingHandler.', video_data);
this._emit(MessageTypes.VIDEO_SHOW, video_data);
this._emit(MessageTypes.VIDEO_RECEIVE, video_data);
}
... ... @@ -102,7 +102,7 @@ class VideoChat extends Ape {
emitVideoChange() {
this._emit(MessageTypes.VIDEO_SHOW, {
this._emit(MessageTypes.VIDEO_RECEIVE, {
activeChannelId: this.activeChannelId,
HLSURL: this.activeURL,
});
... ...
... ... @@ -63,7 +63,7 @@ class WhiteBoardApe extends Ape {
svg: UTF8.getStringFromBytes(uncompressedBytes)
};
this.annoInfos[recordId] = annoInfo;
this._emit(MessageTypes.ANNO_UPDATE, annoInfo);
this._emit(MessageTypes.ANNOTATION_UPDATE, annoInfo);
} else {
loger.log('白板动作忽略,类型:', ApeConsts(recordInfo.type));
}
... ...
... ... @@ -66,7 +66,7 @@ class MCU extends Emiter {
PduConsts.SEG_ONCE
);
pduMsg.set("site", confInfo.siteId);
pduMsg.set("site", confInfo.siteId);//课堂号对应的名称
pduMsg.set("userId", confInfo.userId);
pduMsg.set("userName", Base64.fromByteArray(ArrayBufferUtil.strToUint8Array(confInfo.userName)));
pduMsg.set("userRole", confInfo.userRole);
... ... @@ -81,12 +81,14 @@ class MCU extends Emiter {
let pduMsg = pdu.decode_pdu(data);
let pduType = pduMsg.get("type");
let pduData = pduMsg.get("data");
//loger.data('MCU-FirstLayer封装消息', 'type', pdu.id2type(pduMsg.type), pduMsg.type, 'sessionId', ApeConsts(pduMsg.sessionId), pduMsg.sessionId);
loger.log('MCU-FirstLayer封装消息', 'type', pdu.id2type(pduMsg.type), pduMsg.type, 'sessionId', ApeConsts(pduMsg.sessionId), pduMsg.sessionId);
switch (pduType) {
case PduType.RCPDU_CONNECT_PROVIDER_RESPONSE:
//加入会议请求返回数据处理
let joinConfPdu = pdu['RCConferenceJoinResponsePdu'].decode(pduData);
let pduResultCode = joinConfPdu.get("result");
loger.warn( 'RCPDU_CONNECT_PROVIDER_RESPONSE ->pduResultCode:'+pduResultCode);
switch (pduResultCode) {
case PduConsts.RET_SUCCESS:
//加入成功
... ...
export default function PduConsts() {}
PduConsts.NT_TERMINAL = 0;
PduConsts.NT_MULTIPORT_TERMINAL = 1;
//nodeType ,目前在加入课堂的时候用到 NT_TERMINAL,其他两个还没用到
PduConsts.NT_TERMINAL = 0;//终端适配器
PduConsts.NT_MULTIPORT_TERMINAL = 1;//多端口ERMINAL
PduConsts.NT_MCU = 2;
// PduPriority
// PduPriority 发送pdu包的 优先级
PduConsts.DP_TOP = 0;
PduConsts.DP_HIGH = 1;
PduConsts.DP_MEDIUM = 2;
... ... @@ -14,7 +16,9 @@ PduConsts.DP_LOW = 3;
// PduSegment
PduConsts.SEG_BEGIN = 0;
PduConsts.SEG_END = 1;
PduConsts.SEG_ONCE = 2;
PduConsts.SEG_ONCE = 2; //目前发送消息封包的时候都用的这个
// PduReturnType
PduConsts.RET_SUCCESS = 0;
... ...
export default function RCPduPackage(targe_type_id) {};
RCPduPackage.RCPDU_CONNECT_PROVIDER_REQUEST = 0;
RCPduPackage.RCPDU_CONNECT_PROVIDER_RESPONSE = 1;
RCPduPackage.RCPDU_CONNECT_PROVIDER_REQUEST = 0;//加入MCU会议的请求
RCPduPackage.RCPDU_CONNECT_PROVIDER_RESPONSE = 1;//返回MCU会议请求结果
//下面两个是在入会成功之后,创建pdu包时设置的type值
RCPduPackage.RCPDU_UNIFORM_SEND_DATA_REQUEST = 125;//发送uniform_pdu
RCPduPackage.RCPDU_SEND_DATA_REQUEST = 120;//入会成功之后,客户端接收消息都通过这个,发送私聊的消息也用这个
RCPduPackage.RCPDU_CONFERENCE_JOIN_REQUEST = 2;
RCPduPackage.RCPDU_CONFERENCE_JOIN_RESPONSE = 3;
RCPduPackage.RCPDU_CONFERENCE_INVITE_REQUEST = 10;
... ... @@ -33,9 +40,9 @@ RCPduPackage.RCPDU_CHANNEL_JOIN_RESPONSE = 104;
RCPduPackage.RCPDU_CHANNEL_LEAVE_REQUEST = 105;
RCPduPackage.RCPDU_CHANNEL_RELEASE_REQUEST = 106;
RCPduPackage.RCPDU_CHANNEL_RELEASE_INDICATION = 107;
RCPduPackage.RCPDU_SEND_DATA_REQUEST = 120;
RCPduPackage.RCPDU_SEND_DATA_INDICATION = 121;
RCPduPackage.RCPDU_UNIFORM_SEND_DATA_REQUEST = 125;
RCPduPackage.RCPDU_UNIFORM_SEND_DATA_INDICATION = 126;
RCPduPackage.RCPDU_TOKEN_GRAB_REQUEST = 130;
RCPduPackage.RCPDU_TOKEN_GRAB_CONFIRM = 131;
... ...