李勇

1.视频模块增加控制消息指令接口,定义控制消息的类型;增加控制消息监听的定义

2.修改时间戳生成和唯一nodeId生成的方法
... ... @@ -84,6 +84,12 @@ export default class MessageEntrance extends Emiter {
_video_ape = new VideoApe();
_video_ape.on('*', (type, data) => this._emit(type, data));
_video_ape.on(MessageTypes.VIDEO_UPDATE, this.videoUpdate.bind(this));
_whiteboard_ape = new WhiteBoardApe();
_whiteboard_ape.on('*', (type, data) => this._emit(type, data));
//_whiteboard_ape.on(MessageTypes.WHITEBOARD_ANNOTATION_UPDATE, this.annoUpdateHandler.bind(this));
_doc_ape = new DocApe();
_doc_ape.on('*', (type, data) => this._emit(type, data));
... ... @@ -92,10 +98,6 @@ export default class MessageEntrance extends Emiter {
_doc_ape.on(DocApe.DOC_JOIN_CHANNEL_SUCCESS, this.docJoinChannelSuccess.bind(this));
_whiteboard_ape = new WhiteBoardApe();
_whiteboard_ape.on('*', (type, data) => this._emit(type, data));
//_whiteboard_ape.on(MessageTypes.WHITEBOARD_ANNOTATION_UPDATE, this.annoUpdateHandler.bind(this));
//公开外部调用的方法
//class
... ... @@ -622,6 +624,13 @@ export default class MessageEntrance extends Emiter {
}
//VidoeApe
videoUpdate(_data){
//视频同步的消息发送改变,需要通知ferApe模块中的用户更新状态
if(_confer_ape){
_confer_ape.updaterRosterStatus(_data);
}
}
sendVideoCommandMsg(_param){
if(_video_ape){
_video_ape.sendVideoCommandMsg(_param);
... ... @@ -687,7 +696,6 @@ export default class MessageEntrance extends Emiter {
//DocApe
//获取文档完整路径
_getDocFullPath(_param){
if(_doc_ape){
... ...
... ... @@ -29,11 +29,17 @@ class EngineUtils{
}
//生成时间戳后9位 保证唯一
static creatTimestamp(){
static creatSoleNumberFromTimestamp(){
let time = new Date().getTime();
let timestamp:int = time % 1000000000;//time后9位
return timestamp;
}
//生成时间戳毫秒
static creatTimestamp(){
let time = parseInt(new Date().getTime()/1000);//精确到毫秒
return time;
}
//生成时间戳 string
static creatTimestampStr(){
let curTime = new Date();
... ...
... ... @@ -26,8 +26,8 @@ MessageTypes.CLASS_STATUS_INFO_CHANGE= 'class.status.info.change';//会议状态
MessageTypes.CHAT_RECEIVE = 'chat.receive';
//视频模块事件定义
MessageTypes.VIDEO_RECEIVE = 'video.receive';
MessageTypes.VIDEO_UPDATE = 'video.update';
MessageTypes.VIDEO_COMMAND= 'video.command';
//文档模块事件定义
MessageTypes.DOC_DELETE='document.delete';//删除文档
... ...
... ... @@ -69,17 +69,22 @@ ApeConsts.USER_MIC_OPEN = 0x0040; // 麦克风开启
ApeConsts.USER_CAMERA_OPEN = 0x0080; // 视频开启
//VIDEO MIC
ApeConsts.OPEN_CAMERA= "open.camera";
ApeConsts.CLOSE_CAMERA= "close.camera";
ApeConsts.OPEN_MIC= "open.mic";
ApeConsts.CLOSE_MIC= "close.mic";
//VIDEO MIC 流媒体消息操作控制类型
ApeConsts.MEDIA_ACTION_DEFAULT=0;
ApeConsts.MEDIA_ACTION_OPEN_CAMERA=1;// "open.camera";
ApeConsts.MEDIA_ACTION_CLOSE_CAMERA=2;// "close.camera";
ApeConsts.MEDIA_ACTION_OPEN_MIC= 3;//"open.mic";
ApeConsts.MEDIA_ACTION_CLOSE_MIC= 4;//"close.mic";
// VIDEO AUDIO CHANNEL使用状态
ApeConsts.CHANNEL_STATUS_RELEASED = 0;///< 无人占用状态
ApeConsts.CHANNEL_STATUS_OPENING = 1;///< 已经占用成功
//媒体类型
ApeConsts.MEDIA_TYPE_DEFAULT=0;//没有类型
ApeConsts.MEDIA_TYPE_VIDEO=1;//视频流(包含音频)
ApeConsts.MEDIA_TYPE_VIDEO=2;//音频流
//FLASH中使用下面4个
ApeConsts.CGS_RELEASED = 0;///< 无人占用状态
... ...
... ... @@ -70,7 +70,6 @@ class ConferApe extends Ape {
let userDataPdu = new pdu['RCNodeInfoUserDataPdu'];
userDataPdu.qq = '';
userDataPdu.skype = '';
userDataPdu.mobile = '';
nodeInfoRecordPdu.userData = userDataPdu.toArrayBuffer();
nodeInfoRecordPdu.deviceType =GlobalConfig.deviceType;//设备类型
... ... @@ -100,7 +99,7 @@ class ConferApe extends Ape {
}
sendConferMsg(_messageInfo) {
if(this._classInfo===null||EngineUtils.isEmptyObject(this._classInfo)){
if(this._classInfo==null||EngineUtils.isEmptyObject(this._classInfo)){
loger.log('不能发送会议消息.McuClient还未初始化数据!');
if(GlobalConfig.getCurrentStatus().code==0||GlobalConfig.getCurrentStatus().code==1){
this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_APE_SEND_FAILED_NO_JOIN);
... ... @@ -454,6 +453,11 @@ class ConferApe extends Ape {
}
}
//视频模块发生更新,人员状态需要更新
updaterRosterStatus(_param){
loger.log("视频模块发生更新,人员状态需要更新",_param);
//如果是自己。改变自己的状态同步到MCU
}
//删除用户
rosterDelHandler(nodeId) {
if(GlobalConfig.nodeId==nodeId){
... ...
... ... @@ -58,7 +58,7 @@ class DocApe extends Ape {
return;
}
itemIdx=EngineUtils.creatTimestamp();
itemIdx=EngineUtils.creatSoleNumberFromTimestamp();
let docDataModelPdu = this.packPdu(paramInfo,itemIdx);
if(docDataModelPdu==null){
loger.log('documentUpload失败,参数错误');
... ...
... ... @@ -35,9 +35,6 @@ class VideoChat extends Ape {
//Attributes
this.videoChannels = {};
this.activeChannelId = 0;
this.activeURL = '';
// Ape Models
this.registerKey(this._session_id, this._session_name, this._session_tag, new ArrayBuffer);
... ... @@ -168,7 +165,7 @@ class VideoChat extends Ape {
//return openedUsers;
}
sendVideoCommandMsg(_messageInfo) {
sendVideoCommandMsg(_param) {
if(this._classInfo===null||EngineUtils.isEmptyObject(this._classInfo)){
loger.log('不能发送Video消息.McuClient还未初始化数据!');
if(GlobalConfig.getCurrentStatus().code==0||GlobalConfig.getCurrentStatus().code==1){
... ... @@ -178,27 +175,27 @@ class VideoChat extends Ape {
return ;
}
// to, message
loger.log('发送Video消息.', _messageInfo);
loger.log('发送Video消息.', _param);
/* message RCVideoSendDataRequestPdu {
optional uint32 initiator = 1;
optional bool key_frame = 2;
optional uint32 sequence_id = 3;
optional uint32 slice_id = 4;
optional bytes user_data = 5;
}
*/
/* message RCVideoSendDataRequestPdu {
required uint32 from_node_id = 1;//发起人
optional uint32 to_node_id = 2;//接收人,如果是0就是所有人都接收
optional uint32 actionType = 3;//消息指令类型;
optional bytes data = 4;//其他数据,这个根据actionType来确定数据的结构
}*/
let videoSendPdu = new pdu['RCVideoSendDataRequestPdu'];
videoSendPdu.type = pdu.RCPDU_VIDEO_SEND_DATA_REQUEST;
videoSendPdu.initiator = GlobalConfig.nodeId;//发起人
videoSendPdu.peer = parseInt(_messageInfo.to);//发送给谁,公聊的时候是0,私聊的时候是指定的用户id
videoSendPdu.userData = this._rCArrayBufferUtil.strToUint8Array("h5" + _messageInfo.message);//开头两个字会乱码
videoSendPdu.isPublic = true;
videoSendPdu.sliceId=_messageInfo.sliceId||0;
if (!videoSendPdu.isPublic && 0!=videoSendPdu.peer) {
videoSendPdu.fromNodeId = GlobalConfig.nodeId;//发起人
videoSendPdu.toNodeId = parseInt(_param.toNodeID)||0;//接收者,0就是所有人
videoSendPdu.actionType = parseInt(_param.actionType)||ApeConsts.MEDIA_ACTION_DEFAULT;
videoSendPdu.data=this._rCArrayBufferUtil.strToUint8Array("h5" + _param.data);//开头两个字会乱码
if (!videoSendPdu.isPublic && 0!=videoSendPdu.toNodeId) {
//发送给制定的人
loger.log('发送私聊Video消息.');
this.send(videoSendPdu);
... ... @@ -253,20 +250,22 @@ class VideoChat extends Ape {
}
/////收到消息处理/////////////////////////////////////////////////////////////////////////////////
// 视频消息处理
videoCommandHandler(videoBuffer) {
let videoReceivePdu = pdu['RCVideoSendDataRequestPdu'].decode(videoBuffer);
let video_data = { };
video_data._initiator = videoReceivePdu.initiator;
video_data._is_key_frame = videoReceivePdu.keyFrame;
video_data._sequence_id = videoReceivePdu.sequenceId;
video_data._slice_id = videoReceivePdu.sliceId;
video_data._data = videoReceivePdu.userData;
// this._notify(RCApeEvent.E_VIDEO_DATA, videoReceivePdu.sessionId, videoReceivePdu.channelId, video_data);
loger.log('视频消息处理 videoCommandHandler.', video_data);
//this._emit(MessageTypes.VIDEO_RECEIVE, video_data);
// 视频消息处理,内部处理,不需要告诉应用层
videoCommandHandler(_data) {
let videoReceivePdu = pdu['RCVideoSendDataRequestPdu'].decode(_data);
if(videoReceivePdu==null) {
loger.warn("视频消息处理,收到的消息为null,不做处理");
return;
}
videoReceivePdu.data=this._rCArrayBufferUtil.uint8ArrayToStr(videoReceivePdu.data,2);//开头两个字会乱码
loger.log('视频消息处理 videoCommandHandler.', videoReceivePdu);
//判断接收者的id,如果不是0,并且也不是自己的nodeId,那么消息不做处理
if(videoReceivePdu.toNodeId!=0&&videoReceivePdu.toNodeId!=GlobalConfig.nodeId){
loger.log('视频消息不处理 toNodeId=', videoReceivePdu.toNodeId,"my nodeId=",GlobalConfig.nodeId);
}else {
this._emit(MessageTypes.VIDEO_COMMAND,videoReceivePdu);
}
}
tableUpdateHandler(owner, itemIdx, itemData) {
... ... @@ -278,6 +277,7 @@ class VideoChat extends Ape {
//loger.log('视频消息处理 tableUpdateHandler.',videoChannelInfo);
this.videoChannels[itemIdx] = videoChannelInfo;
this._emit(MessageTypes.VIDEO_UPDATE,videoChannelInfo);
/* switch (videoChannelInfo.status) {
case ApeConsts.CHANNEL_STATUS_RELEASED:
// 只能关闭自己的流
... ... @@ -306,7 +306,7 @@ class VideoChat extends Ape {
}
emitVideoChange() {
this._emit(MessageTypes.VIDEO_RECEIVE, {
this._emit(MessageTypes.VIDEO_UPDATE, {
activeChannelId: this.activeChannelId,
HLSURL: this.activeURL,
});
... ... @@ -334,6 +334,7 @@ class VideoChat extends Ape {
let packPduModel =new pdu['RCVideoChannelInfoPdu'];
packPduModel.status=ApeConsts.CHANNEL_STATUS_OPENING;
packPduModel.channelId=_itemIdx;
packPduModel.mediaType=ApeConsts.MEDIA_TYPE_VIDEO;
packPduModel.timestamp=EngineUtils.creatTimestamp();
packPduModel.fromNodeId =GlobalConfig.nodeId;
packPduModel.toNodeId = 0;
... ...
... ... @@ -69,7 +69,7 @@ class WhiteBoardApe extends Ape {
return ;
}
itemIdx=EngineUtils.creatTimestamp();
itemIdx=EngineUtils.creatSoleNumberFromTimestamp();
let whiteBoardModelPdu = this.packPdu(_param,itemIdx);
if(whiteBoardModelPdu==null){
loger.log('sendInsetAnnotaion失败,参数错误');
... ...
... ... @@ -166,7 +166,7 @@ class MCU extends Emiter {
_classInfo.classId = parseInt(_classInfo.classId); // classId 必须整形
this.classInfo = _classInfo;
// 创建刷新nodeId
this.classInfo.nodeId =EngineUtils.creatTimestamp();
this.classInfo.nodeId =EngineUtils.creatSoleNumberFromTimestamp();
GlobalConfig.nodeId=this.classInfo.nodeId;//这是标识自己身份的id
let nodeInfoRecordPdu = new pdu['RCNodeInfoRecordPdu'];
... ...
... ... @@ -735,12 +735,10 @@ message RCAudioSendDataRequestPdu {
}
message RCVideoSendDataRequestPdu {
required uint32 initiator = 1;
optional bool key_frame = 2;
optional uint32 sequence_id = 3;
optional uint32 slice_id = 4;
optional bytes user_data = 5;
optional uint32 action = 6;
required uint32 from_node_id = 1;//发起人
optional uint32 to_node_id = 2;//接收人,如果是0就是所有人都接收
optional uint32 actionType = 3;//消息指令类型;
optional bytes data = 4;//其他数据,这个根据actionType来确定数据的结构
}
message RCAudioChannelInfoRecordPdu {
... ... @@ -757,6 +755,7 @@ message RCVideoChannelInfoPdu {
optional uint32 timestamp = 3;//更新的时间戳
optional uint32 from_node_id = 4;//发起者的id
optional uint32 to_node_id = 5;//接收者的id,(如果是0,所有人都接收)
optional uint32 media_type = 6;//媒体类型:视频(包含音频)或音频
}
message RCVideoChannelInfoRecordPdu {
... ... @@ -835,10 +834,14 @@ message RCVotingPollRecordPdu {
}
message RCNodeInfoUserDataPdu {
optional string qq = 1;
optional string skype = 2;
optional string mobile = 3;
optional string device = 1;//设备名称
optional bool has_camera = 2;//是否有摄像头可用
optional bool has_microphone = 3;//麦克风是否可用
optional string browser = 4;//浏览器
optional string qq = 5;//qq
optional string skype = 6;//skype
}
message RCTabUpdateDataRequestPdu {
optional uint32 id = 1;
optional bytes action = 2;
... ...