Toggle navigation
Toggle navigation
此项目
正在载入...
Sign in
李勇
/
McuClient
转到一个项目
Toggle navigation
项目
群组
代码片段
帮助
Toggle navigation pinning
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Builds
Commits
Authored by
李勇
8 years ago
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
c5fa90d4a177a724c319aaff5fbba8b839eff010
c5fa90d4
1 parent
4669408c
增加系统信息和平台信息
隐藏空白字符变更
内嵌
并排对比
正在显示
7 个修改的文件
包含
350 行增加
和
229 行删除
dist/McuClient.js
src/EngineEntrance.js
src/GlobalConfig.js
src/SystemConfig.js
src/apes/ConferApe.js
src/mcu.js
src/pdus/pro.js
dist/McuClient.js
查看文件 @
c5fa90d
此 diff 太大无法显示。
src/EngineEntrance.js
查看文件 @
c5fa90d
...
...
@@ -22,6 +22,8 @@ import CursorApe from 'apes/CursorApe';
import
EngineUtils
from
"EngineUtils"
;
import
GlobalConfig
from
'GlobalConfig'
;
import
SystemConfig
from
'SystemConfig'
;
import
ApeConsts
from
'apes/ApeConsts'
;
import
Base64
from
'base64-js'
;
import
ArrayBufferUtil
from
'libs/ArrayBufferUtil'
;
...
...
@@ -30,11 +32,10 @@ import MediaModule from 'apes/MediaModule';
import
MediaSharedApe
from
'apes/MediaSharedApe'
;
import
MusicSharedApe
from
'apes/MusicSharedApe'
;
import
QuestionApe
from
'apes/QuestionApe'
;
import
mdetect
from
"mdetect"
;
import
UTF8
from
'utf-8'
;
let
loger
=
Loger
.
getLoger
(
'McuClient'
);
let
_sdkInfo
=
{
"version"
:
"v1.4
3.1.20170711
"
,
"author"
:
"www.3mang.com"
};
let
_sdkInfo
=
{
"version"
:
"v1.4
5.1.20170717
"
,
"author"
:
"www.3mang.com"
};
//APE
let
_sass
;
...
...
@@ -59,13 +60,8 @@ export default class MessageEntrance extends Emiter {
//sdk 信息
this
.
sdkInfo
=
_sdkInfo
;
loger
.
warn
(
this
.
sdkInfo
);
//检查是否是移动端
GlobalConfig
.
isMobile
=
mdetect
.
isMobileUA
();
if
(
GlobalConfig
.
isMobile
)
{
loger
.
warn
(
"当前设备是移动设备"
);
}
else
{
loger
.
warn
(
"当前设备是PC"
);
}
//获取设备和系统信息
SystemConfig
.
getSystemInfo
();
this
.
classRecordStatusUpdateTimer
=
0
;
//课堂录制状态发生改变后同步当前所有模块数据的计时器
//初始化状态
...
...
@@ -254,6 +250,7 @@ export default class MessageEntrance extends Emiter {
this
.
switchMediaServer
=
this
.
_switchMediaServer
.
bind
(
this
);
//手动切换ms服务器
this
.
setDebugInfo
=
this
.
_setDebugInfo
.
bind
(
this
);
//设置debug信息
}
_setDebugInfo
(
_data
)
{
loger
.
log
(
"设置debug信息-->"
,
_data
);
if
(
_data
)
{
...
...
@@ -264,14 +261,6 @@ export default class MessageEntrance extends Emiter {
_setDeviceInfo
(
_data
)
{
loger
.
log
(
"设置设备信息-->"
,
_data
);
if
(
_data
)
{
/* GlobalConfig.videoQuality=_data.videoQuality||2;//画面质量 0-低;1-中;2-高;
GlobalConfig.cameras=_data.cameras||[];//摄像头列表
GlobalConfig.microphones=_data.microphones||[];//麦克风列表
GlobalConfig.curCamera=_data.curCamera||'';//当前选择的摄像头
GlobalConfig.curMicrophone=_data.curMicrophone||'';//当前选择的麦克风
GlobalConfig.curVideoQuality=_data.curVideoQuality||2;//当前选择的分辨率
GlobalConfig.micGain=_data.micGain||50;//音量(0-80)*/
GlobalConfig
.
cameras
=
_data
.
cameras
||
[];
GlobalConfig
.
microphones
=
_data
.
microphones
||
[];
GlobalConfig
.
videoQuality
=
parseInt
(
_data
.
videoQuality
);
...
...
@@ -810,6 +799,13 @@ export default class MessageEntrance extends Emiter {
joinClassSuccessCallBackData
.
ssTunnelAppURL
=
GlobalConfig
.
ssTunnelAppURL
;
joinClassSuccessCallBackData
.
currentSceneTableId
=
GlobalConfig
.
currentSceneTableId
;
//文档区域的模块显示
joinClassSuccessCallBackData
.
serverAndLoacTimeDistanc
=
GlobalConfig
.
serverAndLoacTimeDistanc
;
joinClassSuccessCallBackData
.
deviceType
=
GlobalConfig
.
deviceType
;
joinClassSuccessCallBackData
.
language
=
GlobalConfig
.
language
;
joinClassSuccessCallBackData
.
explorer
=
GlobalConfig
.
explorer
;
joinClassSuccessCallBackData
.
explorerVersion
=
GlobalConfig
.
explorerVersion
;
joinClassSuccessCallBackData
.
os
=
GlobalConfig
.
os
;
loger
.
log
(
'加入课堂成功->'
);
loger
.
log
(
joinClassSuccessCallBackData
);
...
...
@@ -2014,6 +2010,13 @@ export default class MessageEntrance extends Emiter {
joinClassSuccessCallBackData
.
ssTunnelAppURL
=
GlobalConfig
.
ssTunnelAppURL
;
joinClassSuccessCallBackData
.
currentSceneTableId
=
GlobalConfig
.
currentSceneTableId
;
//文档区域的模块显示
joinClassSuccessCallBackData
.
serverAndLoacTimeDistanc
=
GlobalConfig
.
serverAndLoacTimeDistanc
;
joinClassSuccessCallBackData
.
deviceType
=
GlobalConfig
.
deviceType
;
joinClassSuccessCallBackData
.
language
=
GlobalConfig
.
language
;
joinClassSuccessCallBackData
.
explorer
=
GlobalConfig
.
explorer
;
joinClassSuccessCallBackData
.
explorerVersion
=
GlobalConfig
.
explorerVersion
;
joinClassSuccessCallBackData
.
os
=
GlobalConfig
.
os
;
loger
.
log
(
joinClassSuccessCallBackData
);
//和加入课堂成功使用同样的消息处理
this
.
_emit
(
MessageTypes
.
CLASS_JOIN_SUCCESS
,
joinClassSuccessCallBackData
);
...
...
src/GlobalConfig.js
查看文件 @
c5fa90d
...
...
@@ -368,7 +368,7 @@ GlobalConfig.maxMediaChannels = 0; //最大音视频路数,以音视频路数
GlobalConfig
.
hasCamera
=
false
;
//摄像头是否可用
GlobalConfig
.
hasMicrophone
=
false
;
//麦克风是否可用
GlobalConfig
.
deviceType
=
0
;
//设备类型 0:电脑 1:
安卓 2:ios
GlobalConfig
.
deviceType
=
0
;
//设备类型 0:电脑 1:
ios 2:安卓
GlobalConfig
.
userIp
=
""
;
//用户当前IP
GlobalConfig
.
userId
=
0
;
GlobalConfig
.
userName
=
""
;
...
...
@@ -379,8 +379,8 @@ GlobalConfig.openMicrophones = 0;
//视频质量相关设置
GlobalConfig
.
fps
=
15
;
//帧频
GlobalConfig
.
gop
=
3
;
//关键帧间隔(秒)
GlobalConfig
.
videoQuality
=
2
;
//画面质量 0-低;1-中;2-高;
GlobalConfig
.
curVideoQuality
=
2
;
//当前分辨率
GlobalConfig
.
videoQuality
=
1
;
//画面质量 0-低;1-中;2-高;
GlobalConfig
.
curVideoQuality
=
1
;
//当前分辨率
GlobalConfig
.
cameras
=
[];
//摄像头列表
GlobalConfig
.
microphones
=
[];
//麦克风列表
...
...
@@ -480,7 +480,13 @@ GlobalConfig.ssTunnelAppURL = ''; //屏幕共享插件的地址
GlobalConfig
.
serverTime
=
0
;
//服务器当前时间戳
GlobalConfig
.
serverAndLoacTimeDistanc
=
0
;
//本地时间和服务器时间错的差值;
GlobalConfig
.
isMobile
=
false
;
//是否是移动端
GlobalConfig
.
rosterNumber
=
0
;
//当前总人数
GlobalConfig
.
isMobile
=
false
;
//是否是移动端
GlobalConfig
.
language
=
""
;
//浏览器语言
GlobalConfig
.
platform
=
"pc"
;
//平台 IOS/ANDROID/PC
GlobalConfig
.
explorer
=
"未知"
;
//浏览器
GlobalConfig
.
explorerVersion
=
"未知"
;
//浏览器版本
GlobalConfig
.
os
=
"未知"
;
//系统
export
default
GlobalConfig
;
...
...
src/SystemConfig.js
0 → 100644
查看文件 @
c5fa90d
/*
* 全局数据管理
* */
import
Loger
from
'Loger'
;
import
mdetect
from
"mdetect"
;
import
GlobalConfig
from
'GlobalConfig'
;
let
loger
=
Loger
.
getLoger
(
'SystemConfig'
);
class
SystemConfig
{
constructor
()
{
}
//获取系统信息
static
getSystemInfo
(){
//检查是否是移动端
GlobalConfig
.
isMobile
=
mdetect
.
isMobileUA
();
if
(
GlobalConfig
.
isMobile
)
{
loger
.
warn
(
"当前设备是移动设备"
);
}
else
{
loger
.
warn
(
"当前设备是PC"
);
}
if
(
mdetect
.
isIOS
()){
GlobalConfig
.
deviceType
=
1
;
//"ios";
}
if
(
mdetect
.
isAndroid
()){
GlobalConfig
.
platform
=
2
;
//"android";
}
else
{
GlobalConfig
.
platform
=
0
;
//"pc";
}
//语言
GlobalConfig
.
language
=
"unknown"
;
if
(
navigator
){
let
language
=
navigator
.
language
||
navigator
.
browserLanguage
;
GlobalConfig
.
language
=
language
.
toLocaleLowerCase
();
}
let
browserInfo
=
this
.
getBrowserInfo
();
GlobalConfig
.
explorer
=
browserInfo
.
explorer
||
"未知"
;
GlobalConfig
.
explorerVersion
=
browserInfo
.
explorerVersion
||
"未知"
;
GlobalConfig
.
os
=
this
.
detectOS
();
loger
.
log
(
"deviceType:"
+
GlobalConfig
.
deviceType
);
loger
.
log
(
"language:"
+
GlobalConfig
.
language
);
loger
.
log
(
"explorer:"
+
GlobalConfig
.
explorer
);
loger
.
log
(
"explorerVersion:"
+
GlobalConfig
.
explorerVersion
);
loger
.
log
(
"os:"
+
GlobalConfig
.
os
);
}
//获取浏览器和信息
static
getBrowserInfo
(){
var
Sys
=
{};
var
ua
=
navigator
.
userAgent
.
toLowerCase
();
var
re
=
/
(
trident|msie|firefox|chrome|opera|version
)
.*
?([\d
.
]
+
)
/
;
var
m
=
ua
.
match
(
re
);
Sys
.
explorer
=
m
[
1
].
replace
(
/version/
,
"'safari"
);
//判断是否是IE11
if
(
Sys
.
explorer
==
"trident"
){
Sys
.
explorer
=
"IE11"
Sys
.
explorerVersion
=
"11.0"
;
}
else
if
(
Sys
.
explorer
==
"msie"
){
//IE
Sys
.
explorer
=
"IE"
Sys
.
explorerVersion
=
m
[
2
];
}
else
{
//非IE
Sys
.
explorerVersion
=
m
[
2
];
}
return
Sys
;
}
//系统信息
static
detectOS
()
{
var
sUserAgent
=
navigator
.
userAgent
;
var
isWin
=
(
navigator
.
platform
==
"Win32"
)
||
(
navigator
.
platform
==
"Windows"
);
var
isMac
=
(
navigator
.
platform
==
"Mac68K"
)
||
(
navigator
.
platform
==
"MacPPC"
)
||
(
navigator
.
platform
==
"Macintosh"
)
||
(
navigator
.
platform
==
"MacIntel"
);
if
(
isMac
)
return
"Mac"
;
var
isUnix
=
(
navigator
.
platform
==
"X11"
)
&&
!
isWin
&&
!
isMac
;
if
(
isUnix
)
return
"Unix"
;
var
isLinux
=
(
String
(
navigator
.
platform
).
indexOf
(
"Linux"
)
>
-
1
);
if
(
isLinux
)
return
"Linux"
;
if
(
isWin
)
{
var
isWin2K
=
sUserAgent
.
indexOf
(
"Windows NT 5.0"
)
>
-
1
||
sUserAgent
.
indexOf
(
"Windows 2000"
)
>
-
1
;
if
(
isWin2K
)
return
"Win2000"
;
var
isWinXP
=
sUserAgent
.
indexOf
(
"Windows NT 5.1"
)
>
-
1
||
sUserAgent
.
indexOf
(
"Windows XP"
)
>
-
1
;
if
(
isWinXP
)
return
"WinXP"
;
var
isWin2003
=
sUserAgent
.
indexOf
(
"Windows NT 5.2"
)
>
-
1
||
sUserAgent
.
indexOf
(
"Windows 2003"
)
>
-
1
;
if
(
isWin2003
)
return
"Win2003"
;
var
isWinVista
=
sUserAgent
.
indexOf
(
"Windows NT 6.0"
)
>
-
1
||
sUserAgent
.
indexOf
(
"Windows Vista"
)
>
-
1
;
if
(
isWinVista
)
return
"WinVista"
;
var
isWin7
=
sUserAgent
.
indexOf
(
"Windows NT 6.1"
)
>
-
1
||
sUserAgent
.
indexOf
(
"Windows 7"
)
>
-
1
;
if
(
isWin7
)
return
"Win7"
;
}
return
"other"
;
}
}
export
default
SystemConfig
;
...
...
src/apes/ConferApe.js
查看文件 @
c5fa90d
...
...
@@ -143,6 +143,12 @@ class ConferApe extends Ape {
//用户当前选择的MS
nodeInfoRecordPdu
.
msIpPort
=
GlobalConfig
.
MS_PUBLISH_IP
+
":"
+
GlobalConfig
.
MS_PUBLISH_PORT
;
nodeInfoRecordPdu
.
deviceType
=
GlobalConfig
.
deviceType
;
nodeInfoRecordPdu
.
language
=
GlobalConfig
.
language
;
nodeInfoRecordPdu
.
explorer
=
GlobalConfig
.
explorer
;
nodeInfoRecordPdu
.
explorerVersion
=
GlobalConfig
.
explorerVersion
;
nodeInfoRecordPdu
.
os
=
GlobalConfig
.
os
;
return
nodeInfoRecordPdu
;
}
...
...
src/mcu.js
查看文件 @
c5fa90d
...
...
@@ -17,233 +17,240 @@ import EngineUtils from 'EngineUtils';
let
loger
=
Loger
.
getLoger
(
'MCU'
);
class
MCU
extends
Emiter
{
constructor
()
{
super
();
this
.
_apes
=
{};
this
.
_everSocket
=
everSocket
;
this
.
_everSocket
.
on
(
everSocket
.
OPEN
,
this
.
_everSocketOpenHandler
.
bind
(
this
));
this
.
_everSocket
.
on
(
everSocket
.
MESSAGE
,
this
.
_everSocketMsgReceivedHandler
.
bind
(
this
));
this
.
_everSocket
.
on
(
everSocket
.
CLOSED
,
this
.
_everSocketCloseHandler
.
bind
(
this
));
this
.
_everSocket
.
on
(
everSocket
.
ERROR
,
this
.
_everSocketErrorHandler
.
bind
(
this
));
}
constructor
()
{
super
();
this
.
_apes
=
{};
this
.
_everSocket
=
everSocket
;
this
.
_everSocket
.
on
(
everSocket
.
OPEN
,
this
.
_everSocketOpenHandler
.
bind
(
this
));
this
.
_everSocket
.
on
(
everSocket
.
MESSAGE
,
this
.
_everSocketMsgReceivedHandler
.
bind
(
this
));
this
.
_everSocket
.
on
(
everSocket
.
CLOSED
,
this
.
_everSocketCloseHandler
.
bind
(
this
));
this
.
_everSocket
.
on
(
everSocket
.
ERROR
,
this
.
_everSocketErrorHandler
.
bind
(
this
));
}
// 注册Ape
registerApe
(
ape
)
{
this
.
_apes
[
ape
.
_session_id
]
=
ape
;
}
// 注册Ape
registerApe
(
ape
)
{
this
.
_apes
[
ape
.
_session_id
]
=
ape
;
}
// EverSocket建立通道完毕
_everSocketOpenHandler
()
{
this
.
_sendJoinClassRequest
();
}
// EverSocket建立通道完毕
_everSocketOpenHandler
()
{
this
.
_sendJoinClassRequest
();
}
// EverSocket连接断开
_everSocketCloseHandler
()
{
//如果已经是断开状态,不需要多次发送异常消息
if
(
GlobalConfig
.
getCurrentStatus
().
code
==
GlobalConfig
.
statusCode_3
.
code
)
{
loger
.
warn
(
'已经断开连接->'
);
return
;
}
GlobalConfig
.
setCurrentStatus
(
GlobalConfig
.
statusCode_3
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_SOCKET_DISCONNECT
);
// EverSocket连接断开
_everSocketCloseHandler
()
{
//如果已经是断开状态,不需要多次发送异常消息
if
(
GlobalConfig
.
getCurrentStatus
().
code
==
GlobalConfig
.
statusCode_3
.
code
)
{
loger
.
warn
(
'已经断开连接->'
);
return
;
}
GlobalConfig
.
setCurrentStatus
(
GlobalConfig
.
statusCode_3
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_SOCKET_DISCONNECT
);
}
//EverSocket错误异常
_everSocketErrorHandler
(
_errorCode
)
{
//this._emit(MessageTypes.MCU_ERROR, _errorCode);
//如果自动重连次数已经达到最大值,重新选点
if
(
_errorCode
==
everSocket
.
ERR_SOCKET_RECONNECT_FAILED
)
{
this
.
_emit
(
MessageTypes
.
SWITCH_MCU_IP
);
}
//EverSocket错误异常
_everSocketErrorHandler
(
_errorCode
)
{
//this._emit(MessageTypes.MCU_ERROR, _errorCode);
//如果自动重连次数已经达到最大值,重新选点
if
(
_errorCode
==
everSocket
.
ERR_SOCKET_RECONNECT_FAILED
)
{
this
.
_emit
(
MessageTypes
.
SWITCH_MCU_IP
);
}
}
//MCU-发送加入课堂请求
_sendJoinClassRequest
()
{
//const classInfo = this.classInfo;
loger
.
log
(
'MCU-发送加入课堂请求.'
);
loger
.
log
(
this
.
classInfo
);
var
descriptorPdu
=
new
pdu
[
'RCConferenceDescriptorPdu'
];
descriptorPdu
.
id
=
this
.
classInfo
.
classId
;
descriptorPdu
.
name
=
this
.
classInfo
.
className
||
""
;
descriptorPdu
.
mode
=
0
;
descriptorPdu
.
capacity
=
1
;
var
joinRequestPdu
=
new
pdu
[
'RCConferenceJoinRequestPdu'
];
joinRequestPdu
.
type
=
2
;
joinRequestPdu
.
initiator
=
this
.
classInfo
.
nodeId
;
joinRequestPdu
.
nodeType
=
PduConsts
.
NT_TERMINAL
;
//normal
joinRequestPdu
.
classDescription
=
descriptorPdu
;
// classDescription
let
pduMsg
=
pdu
.
create_join_class_request_pdu
(
joinRequestPdu
.
type
,
this
.
classInfo
.
nodeId
,
this
.
classInfo
.
classId
,
0
,
ApeConsts
.
BROADCAST_CHANNEL_ID
,
true
,
PduConsts
.
DP_TOP
,
this
.
classInfo
.
topNodeID
,
PduConsts
.
SEG_ONCE
);
pduMsg
.
set
(
"site"
,
this
.
classInfo
.
siteId
);
//课堂号对应的名称
pduMsg
.
set
(
"userId"
,
this
.
classInfo
.
userId
);
pduMsg
.
set
(
"userName"
,
Base64
.
fromByteArray
(
ArrayBufferUtil
.
strToUint8Array
(
this
.
classInfo
.
userName
)));
pduMsg
.
set
(
"userRole"
,
this
.
classInfo
.
userRole
);
pduMsg
.
set
(
"deviceType"
,
""
+
GlobalConfig
.
deviceType
);
pduMsg
.
set
(
"data"
,
joinRequestPdu
.
toArrayBuffer
());
this
.
_everSocket
.
send
(
pduMsg
.
toArrayBuffer
());
}
//MCU-发送加入课堂请求
_sendJoinClassRequest
()
{
//const classInfo = this.classInfo;
loger
.
log
(
'MCU-发送加入课堂请求.'
);
loger
.
log
(
this
.
classInfo
);
var
descriptorPdu
=
new
pdu
[
'RCConferenceDescriptorPdu'
];
descriptorPdu
.
id
=
this
.
classInfo
.
classId
;
descriptorPdu
.
name
=
this
.
classInfo
.
className
||
""
;
descriptorPdu
.
mode
=
0
;
descriptorPdu
.
capacity
=
1
;
// EverSocket底层消息处理
_everSocketMsgReceivedHandler
(
data
)
{
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
.
result
;
loger
.
warn
(
'RCPDU_CONNECT_PROVIDER_RESPONSE ->pduResultCode:'
+
pduResultCode
);
switch
(
pduResultCode
)
{
case
PduConsts
.
RET_SUCCESS
:
//加入成功
this
.
_updateMCUConfInfoDescription
(
joinConfPdu
.
classDescription
);
this
.
_emit
(
MessageTypes
.
CLASS_JOIN_MCU_SUCCESS
,
this
.
classInfo
);
break
;
case
PduConsts
.
RET_FULL_CAPACITY
:
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_CLASS_JOIN_FULL
);
//this._emit(MessageTypes.CLASS_JOIN_FAILED,MessageTypes.ERR_CLASS_JOIN_FULL);
//this._emit(MessageTypes.CLASS_JOIN_FULL);
break
;
default
:
loger
.
arn
(
'JoinConfPdu-未知类型-等待处理.'
,
pduResultCode
);
break
}
break
;
case
PduType
.
RCPDU_SEND_DATA_REQUEST
:
//先判断当前消息属于哪个APE 根据 sessionId来判断
let
ape
=
this
.
_apes
[
pduMsg
.
sessionId
];
let
sessionLabel
=
ApeConsts
(
pduMsg
.
sessionId
);
if
(
ape
)
{
let
subTypeLabel
=
pdu
.
id2type
(
pduMsg
.
subType
);
//loger.log('MCU-SecondLayer封装消息', 'sessionId', sessionLabel, pduMsg.sessionId, 'subtype', subTypeLabel, pduMsg.subType);
loger
.
warn
(
'接收服务端消息----------------->subType->'
,
pduMsg
.
subType
,
GlobalConfig
.
mcuDelay
,
GlobalConfig
.
messageDelay
);
//延迟处理消息(3个条件--->ape允许延迟&&客户端设置需要延迟&&Sass设置的延迟时间大于0)
if
(
ape
.
_apeDelayed
&&
GlobalConfig
.
messageDelay
&&
GlobalConfig
.
mcuDelay
>
0
)
{
loger
.
warn
(
'延迟处理消息->'
,
GlobalConfig
.
mcuDelay
);
setTimeout
(()
=>
{
//this._pduRegAdapterHandler(regBuffer, seekTime);
ape
.
_emit
(
pduMsg
.
subType
,
pduMsg
.
data
);
},
GlobalConfig
.
mcuDelay
*
1000
);
//mcuDelay单位是秒,
// 这里需要换算为毫秒
return
;
}
ape
.
_emit
(
pduMsg
.
subType
,
pduMsg
.
data
);
}
else
{
loger
.
warn
(
sessionLabel
+
'尚未注册'
);
}
break
;
default
:
loger
.
warn
(
'PDU-未知类型-等待处理.'
,
pduType
);
}
}
var
joinRequestPdu
=
new
pdu
[
'RCConferenceJoinRequestPdu'
];
joinRequestPdu
.
type
=
2
;
joinRequestPdu
.
initiator
=
this
.
classInfo
.
nodeId
;
joinRequestPdu
.
nodeType
=
PduConsts
.
NT_TERMINAL
;
//normal
joinRequestPdu
.
classDescription
=
descriptorPdu
;
// classDescription
_updateMCUConfInfoDescription
(
_data
)
{
// let _mcuConfDesc=new pdu['RCConferenceDescriptorPdu'].decode(mcuConfDesc);
loger
.
log
(
'_updateMCUConfInfoDescription.'
);
//let classDescription=new pdu['RCConferenceDescriptorPdu'].decode(_data);
loger
.
log
(
_data
);
//let info = this.mcuClassInfo.info;
//info._conference_name = ArrayBufferUtil.uint8ArrayToStr(mcuConfDesc.name, 0);
//info._capacity = mcuConfDesc.capacity;
//info._mode = mcuConfDesc.mode;
}
let
pduMsg
=
pdu
.
create_join_class_request_pdu
(
joinRequestPdu
.
type
,
this
.
classInfo
.
nodeId
,
this
.
classInfo
.
classId
,
0
,
ApeConsts
.
BROADCAST_CHANNEL_ID
,
true
,
PduConsts
.
DP_TOP
,
this
.
classInfo
.
topNodeID
,
PduConsts
.
SEG_ONCE
);
// MU服务是否连接
get
connected
()
{
if
(
this
.
_everSocket
&&
this
.
_everSocket
.
connected
)
return
true
;
return
false
;
}
pduMsg
.
set
(
"site"
,
this
.
classInfo
.
siteId
);
//课堂号对应的名称
pduMsg
.
set
(
"userId"
,
this
.
classInfo
.
userId
);
pduMsg
.
set
(
"userName"
,
Base64
.
fromByteArray
(
ArrayBufferUtil
.
strToUint8Array
(
this
.
classInfo
.
userName
)));
pduMsg
.
set
(
"userRole"
,
this
.
classInfo
.
userRole
);
pduMsg
.
set
(
"deviceType"
,
""
+
GlobalConfig
.
deviceType
);
pduMsg
.
set
(
"data"
,
joinRequestPdu
.
toArrayBuffer
());
this
.
_everSocket
.
send
(
pduMsg
.
toArrayBuffer
());
}
// EverSocket底层消息处理
_everSocketMsgReceivedHandler
(
data
)
{
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
.
result
;
loger
.
warn
(
'RCPDU_CONNECT_PROVIDER_RESPONSE ->pduResultCode:'
+
pduResultCode
);
switch
(
pduResultCode
)
{
case
PduConsts
.
RET_SUCCESS
:
//加入成功
this
.
_updateMCUConfInfoDescription
(
joinConfPdu
.
classDescription
);
this
.
_emit
(
MessageTypes
.
CLASS_JOIN_MCU_SUCCESS
,
this
.
classInfo
);
break
;
case
PduConsts
.
RET_FULL_CAPACITY
:
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_CLASS_JOIN_FULL
);
//this._emit(MessageTypes.CLASS_JOIN_FAILED,MessageTypes.ERR_CLASS_JOIN_FULL);
//this._emit(MessageTypes.CLASS_JOIN_FULL);
break
;
default
:
loger
.
arn
(
'JoinConfPdu-未知类型-等待处理.'
,
pduResultCode
);
break
}
break
;
case
PduType
.
RCPDU_SEND_DATA_REQUEST
:
//先判断当前消息属于哪个APE 根据 sessionId来判断
let
ape
=
this
.
_apes
[
pduMsg
.
sessionId
];
let
sessionLabel
=
ApeConsts
(
pduMsg
.
sessionId
);
if
(
ape
)
{
let
subTypeLabel
=
pdu
.
id2type
(
pduMsg
.
subType
);
//loger.log('MCU-SecondLayer封装消息', 'sessionId', sessionLabel, pduMsg.sessionId, 'subtype', subTypeLabel, pduMsg.subType);
// 课堂发送消息 -- 消息同意序列号
send
(
msg
)
{
if
(
this
.
connected
)
{
loger
.
log
(
'发送数据到服务端-------------------->'
);
this
.
_everSocket
.
send
(
msg
.
toArrayBuffer
());
loger
.
warn
(
'接收服务端消息----------------->subType->'
,
pduMsg
.
subType
,
GlobalConfig
.
mcuDelay
,
GlobalConfig
.
messageDelay
);
//延迟处理消息(3个条件--->ape允许延迟&&客户端设置需要延迟&&Sass设置的延迟时间大于0)
if
(
ape
.
_apeDelayed
&&
GlobalConfig
.
messageDelay
&&
GlobalConfig
.
mcuDelay
>
0
)
{
loger
.
warn
(
'延迟处理消息->'
,
GlobalConfig
.
mcuDelay
);
setTimeout
(()
=>
{
//this._pduRegAdapterHandler(regBuffer, seekTime);
ape
.
_emit
(
pduMsg
.
subType
,
pduMsg
.
data
);
},
GlobalConfig
.
mcuDelay
*
1000
);
//mcuDelay单位是秒,
// 这里需要换算为毫秒
return
;
}
ape
.
_emit
(
pduMsg
.
subType
,
pduMsg
.
data
);
}
else
{
loger
.
log
(
'发送数据到服务端-------------------->失败->未连接到服务端'
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_SOCKET_DISCONNECT
);
loger
.
warn
(
sessionLabel
+
'尚未注册'
);
}
break
;
default
:
loger
.
warn
(
'PDU-未知类型-等待处理.'
,
pduType
);
}
}
// 主动断开MCU连接
leaveMCU
()
{
for
(
let
ape
in
this
.
_apes
)
{
this
.
_apes
[
ape
].
stopApe
();
}
loger
.
log
(
'leaveMCU'
);
GlobalConfig
.
setCurrentStatus
(
GlobalConfig
.
statusCode_3
);
GlobalConfig
.
classJoinSuccess
=
false
;
this
.
_everSocket
.
end
();
_updateMCUConfInfoDescription
(
_data
)
{
// let _mcuConfDesc=new pdu['RCConferenceDescriptorPdu'].decode(mcuConfDesc);
loger
.
log
(
'_updateMCUConfInfoDescription.'
);
//let classDescription=new pdu['RCConferenceDescriptorPdu'].decode(_data);
loger
.
log
(
_data
);
//let info = this.mcuClassInfo.info;
//info._conference_name = ArrayBufferUtil.uint8ArrayToStr(mcuConfDesc.name, 0);
//info._capacity = mcuConfDesc.capacity;
//info._mode = mcuConfDesc.mode;
}
// MU服务是否连接
get
connected
()
{
if
(
this
.
_everSocket
&&
this
.
_everSocket
.
connected
)
return
true
;
return
false
;
}
// 课堂发送消息 -- 消息同意序列号
send
(
msg
)
{
if
(
this
.
connected
)
{
loger
.
log
(
'发送数据到服务端-------------------->'
);
this
.
_everSocket
.
send
(
msg
.
toArrayBuffer
());
}
else
{
loger
.
log
(
'发送数据到服务端-------------------->失败->未连接到服务端'
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_SOCKET_DISCONNECT
);
}
}
// 主动建立MCU连接
joinMCU
(
_classInfo
)
{
loger
.
log
(
'开始建立EverSocket通道.'
);
GlobalConfig
.
classJoinSuccess
=
false
;
loger
.
log
(
_classInfo
);
_classInfo
.
classId
=
parseInt
(
_classInfo
.
classId
);
// classId 必须整形
this
.
classInfo
=
_classInfo
;
// 创建刷新nodeId
this
.
classInfo
.
nodeId
=
EngineUtils
.
creatSoleNumberFromTimestamp
();
GlobalConfig
.
nodeId
=
this
.
classInfo
.
nodeId
;
//这是标识自己身份的id
let
nodeInfoRecordPdu
=
new
pdu
[
'RCNodeInfoRecordPdu'
];
nodeInfoRecordPdu
.
name
=
this
.
classInfo
.
userName
;
nodeInfoRecordPdu
.
nodeId
=
this
.
classInfo
.
nodeId
;
nodeInfoRecordPdu
.
userId
=
this
.
classInfo
.
userId
;
nodeInfoRecordPdu
.
role
=
ApeConsts
.
userTypesToId
[
this
.
classInfo
.
userRole
]
||
1
;
//NR_NORMAL用户的身份,根据用户登录时的身份设置
nodeInfoRecordPdu
.
level
=
0
;
nodeInfoRecordPdu
.
handUpTime
=
0
;
nodeInfoRecordPdu
.
openCamera
=
0
;
nodeInfoRecordPdu
.
openMicrophones
=
0
;
nodeInfoRecordPdu
.
microphones
=
GlobalConfig
.
microphones
;
nodeInfoRecordPdu
.
cameras
=
GlobalConfig
.
cameras
;
nodeInfoRecordPdu
.
videoQuality
=
GlobalConfig
.
videoQuality
;
//设置分辨率的
nodeInfoRecordPdu
.
userIp
=
GlobalConfig
.
userIp
;
let
conferenceRecord
=
{};
//RCConferenceRecord_T
conferenceRecord
.
_conference_id
=
this
.
classInfo
.
classId
;
conferenceRecord
.
_top_node_id
=
this
.
classInfo
.
topNodeID
;
this
.
mcuClassInfo
=
{};
//RCMeetingInfo_T
this
.
mcuClassInfo
.
self
=
nodeInfoRecordPdu
;
this
.
mcuClassInfo
.
info
=
conferenceRecord
;
// 内部mcuConfInfo
this
.
classInfo
.
mcuClassInfo
=
this
.
mcuClassInfo
;
//开启EverSocket
this
.
_everSocket
.
begin
(
this
.
classInfo
.
MCUServerIP
,
this
.
classInfo
.
MCUServerPort
);
// 主动断开MCU连接
leaveMCU
()
{
for
(
let
ape
in
this
.
_apes
)
{
this
.
_apes
[
ape
].
stopApe
();
}
loger
.
log
(
'leaveMCU'
);
GlobalConfig
.
setCurrentStatus
(
GlobalConfig
.
statusCode_3
);
GlobalConfig
.
classJoinSuccess
=
false
;
this
.
_everSocket
.
end
();
}
//切换MCU的ip
switchMCUIp
(
_classInfo
)
{
if
(
_classInfo
&&
_classInfo
.
MCUServerIP
)
{
this
.
classInfo
.
MCUServerIP
=
_classInfo
.
MCUServerIP
;
this
.
classInfo
.
MCUServerPort
=
_classInfo
.
MCUServerPort
;
if
(
this
.
_everSocket
)
{
this
.
_everSocket
.
switchSocketIp
(
this
.
classInfo
.
MCUServerIP
,
this
.
classInfo
.
MCUServerPort
);
}
}
// 主动建立MCU连接
joinMCU
(
_classInfo
)
{
loger
.
log
(
'开始建立EverSocket通道.'
);
GlobalConfig
.
classJoinSuccess
=
false
;
loger
.
log
(
_classInfo
);
_classInfo
.
classId
=
parseInt
(
_classInfo
.
classId
);
// classId 必须整形
this
.
classInfo
=
_classInfo
;
// 创建刷新nodeId
this
.
classInfo
.
nodeId
=
EngineUtils
.
creatSoleNumberFromTimestamp
();
GlobalConfig
.
nodeId
=
this
.
classInfo
.
nodeId
;
//这是标识自己身份的id
let
nodeInfoRecordPdu
=
new
pdu
[
'RCNodeInfoRecordPdu'
];
nodeInfoRecordPdu
.
name
=
this
.
classInfo
.
userName
;
nodeInfoRecordPdu
.
nodeId
=
this
.
classInfo
.
nodeId
;
nodeInfoRecordPdu
.
userId
=
this
.
classInfo
.
userId
;
nodeInfoRecordPdu
.
role
=
ApeConsts
.
userTypesToId
[
this
.
classInfo
.
userRole
]
||
1
;
//NR_NORMAL用户的身份,根据用户登录时的身份设置
nodeInfoRecordPdu
.
level
=
0
;
nodeInfoRecordPdu
.
handUpTime
=
0
;
nodeInfoRecordPdu
.
openCamera
=
0
;
nodeInfoRecordPdu
.
openMicrophones
=
0
;
nodeInfoRecordPdu
.
microphones
=
GlobalConfig
.
microphones
;
nodeInfoRecordPdu
.
cameras
=
GlobalConfig
.
cameras
;
nodeInfoRecordPdu
.
videoQuality
=
GlobalConfig
.
videoQuality
;
//设置分辨率的
nodeInfoRecordPdu
.
userIp
=
GlobalConfig
.
userIp
;
nodeInfoRecordPdu
.
deviceType
=
GlobalConfig
.
deviceType
;
nodeInfoRecordPdu
.
language
=
GlobalConfig
.
language
;
nodeInfoRecordPdu
.
explorer
=
GlobalConfig
.
explorer
;
nodeInfoRecordPdu
.
explorerVersion
=
GlobalConfig
.
explorerVersion
;
nodeInfoRecordPdu
.
os
=
GlobalConfig
.
os
;
let
conferenceRecord
=
{};
//RCConferenceRecord_T
conferenceRecord
.
_conference_id
=
this
.
classInfo
.
classId
;
conferenceRecord
.
_top_node_id
=
this
.
classInfo
.
topNodeID
;
this
.
mcuClassInfo
=
{};
//RCMeetingInfo_T
this
.
mcuClassInfo
.
self
=
nodeInfoRecordPdu
;
this
.
mcuClassInfo
.
info
=
conferenceRecord
;
// 内部mcuConfInfo
this
.
classInfo
.
mcuClassInfo
=
this
.
mcuClassInfo
;
//开启EverSocket
this
.
_everSocket
.
begin
(
this
.
classInfo
.
MCUServerIP
,
this
.
classInfo
.
MCUServerPort
);
}
//切换MCU的ip
switchMCUIp
(
_classInfo
)
{
if
(
_classInfo
&&
_classInfo
.
MCUServerIP
)
{
this
.
classInfo
.
MCUServerIP
=
_classInfo
.
MCUServerIP
;
this
.
classInfo
.
MCUServerPort
=
_classInfo
.
MCUServerPort
;
if
(
this
.
_everSocket
)
{
this
.
_everSocket
.
switchSocketIp
(
this
.
classInfo
.
MCUServerIP
,
this
.
classInfo
.
MCUServerPort
);
}
}
}
}
export
default
new
MCU
;
...
...
src/pdus/pro.js
查看文件 @
c5fa90d
...
...
@@ -891,7 +891,7 @@ message RCNodeInfoRecordPdu {
optional
bytes
user_data
=
8
;
optional
string
user_id
=
9
;
optional
uint32
handUpTime
=
10
;
optional
uint32
deviceType
=
11
;
optional
uint32
deviceType
=
11
;
//设备类型,0:pc 1:ios 2:安卓
optional
uint32
mobileDirection
=
12
;
repeated
string
microphones
=
13
;
repeated
string
cameras
=
14
;
...
...
@@ -912,6 +912,10 @@ message RCNodeInfoRecordPdu {
repeated
MsListItemPdu
msList
=
29
;
optional
string
selfSilence
=
30
;
optional
string
msIpPort
=
31
;
optional
string
language
=
32
;
//系统语言
optional
string
explorer
=
33
;
//浏览器
optional
string
explorerVersion
=
34
;
//浏览器版本
optional
string
os
=
35
;
//系统版本
}
message
RCVotingPollSettingsPdu
{
...
...
请
注册
或
登录
后发表评论