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
李勇
7 years ago
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
52e34a05382c3adfb79650431b272b4a77312a2e
52e34a05
1 parent
754a0341
webRtc-dev
...
20171120-1w
ly20171204-1w
ly20171208-1w
ly20171211-1w
ly20171211-2w
ly20171214-1w
v2.38.13.20171216
v2.38.11.20171214
v2.38.3.201712011
v2.38.1.201712011
v2.36.11.20171204
v2.36.8.20171206
v2.36.4.20171201
v2.35.11.20171130
v2.34.16.20171128
v2.34.5.20171127
v2.33.6.20171123
v2.32.1.20171123
v2.31.12.20171122
v2.31.10.20171122
1.修改nodeId和userId的生成规则,避免重复;2.统一设备类型定义;3.处理课堂模块和视频模块离开课堂后的消息处理
隐藏空白字符变更
内嵌
并排对比
正在显示
9 个修改的文件
包含
130 行增加
和
68 行删除
src/EngineEntrance.js
src/EverSocket.js
src/GlobalConfig.js
src/apes/ApeConsts.js
src/apes/AudioApe.js
src/apes/ConferApe.js
src/apes/VideoApe.js
src/apes/WebRtcApe.js
src/mcu.js
src/EngineEntrance.js
查看文件 @
52e34a0
...
...
@@ -63,7 +63,7 @@ export default class MessageEntrance extends Emiter {
super
();
this
.
lastClassActiveTime
=
0
;
//最后一次课堂激活的时间戳
//sdk 信息
GlobalConfig
.
sdkVersion
=
"v2.3
0.5.20171117
"
;
GlobalConfig
.
sdkVersion
=
"v2.3
1.1.20171120
"
;
loger
.
warn
(
"sdkVersion:"
+
GlobalConfig
.
sdkVersion
);
console
.
log
(
"sdkVersion:"
+
GlobalConfig
.
sdkVersion
);
//设置
...
...
@@ -456,8 +456,23 @@ export default class MessageEntrance extends Emiter {
LogManager
.
IS_OPEN_SEND_LOG
=
false
;
//断开之后不再上报日志
},
2000
);
this
.
clearClientData
();
}
//清除所有客户端数据
clearClientData
(){
GlobalConfig
.
MCUServerIP
=
""
;
GlobalConfig
.
MCUServerPort
=
""
;
GlobalConfig
.
mcuListFinal
=
[];
if
(
_mcu
){
_mcu
.
leaveMCU
();
}
if
(
_confer_ape
){
_confer_ape
.
stopApe
();
}
if
(
_video_ape
){
_video_ape
.
stopApe
();
}
}
//当前的课堂状态信息发生改变,需要保存课堂状态到Sass
_onClassStatusInfoChange
(
_param
)
{
//如果MCU连接已经断开,不发送
...
...
@@ -493,6 +508,10 @@ export default class MessageEntrance extends Emiter {
if
(
GlobalConfig
.
isRecordPlayBack
||
!
_confer_ape
)
{
return
;
}
if
(
GlobalConfig
.
classType
==
ApeConsts
.
CLASS_TYPE_ZHIBO
){
//直播的时候不再同步所有模块的消息
return
}
//老师身份和非录制回放的时候执行,录制状态发送改变,需要更新当前的数据,否则已有的消息会录制不上
if
(
_confer_ape
.
checkHasRecordControl
())
{
loger
.
warn
(
'录制状态发送改变->更新所有模块的当前数据发送到MCU'
);
...
...
@@ -529,7 +548,10 @@ export default class MessageEntrance extends Emiter {
if
(
!
_data
)
{
return
;
}
if
(
GlobalConfig
.
deviceType
==
1
||
GlobalConfig
.
deviceType
==
2
||
GlobalConfig
.
deviceType
==
3
||
_data
.
nodeId
==
GlobalConfig
.
nodeId
)
{
if
(
GlobalConfig
.
deviceType
==
GlobalConfig
.
deviceIOS
||
GlobalConfig
.
deviceType
==
GlobalConfig
.
deviceAndroid
||
GlobalConfig
.
deviceType
==
GlobalConfig
.
deviceH5
||
_data
.
nodeId
==
GlobalConfig
.
nodeId
)
{
return
;
}
if
(
_webRtc
)
{
...
...
@@ -600,7 +622,7 @@ export default class MessageEntrance extends Emiter {
GlobalConfig
.
isH5
=
_param
.
isH5
||
false
;
//外部传入的参数,是否是H5
if
(
GlobalConfig
.
isH5
==
true
)
{
GlobalConfig
.
platform
=
"h5"
;
GlobalConfig
.
deviceType
=
3
//3是H5
GlobalConfig
.
deviceType
=
GlobalConfig
.
deviceH5
;
loger
.
warn
(
"设备类型是H5"
);
}
...
...
@@ -619,25 +641,27 @@ export default class MessageEntrance extends Emiter {
GlobalConfig
.
userRole
!=
ApeConsts
.
invisible
)
{
GlobalConfig
.
userRole
=
ApeConsts
.
normal
;
}
//如果没有名字或没有userId的时候,需要随机生成
let
timestampStr
=
new
Date
().
getTime
().
toString
();
timestampStr
=
timestampStr
.
substr
(
timestampStr
.
length
-
4
);
//如果没有名字的时候需要随机生成
let
randUserId
=
parseInt
(
Math
.
random
()
*
1000
)
+
""
+
parseInt
(
Math
.
random
()
*
1000
)
+
""
+
parseInt
(
Math
.
random
()
*
1000
);
if
(
GlobalConfig
.
userRole
==
ApeConsts
.
host
)
{
timestampStr
=
"T"
+
timestampStr
;
randUserId
=
"T"
+
randUserId
;
}
else
if
(
GlobalConfig
.
userRole
==
ApeConsts
.
assistant
)
{
timestampStr
=
"A"
+
timestampStr
;
randUserId
=
"A"
+
randUserId
;
}
else
if
(
GlobalConfig
.
userRole
==
ApeConsts
.
presenter
)
{
timestampStr
=
"P"
+
timestampStr
;
randUserId
=
"P"
+
randUserId
;
}
else
{
timestampStr
=
"S"
+
timestampStr
;
randUserId
=
"S"
+
randUserId
;
}
//如果没有名字,随机起一个名字
GlobalConfig
.
userName
=
_param
.
userName
||
timestampStr
;
GlobalConfig
.
userName
=
_param
.
userName
||
randUserId
;
//如果没有userId或者为"0",随机生成
if
(
!
GlobalConfig
.
userId
||
GlobalConfig
.
userId
==
"0"
)
{
GlobalConfig
.
userId
=
timestampStr
;
GlobalConfig
.
userId
=
randUserId
;
}
console
.
log
(
"userId"
,
GlobalConfig
.
userId
);
//客户端决定是否延迟接收消息
GlobalConfig
.
messageDelay
=
_param
.
messageDelay
||
false
;
...
...
@@ -696,7 +720,7 @@ export default class MessageEntrance extends Emiter {
GlobalConfig
.
md5
=
_data
.
md5
||
""
;
//这个暂时用假数据,后台接口写完就有数据了
GlobalConfig
.
msType
=
_data
.
msType
||
1
;
GlobalConfig
.
siteId
=
_data
.
siteId
||
""
;
GlobalConfig
.
classType
=
_data
.
meetingType
||
ApeConsts
.
CLASS_TYPE_1
;
GlobalConfig
.
classType
=
_data
.
meetingType
||
ApeConsts
.
CLASS_TYPE_1
v1
;
//host默认需要密码,Sass服务器只判断学生是否需要密码,没有判断老师的
GlobalConfig
.
passwordRequired
=
_data
.
passwordRequired
||
false
;
//md5验证的时候需要Sass返回的值,不能更改
...
...
@@ -1211,7 +1235,7 @@ export default class MessageEntrance extends Emiter {
joinClassSuccessCallBackData
.
userRole
=
GlobalConfig
.
userRole
;
joinClassSuccessCallBackData
.
userId
=
GlobalConfig
.
userId
;
joinClassSuccessCallBackData
.
passwordRequired
=
GlobalConfig
.
passwordRequired
;
joinClassSuccessCallBackData
.
classType
=
GlobalConfig
.
classType
||
ApeConsts
.
CLASS_TYPE_1
;
joinClassSuccessCallBackData
.
classType
=
GlobalConfig
.
classType
||
ApeConsts
.
CLASS_TYPE_1
v1
;
joinClassSuccessCallBackData
.
country
=
GlobalConfig
.
country
;
//国家
joinClassSuccessCallBackData
.
city
=
GlobalConfig
.
city
;
//城市
...
...
@@ -1360,12 +1384,12 @@ export default class MessageEntrance extends Emiter {
//用更状态数据发送变更
_onRosterUpdateHandler
(
_data
)
{
//数据无效/ios/android 不处理数据
if
(
!
_data
||
GlobalConfig
.
deviceType
==
1
||
GlobalConfig
.
deviceType
==
2
)
{
if
(
!
_data
||
GlobalConfig
.
deviceType
==
GlobalConfig
.
deviceIOS
||
GlobalConfig
.
deviceType
==
GlobalConfig
.
deviceAndroid
)
{
return
;
}
let
nodeData
=
_data
.
nodeData
;
//数据用户是pc或H5不处理
if
(
!
nodeData
||
nodeData
.
deviceType
==
0
||
nodeData
.
deviceType
==
3
)
{
if
(
!
nodeData
||
nodeData
.
deviceType
==
GlobalConfig
.
devicePC
||
nodeData
.
deviceType
==
GlobalConfig
.
deviceH5
)
{
return
;
}
if
(
nodeData
.
openCamera
>
0
&&
_webRtc
)
{
...
...
@@ -1572,7 +1596,6 @@ export default class MessageEntrance extends Emiter {
//开始上课
_confer_ape
.
startClass
(
_param
);
////开始录制
//_confer_ape.startRecord();
}
}
...
...
@@ -2564,8 +2587,8 @@ export default class MessageEntrance extends Emiter {
//如果是主持人,那么需要判断一下文档模块同步的数据和从sass获取的文档数据是否相同,如果mcu服务器不存在的,需要上传
if
(
GlobalConfig
.
docListPrepare
&&
GlobalConfig
.
docListPrepare
.
length
>
0
)
{
//如果当前身份是老师或者当前课堂内只有一个人,有权限同步文档到MCU
if
(
GlobalConfig
.
isHost
||
GlobalConfig
.
rosterNumber
<=
1
&&
GlobalConfig
.
deviceType
!=
3
)
{
//如果当前身份是老师或者当前课堂内只有一个人并且不是H5,有权限同步文档到MCU
if
(
GlobalConfig
.
isHost
||
(
GlobalConfig
.
rosterNumber
<=
1
&&
GlobalConfig
.
deviceType
!=
GlobalConfig
.
deviceH5
))
{
for
(
let
i
=
0
;
i
<
GlobalConfig
.
docListPrepare
.
length
;
i
++
)
{
let
value
=
GlobalConfig
.
docListPrepare
[
i
];
if
(
value
)
{
...
...
@@ -2759,7 +2782,7 @@ export default class MessageEntrance extends Emiter {
//loger.log("伴音MUSIC模块加入频道成功->isHost=", GlobalConfig.isHost, "length=", GlobalConfig.musicListPrepare.length);
//console.log("伴音MUSIC模块共享模数据->", GlobalConfig.musicListPrepare);
//如果是主持人,那么需要判断一下文档模块同步的数据和从sass获取的文档数据是否相同,如果mcu服务器不存在的,需要上传
if
(
GlobalConfig
.
isHost
&&
GlobalConfig
.
musicListPrepare
.
length
>
0
&&
GlobalConfig
.
deviceType
!=
3
)
{
if
(
GlobalConfig
.
isHost
&&
GlobalConfig
.
musicListPrepare
.
length
>
0
&&
GlobalConfig
.
deviceType
!=
GlobalConfig
.
deviceH5
)
{
for
(
let
i
=
0
;
i
<
GlobalConfig
.
musicListPrepare
.
length
;
i
++
)
{
let
value
=
GlobalConfig
.
musicListPrepare
[
i
];
if
(
value
)
{
...
...
@@ -2790,7 +2813,7 @@ export default class MessageEntrance extends Emiter {
//loger.log("媒体共享模块加入频道成功->isHost=", GlobalConfig.isHost, "length=", GlobalConfig.sharedMediaList.length);
//console.log("媒体共享模数据->", GlobalConfig.sharedMediaList);
//如果是主持人,那么需要判断一下文档模块同步的数据和从sass获取的文档数据是否相同,如果mcu服务器不存在的,需要上传
if
(
GlobalConfig
.
isHost
&&
GlobalConfig
.
sharedMediaList
.
length
>
0
&&
GlobalConfig
.
deviceType
!=
3
)
{
if
(
GlobalConfig
.
isHost
&&
GlobalConfig
.
sharedMediaList
.
length
>
0
&&
GlobalConfig
.
deviceType
!=
GlobalConfig
.
deviceH5
)
{
for
(
let
i
=
0
;
i
<
GlobalConfig
.
sharedMediaList
.
length
;
i
++
)
{
let
value
=
GlobalConfig
.
sharedMediaList
[
i
];
if
(
value
)
{
...
...
@@ -2943,7 +2966,7 @@ export default class MessageEntrance extends Emiter {
joinClassSuccessCallBackData
.
userRole
=
GlobalConfig
.
userRole
;
joinClassSuccessCallBackData
.
userId
=
GlobalConfig
.
userId
;
joinClassSuccessCallBackData
.
passwordRequired
=
GlobalConfig
.
passwordRequired
;
joinClassSuccessCallBackData
.
classType
=
GlobalConfig
.
classType
||
ApeConsts
.
CLASS_TYPE_1
;
joinClassSuccessCallBackData
.
classType
=
GlobalConfig
.
classType
||
ApeConsts
.
CLASS_TYPE_1
v1
;
joinClassSuccessCallBackData
.
country
=
GlobalConfig
.
country
;
//国家
joinClassSuccessCallBackData
.
city
=
GlobalConfig
.
city
;
//城市
...
...
@@ -3029,7 +3052,7 @@ export default class MessageEntrance extends Emiter {
* 初始化webRtc
* */
_initWebRtcSdk
(
_params
,
_callback
)
{
if
(
GlobalConfig
.
deviceType
==
1
||
GlobalConfig
.
deviceType
==
2
||
GlobalConfig
.
deviceType
==
3
)
{
if
(
GlobalConfig
.
deviceType
==
GlobalConfig
.
deviceIOS
||
GlobalConfig
.
deviceType
==
GlobalConfig
.
deviceAndroid
||
GlobalConfig
.
deviceType
==
GlobalConfig
.
deviceH5
)
{
loger
.
warn
(
"移动端不需要处理初始化webRtc"
);
if
(
_callback
)
{
_callback
();
...
...
@@ -3104,7 +3127,7 @@ export default class MessageEntrance extends Emiter {
* 加入视频通话
* */
_joinChannel
(
_params
)
{
if
(
GlobalConfig
.
deviceType
==
1
||
GlobalConfig
.
deviceType
==
2
)
{
if
(
GlobalConfig
.
deviceType
==
GlobalConfig
.
deviceIOS
||
GlobalConfig
.
deviceType
==
GlobalConfig
.
deviceAndroid
)
{
loger
.
warn
(
"移动端不需要处理加入视频房间"
);
return
;
}
...
...
@@ -3117,7 +3140,7 @@ export default class MessageEntrance extends Emiter {
* 离开视频通话频道
* */
_leaveChannel
(
_params
)
{
if
(
GlobalConfig
.
deviceType
==
1
||
GlobalConfig
.
deviceType
==
2
)
{
if
(
GlobalConfig
.
deviceType
==
GlobalConfig
.
deviceIOS
||
GlobalConfig
.
deviceType
==
GlobalConfig
.
deviceAndroid
)
{
return
;
}
if
(
_webRtc
)
{
...
...
@@ -3139,7 +3162,7 @@ export default class MessageEntrance extends Emiter {
return
;
}
//ios和安卓的只需要更新数据即可
if
(
GlobalConfig
.
deviceType
==
1
||
GlobalConfig
.
deviceType
==
2
)
{
if
(
GlobalConfig
.
deviceType
==
GlobalConfig
.
deviceIOS
||
GlobalConfig
.
deviceType
==
GlobalConfig
.
deviceAndroid
)
{
loger
.
log
(
"调用webRtc推流"
);
GlobalConfig
.
openCamera
=
EngineUtils
.
creatTimestamp
();
GlobalConfig
.
openMicrophones
=
GlobalConfig
.
openCamera
;
...
...
@@ -3167,7 +3190,7 @@ export default class MessageEntrance extends Emiter {
* */
_unpublishMedia
(
_params
)
{
//ios和安卓的只需要更新数据即可
if
(
GlobalConfig
.
deviceType
==
1
||
GlobalConfig
.
deviceType
==
2
)
{
if
(
GlobalConfig
.
deviceType
==
GlobalConfig
.
deviceIOS
||
GlobalConfig
.
deviceType
==
GlobalConfig
.
deviceAndroid
)
{
loger
.
log
(
"调用webRtc停止推流"
);
GlobalConfig
.
openCamera
=
0
;
GlobalConfig
.
openMicrophones
=
0
;
...
...
@@ -3193,7 +3216,7 @@ export default class MessageEntrance extends Emiter {
* 切换摄像头和麦克风设备
* */
_changeDevices
(
_params
)
{
if
(
GlobalConfig
.
deviceType
==
1
||
GlobalConfig
.
deviceType
==
2
)
{
if
(
GlobalConfig
.
deviceType
==
GlobalConfig
.
deviceIOS
||
GlobalConfig
.
deviceType
==
GlobalConfig
.
deviceAndroid
)
{
return
;
}
if
(
_webRtc
)
{
...
...
@@ -3205,7 +3228,7 @@ export default class MessageEntrance extends Emiter {
* 设置旁路推流
* */
_setConfigPublisher
(
_params
)
{
if
(
GlobalConfig
.
deviceType
==
1
||
GlobalConfig
.
deviceType
==
2
)
{
if
(
GlobalConfig
.
deviceType
==
GlobalConfig
.
deviceIOS
||
GlobalConfig
.
deviceType
==
GlobalConfig
.
deviceAndroid
)
{
return
;
}
if
(
_webRtc
)
{
...
...
@@ -3217,7 +3240,7 @@ export default class MessageEntrance extends Emiter {
* 设置本地video视图
* */
_setLocalMediaView
(
_params
)
{
if
(
GlobalConfig
.
deviceType
==
1
||
GlobalConfig
.
deviceType
==
2
)
{
if
(
GlobalConfig
.
deviceType
==
GlobalConfig
.
deviceIOS
||
GlobalConfig
.
deviceType
==
GlobalConfig
.
deviceAndroid
)
{
return
;
}
if
(
_webRtc
)
{
...
...
@@ -3229,7 +3252,7 @@ export default class MessageEntrance extends Emiter {
* 设置房间内老师身份的视图
* */
_setHostRemoteMediaView
(
_params
)
{
if
(
GlobalConfig
.
deviceType
==
1
||
GlobalConfig
.
deviceType
==
2
)
{
if
(
GlobalConfig
.
deviceType
==
GlobalConfig
.
deviceIOS
||
GlobalConfig
.
deviceType
==
GlobalConfig
.
deviceAndroid
)
{
return
;
}
if
(
_webRtc
)
{
...
...
@@ -3241,7 +3264,7 @@ export default class MessageEntrance extends Emiter {
* 设置房间内普通身份的视图
* */
_setNormalRemoteMediaView
(
_params
)
{
if
(
GlobalConfig
.
deviceType
==
1
||
GlobalConfig
.
deviceType
==
2
)
{
if
(
GlobalConfig
.
deviceType
==
GlobalConfig
.
deviceIOS
||
GlobalConfig
.
deviceType
==
GlobalConfig
.
deviceAndroid
)
{
return
;
}
if
(
_webRtc
)
{
...
...
@@ -3257,7 +3280,7 @@ export default class MessageEntrance extends Emiter {
if
(
!
_params
)
{
return
;
}
if
(
GlobalConfig
.
deviceType
==
1
||
GlobalConfig
.
deviceType
==
2
)
{
if
(
GlobalConfig
.
deviceType
==
GlobalConfig
.
deviceIOS
||
GlobalConfig
.
deviceType
==
GlobalConfig
.
deviceAndroid
)
{
return
;
}
if
(
_webRtc
)
{
...
...
@@ -3283,7 +3306,7 @@ export default class MessageEntrance extends Emiter {
* 设置监课和需要隐藏显示的用户视图
* */
_setInvisibleMediaView
(
_params
)
{
if
(
GlobalConfig
.
deviceType
==
1
||
GlobalConfig
.
deviceType
==
2
)
{
if
(
GlobalConfig
.
deviceType
==
GlobalConfig
.
deviceIOS
||
GlobalConfig
.
deviceType
==
GlobalConfig
.
deviceAndroid
)
{
return
;
}
if
(
_webRtc
)
{
...
...
src/EverSocket.js
查看文件 @
52e34a0
...
...
@@ -15,18 +15,20 @@
import
Emiter
from
'Emiter'
;
import
Loger
from
'Loger'
;
import
GlobalConfig
from
'GlobalConfig'
;
import
EngineUtils
from
'EngineUtils'
;
import
LogManager
from
'LogManager'
;
let
loger
=
Loger
.
getLoger
(
'EverSocket'
);
const
MCU_MAX_RECONNECTION
=
3
;
//最多重连次数
class
EverSocket
extends
Emiter
{
constructor
()
{
super
();
this
.
sendToMcuList
=
[];
//发送到MCU的数据记录
this
.
receiveFromMcuList
=
[];
//接到MCU的数据记录
this
.
mcuReconnectCounter
=
0
;
//(重要)记录mcu连续重连的次数,最大连续8次就不再重连
this
.
_connected
=
false
;
this
.
_lastActiveTime
=
0
;
//最后一次收到消息的时间
this
.
_enableEverSocket
=
false
;
this
.
reConnectionCounter
=
0
;
//重连次数
}
begin
(
ip
,
port
)
{
...
...
@@ -68,17 +70,25 @@ class EverSocket extends Emiter {
return
this
.
_connected
;
}
send
(
data
)
{
send
(
data
,
type
)
{
if
(
this
.
_connected
)
{
if
(
data
)
{
let
len
=
data
.
byteLength
;
//超过1024 警告提示
if
(
len
>
1024
)
{
loger
.
warn
(
'发送到MCU的数据文件超过1k-->byteLength->'
,
len
);
loger
.
warn
(
'发送到MCU的数据文件超过1k-->byteLength->'
+
len
,
"type:"
+
type
);
}
//大于10k 不发送
if
(
len
>=
1024
*
10
)
{
loger
.
warn
(
'发送到MCU的数据文件超过10k-->byteLength->'
,
len
);
loger
.
warn
(
'发送到MCU的数据文件超过10k-->byteLength->'
+
len
,
"type:"
+
type
);
return
;
}
this
.
sendToMcuList
.
push
(
"c2s_"
+
EngineUtils
.
creatTimestampStr
()
+
"_"
+
len
+
"_"
+
type
);
if
(
this
.
sendToMcuList
.
length
>
80
){
loger
.
log
(
"发送到MCU数据统计->"
,
this
.
sendToMcuList
);
this
.
sendToMcuList
=
[];
}
}
this
.
websocket
.
send
(
data
);
}
else
{
...
...
@@ -206,8 +216,14 @@ class EverSocket extends Emiter {
_onMessage
(
messageEvent
)
{
this
.
_lastActiveTime
=
Date
.
now
();
const
bufferData
=
messageEvent
.
data
;
//loger.log('RECEIVE MESSAGE-->byteLength->',bufferData.byteLength);
if
(
bufferData
.
byteLength
>
0
)
{
//loger.log('RECEIVE-->byteLength->',bufferData.byteLength);
let
len
=
bufferData
.
byteLength
;
this
.
receiveFromMcuList
.
push
(
"s2c_"
+
EngineUtils
.
creatTimestampStr
()
+
"_"
+
len
);
if
(
this
.
receiveFromMcuList
.
length
>
80
){
loger
.
log
(
"收到MCU数据统计->"
,
this
.
receiveFromMcuList
);
this
.
receiveFromMcuList
=
[];
}
if
(
len
>
0
)
{
this
.
_emit
(
EverSocket
.
MESSAGE
,
bufferData
);
}
}
...
...
src/GlobalConfig.js
查看文件 @
52e34a0
...
...
@@ -542,7 +542,13 @@ GlobalConfig.hasCamera = false; //摄像头是否可用
GlobalConfig
.
hasMicrophone
=
false
;
//麦克风是否可用
GlobalConfig
.
returnCitySN
=
null
;
//获取的ip数据 {"cip":"60.253.214.122","cid":"110000","cname":"北京市"}
GlobalConfig
.
deviceType
=
0
;
//设备类型 0:电脑 1:ios 2:安卓
//设备类型 0:电脑 1:ios 2:安卓 3 h5
GlobalConfig
.
deviceType
=
0
;
GlobalConfig
.
devicePC
=
0
;
GlobalConfig
.
deviceIOS
=
1
;
GlobalConfig
.
deviceAndroid
=
2
;
GlobalConfig
.
deviceH5
=
3
;
GlobalConfig
.
userIp
=
""
;
//用户当前IP
GlobalConfig
.
userId
=
0
;
GlobalConfig
.
paramUserId
=
0
;
...
...
@@ -588,7 +594,7 @@ GlobalConfig.topNodeID = 101; //现在固定值,还不知道是做什么用
GlobalConfig
.
siteId
=
""
;
//站点号
GlobalConfig
.
className
=
""
;
// 课程名称
GlobalConfig
.
classId
=
0
;
//课堂号=classId=meetingNumber 之后统一修改为classId
GlobalConfig
.
classType
=
ApeConsts
.
CLASS_TYPE_1
;
//课堂类型
GlobalConfig
.
classType
=
ApeConsts
.
CLASS_TYPE_1
v1
;
//课堂类型
GlobalConfig
.
classStatus
=
ApeConsts
.
CLASS_STATUS_WAIT
;
// 0;//课堂还未开始 1;//直播中 2 //课间休息 3已经停止
GlobalConfig
.
classStartTime
=
""
;
//课堂点击开始时间
GlobalConfig
.
classStopTime
=
""
;
//最后一次停止的时间(点暂停或结束),每次发送数据都获取当前时间戳
...
...
src/apes/ApeConsts.js
查看文件 @
52e34a0
...
...
@@ -29,9 +29,9 @@ ApeConsts.STOP_ALL_PUBLISH=5; //所有人停止推流
ApeConsts
.
CLASS_ACTION_DRAW_STATUS_CHANGE
=
6
;
//更改用户的画笔状态
//课堂类型 1:1v1(2路流) 2:直播(1路流) 3:小班课(可以多路流)
ApeConsts
.
CLASS_TYPE_1
=
1
;
// 互动课堂,通过MS转发音视频,不能进行H5观看 1v1(2路流)
ApeConsts
.
CLASS_TYPE_2
=
2
;
// 直播课堂,通过CDN转发音视频,不能进行音视频互动 :直播(1路流)
ApeConsts
.
CLASS_TYPE_3
=
3
;
// 小班课,通过CDN转发音视频,不能进行音视频互动 ::小班课(可以多路流)
ApeConsts
.
CLASS_TYPE_1v1
=
1
;
// 互动课堂,通过MS转发音视频,不能进行H5观看 1v1(2路流)
ApeConsts
.
CLASS_TYPE_ZHIBO
=
2
;
// 直播课堂,通过CDN转发音视频,不能进行音视频互动 :直播(1路流)
ApeConsts
.
CLASS_TYPE_XIAOBAN
=
3
;
// 小班课,通过CDN转发音视频,不能进行音视频互动 ::小班课(可以多路流)
//角色身份
//ApeConsts.NR_GUEST = 0; // 客人
...
...
src/apes/AudioApe.js
查看文件 @
52e34a0
...
...
@@ -410,7 +410,7 @@ class AudioApe extends Ape {
receiveChannelInfo
.
mediaType
=
unpackChannelInfo
.
mediaType
||
ApeConsts
.
MEDIA_TYPE_DEFAULT
;
receiveChannelInfo
.
screenWidth
=
unpackChannelInfo
.
screenWidth
||
GlobalConfig
.
screenWidth
;
receiveChannelInfo
.
screenHeight
=
unpackChannelInfo
.
screenHeight
||
GlobalConfig
.
screenHeight
;
receiveChannelInfo
.
deviceType
=
unpackChannelInfo
.
deviceType
||
0
;
receiveChannelInfo
.
deviceType
=
unpackChannelInfo
.
deviceType
||
GlobalConfig
.
devicePC
;
receiveChannelInfo
.
optionJsonData
=
unpackChannelInfo
.
optionJsonData
||
""
;
//消息不是自己同步的,需要处理
...
...
src/apes/ConferApe.js
查看文件 @
52e34a0
...
...
@@ -23,7 +23,7 @@ class ConferApe extends Ape {
ApeConsts
.
CONFERENCE_SESSION_NAME
,
ApeConsts
.
CONFERENCE_SESSION_TAG
);
this
.
isLeave
=
false
;
//记录自己是否已经离开
this
.
rosters
=
{};
//用户列表
this
.
rosterLen
=
0
;
//当前课堂人数
this
.
timerCounter
=
new
TimerCounter
();
//计时器
...
...
@@ -160,7 +160,7 @@ class ConferApe extends Ape {
//更新角色数据
updateUserInfo
()
{
if
(
GlobalConfig
.
classType
==
ApeConsts
.
CLASS_TYPE_
2
&&
GlobalConfig
.
isH5
==
true
){
if
(
GlobalConfig
.
classType
==
ApeConsts
.
CLASS_TYPE_
ZHIBO
&&
GlobalConfig
.
isH5
==
true
){
//直播模式下H5不处理更新信息
console
.
log
(
"直播模式下H5不处理用户更新信息"
);
return
;
...
...
@@ -207,7 +207,7 @@ class ConferApe extends Ape {
}
return
;
}
if
(
GlobalConfig
.
classType
==
ApeConsts
.
CLASS_TYPE_
2
&&
GlobalConfig
.
isH5
){
if
(
GlobalConfig
.
classType
==
ApeConsts
.
CLASS_TYPE_
ZHIBO
&&
GlobalConfig
.
isH5
){
loger
.
warn
(
"直播模式H5不能发送课堂控制消息"
);
return
;
}
...
...
@@ -308,7 +308,7 @@ class ConferApe extends Ape {
checkHasRecordControl
()
{
//loger.warn('检测是否有控制录制操作的权限', "isHost", GlobalConfig.isHost, "recordStatus", GlobalConfig.recordStatus,"当前人数:"+this.rosterLen);
//1.如果自己是老师或者当前课堂只有一个人
if
(
GlobalConfig
.
isHost
||
(
this
.
rosterLen
<=
1
&&
GlobalConfig
.
deviceType
!=
3
))
{
if
(
GlobalConfig
.
isHost
||
(
this
.
rosterLen
<=
1
&&
GlobalConfig
.
deviceType
!=
GlobalConfig
.
deviceH5
))
{
return
true
;
}
//2.如果自己不是老师,需要判断当前课堂内是否有老师,如果有老师就不做操作
...
...
@@ -1022,7 +1022,7 @@ class ConferApe extends Ape {
this
.
rosterLen
=
Object
.
keys
(
this
.
rosters
).
length
;
GlobalConfig
.
rosterNumber
=
this
.
rosterLen
;
//记录当前的总人数
newNodeData
.
rosterLen
=
this
.
rosterLen
;
if
(
GlobalConfig
.
classType
!=
ApeConsts
.
CLASS_TYPE_
2
){
if
(
GlobalConfig
.
classType
!=
ApeConsts
.
CLASS_TYPE_
ZHIBO
){
loger
.
log
(
"人员加入->"
,
newNodeData
);
}
...
...
@@ -1034,7 +1034,7 @@ class ConferApe extends Ape {
GlobalConfig
.
rosterNumber
=
this
.
rosterLen
;
//记录当前的总人数
newNodeData
.
rosterLen
=
this
.
rosterLen
;
if
(
nodeId
!=
GlobalConfig
.
nodeId
)
{
if
(
GlobalConfig
.
classType
!=
ApeConsts
.
CLASS_TYPE_
2
){
if
(
GlobalConfig
.
classType
!=
ApeConsts
.
CLASS_TYPE_
ZHIBO
){
loger
.
log
(
"人员更新信息->"
,
newNodeData
);
}
}
...
...
@@ -1065,7 +1065,7 @@ class ConferApe extends Ape {
// 因为会出现先收到视频消息后收到人员加入和更新的消息
if
(
this
.
rosters
[
_param
.
fromNodeId
]
==
null
&&
this
.
rosterLen
>
0
){
//H5不做释放处理
if
(
GlobalConfig
.
deviceType
==
3
){
if
(
GlobalConfig
.
deviceType
==
GlobalConfig
.
deviceH5
){
loger
.
warn
(
"H5不做媒体模块的频道释放->当前总人数->"
+
this
.
rosterLen
,
_param
);
return
;
}
...
...
@@ -1084,8 +1084,9 @@ class ConferApe extends Ape {
//删除用户
rosterDelHandler
(
nodeId
)
{
if
(
GlobalConfig
.
nodeId
==
nodeId
)
{
if
(
GlobalConfig
.
classExit
==
false
){
loger
.
log
(
"自己离开课堂"
);
if
(
GlobalConfig
.
classExit
==
false
||
this
.
isLeave
==
false
){
this
.
isLeave
=
true
;
loger
.
log
(
"自己离开课堂"
,
"classExit:"
+
GlobalConfig
.
classExit
);
// 自己退出
this
.
_emit
(
MessageTypes
.
CLASS_RUN_EXIT
,
{
'type'
:
0
});
}
...
...
@@ -1094,7 +1095,7 @@ class ConferApe extends Ape {
}
else
{
let
user
=
this
.
rosters
[
nodeId
];
if
(
user
)
{
if
(
GlobalConfig
.
classType
!=
ApeConsts
.
CLASS_TYPE_
2
){
if
(
GlobalConfig
.
classType
!=
ApeConsts
.
CLASS_TYPE_
ZHIBO
){
loger
.
log
(
nodeId
,
"->离开课堂->身份->"
,
user
.
userRole
);
}
...
...
@@ -1204,6 +1205,7 @@ class ConferApe extends Ape {
this
.
rosterLen
=
0
;
GlobalConfig
.
rosterNumber
=
this
.
rosterLen
;
GlobalConfig
.
rosters
=
this
.
rosters
;
this
.
isLeave
=
true
;
}
}
...
...
src/apes/VideoApe.js
查看文件 @
52e34a0
...
...
@@ -20,7 +20,7 @@ class VideoApe extends Ape {
ApeConsts
.
VIDEO_SESSION_NAME
,
ApeConsts
.
VIDEO_SESSION_TAG
);
this
.
isLeave
=
false
;
this
.
mediaModule
=
new
MediaModule
();
this
.
mediaModule
.
MEDIA_OBJ_TABLE_ID
=
ApeConsts
.
VIDEO_OBJ_TABLE_ID
;
this
.
mediaModule
.
mediaChannels
=
{};
...
...
@@ -37,7 +37,6 @@ class VideoApe extends Ape {
// Ape Models
this
.
registerKey
(
this
.
_session_id
,
this
.
_session_name
,
this
.
_session_tag
,
new
ArrayBuffer
);
this
.
registerObj
(
pdu
.
RCPDU_REG_REGISTER_TABLE
,
ApeConsts
.
VIDEO_OBJ_TABLE_ID
,
ApeConsts
.
VIDEO_OBJ_TABLE_NAME
,
ApeConsts
.
VIDEO_OBJ_TABLE_TAG
,
0
,
new
ArrayBuffer
);
// videoApe 监听视频控制消息,用户之间的消息传递
this
.
on
(
pdu
.
RCPDU_SEND_VIDEO_DATA_REQUEST
,
this
.
receiveVideoCommandHandler
.
bind
(
this
));
}
...
...
@@ -425,7 +424,7 @@ class VideoApe extends Ape {
this
.
sendTableUpdateHandler
(
channelInfo
);
//递归检查,800毫秒之后执行
clearTimeout
(
this
.
releaseTimeId
);
if
(
GlobalConfig
.
classType
==
ApeConsts
.
CLASS_TYPE_
2
&&
GlobalConfig
.
isH5
){
if
(
GlobalConfig
.
classType
==
ApeConsts
.
CLASS_TYPE_
ZHIBO
&&
GlobalConfig
.
isH5
){
return
;
}
this
.
releaseTimeId
=
setTimeout
(
function
()
{
...
...
@@ -498,6 +497,11 @@ class VideoApe extends Ape {
//发送到mcu同步(更新数据)
sendTableUpdateHandler
(
_channelInfo
)
{
//loger.log("video===sendTableUpdateHandler ");
if
(
GlobalConfig
.
classExit
||
this
.
isLeave
){
//已经离开课堂就不再做处理
return
;
}
let
updateModelPdu
=
this
.
packPdu
(
_channelInfo
,
_channelInfo
.
channelId
);
//let updateModelPdu=this.packPdu({},ApeConsts.VIDEO_OBJ_TABLE_ID+2);
if
(
updateModelPdu
==
null
)
{
...
...
@@ -662,7 +666,7 @@ class VideoApe extends Ape {
receiveChannelInfo
.
mediaType
=
unpackChannelInfo
.
mediaType
||
ApeConsts
.
MEDIA_TYPE_DEFAULT
;
receiveChannelInfo
.
screenWidth
=
unpackChannelInfo
.
screenWidth
||
GlobalConfig
.
screenWidth
;
receiveChannelInfo
.
screenHeight
=
unpackChannelInfo
.
screenHeight
||
GlobalConfig
.
screenHeight
;
receiveChannelInfo
.
deviceType
=
unpackChannelInfo
.
deviceType
||
0
;
receiveChannelInfo
.
deviceType
=
unpackChannelInfo
.
deviceType
||
GlobalConfig
.
devicePC
;
receiveChannelInfo
.
optionJsonData
=
unpackChannelInfo
.
optionJsonData
||
""
;
//消息不是自己同步的,需要处理
if
(
unpackChannelInfo
.
status
==
ApeConsts
.
CHANNEL_STATUS_OPENING
)
{
...
...
@@ -782,7 +786,7 @@ class VideoApe extends Ape {
mediaChannelInfo
.
mediaType
=
_param
.
mediaType
||
ApeConsts
.
MEDIA_TYPE_DEFAULT
;
mediaChannelInfo
.
screenWidth
=
_param
.
screenWidth
||
GlobalConfig
.
screenWidth
;
mediaChannelInfo
.
screenHeight
=
_param
.
screenHeight
||
GlobalConfig
.
screenHeight
;
mediaChannelInfo
.
deviceType
=
_param
.
deviceType
||
0
;
mediaChannelInfo
.
deviceType
=
_param
.
deviceType
||
GlobalConfig
.
devicePC
;
mediaChannelInfo
.
optionJsonData
=
_param
.
optionJsonData
||
""
;
mediaChannelInfo
.
m3u8Url
=
""
;
mediaChannelInfo
.
rtmpUrl
=
""
;
...
...
@@ -884,6 +888,9 @@ class VideoApe extends Ape {
}
return
null
;
}
stopApe
(){
this
.
isLeave
=
true
;
}
}
export
default
VideoApe
;
...
...
src/apes/WebRtcApe.js
查看文件 @
52e34a0
...
...
@@ -245,7 +245,7 @@ class WebRtcApe extends Emiter {
$("
#
"+this.xdyRemote + uid).remove();
}
}
if (user && (user.deviceType ==
1 || user.deviceType == 2
)) {
if (user && (user.deviceType ==
GlobalConfig.deviceIOS || user.deviceType == GlobalConfig.deviceAndroid
)) {
this.remoteVideoList[user.nodeId] = stream;
}
}
...
...
src/mcu.js
查看文件 @
52e34a0
...
...
@@ -105,7 +105,7 @@ class MCU extends Emiter {
pduMsg
.
set
(
"deviceType"
,
""
+
GlobalConfig
.
deviceType
);
pduMsg
.
set
(
"data"
,
joinRequestPdu
.
toArrayBuffer
());
this
.
_everSocket
.
send
(
pduMsg
.
toArrayBuffer
());
this
.
_everSocket
.
send
(
pduMsg
.
toArrayBuffer
()
,
joinRequestPdu
.
type
);
}
// EverSocket底层消息处理
...
...
@@ -197,7 +197,7 @@ class MCU extends Emiter {
send
(
msg
)
{
if
(
this
.
connected
)
{
// loger.log('发送数据到服务端-------------------->');
this
.
_everSocket
.
send
(
msg
.
toArrayBuffer
());
this
.
_everSocket
.
send
(
msg
.
toArrayBuffer
()
,
msg
.
type
);
}
else
{
loger
.
warn
(
'发送数据到服务端-------------------->失败->未连接到服务端'
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_SOCKET_DISCONNECT
);
...
...
@@ -209,7 +209,9 @@ class MCU extends Emiter {
loger
.
log
(
'leaveMCU'
);
GlobalConfig
.
setCurrentStatus
(
GlobalConfig
.
statusCode_3
);
GlobalConfig
.
classJoinSuccess
=
false
;
this
.
_everSocket
.
end
();
if
(
this
.
_everSocket
){
this
.
_everSocket
.
end
();
}
}
// 主动建立MCU连接
...
...
@@ -223,9 +225,15 @@ class MCU extends Emiter {
loger
.
log
(
_classInfo
);
_classInfo
.
classId
=
parseInt
(
_classInfo
.
classId
);
// classId 必须整形
this
.
classInfo
=
_classInfo
;
// 创建刷新nodeId
this
.
classInfo
.
nodeId
=
EngineUtils
.
creatSoleNumberFromTimestamp
();
let
randNodeId
=
parseInt
(
Math
.
random
()
*
1000
)
+
""
+
parseInt
(
Math
.
random
()
*
1000
)
+
""
+
parseInt
(
Math
.
random
()
*
1000
);
//生成的字符串nodeId转换为数字
randNodeId
=
parseInt
(
randNodeId
);
this
.
classInfo
.
nodeId
=
randNodeId
;
//EngineUtils.creatSoleNumberFromTimestamp();
GlobalConfig
.
nodeId
=
this
.
classInfo
.
nodeId
;
//这是标识自己身份的id
console
.
log
(
"创建nodeId"
,
GlobalConfig
.
nodeId
);
let
nodeInfoRecordPdu
=
new
pdu
[
'RCNodeInfoRecordPdu'
];
nodeInfoRecordPdu
.
name
=
this
.
classInfo
.
userName
;
...
...
请
注册
或
登录
后发表评论