李勇

增加系统信息和平台信息

此 diff 太大无法显示。
@@ -22,6 +22,8 @@ import CursorApe from 'apes/CursorApe'; @@ -22,6 +22,8 @@ import CursorApe from 'apes/CursorApe';
22 22
23 import EngineUtils from "EngineUtils"; 23 import EngineUtils from "EngineUtils";
24 import GlobalConfig from 'GlobalConfig'; 24 import GlobalConfig from 'GlobalConfig';
  25 +import SystemConfig from 'SystemConfig';
  26 +
25 import ApeConsts from 'apes/ApeConsts'; 27 import ApeConsts from 'apes/ApeConsts';
26 import Base64 from 'base64-js'; 28 import Base64 from 'base64-js';
27 import ArrayBufferUtil from 'libs/ArrayBufferUtil'; 29 import ArrayBufferUtil from 'libs/ArrayBufferUtil';
@@ -30,11 +32,10 @@ import MediaModule from 'apes/MediaModule'; @@ -30,11 +32,10 @@ import MediaModule from 'apes/MediaModule';
30 import MediaSharedApe from 'apes/MediaSharedApe'; 32 import MediaSharedApe from 'apes/MediaSharedApe';
31 import MusicSharedApe from 'apes/MusicSharedApe'; 33 import MusicSharedApe from 'apes/MusicSharedApe';
32 import QuestionApe from 'apes/QuestionApe'; 34 import QuestionApe from 'apes/QuestionApe';
33 -import mdetect from "mdetect";  
34 import UTF8 from 'utf-8'; 35 import UTF8 from 'utf-8';
35 36
36 let loger = Loger.getLoger('McuClient'); 37 let loger = Loger.getLoger('McuClient');
37 -let _sdkInfo = { "version": "v1.43.1.20170711", "author": "www.3mang.com" }; 38 +let _sdkInfo = { "version": "v1.45.1.20170717", "author": "www.3mang.com" };
38 39
39 //APE 40 //APE
40 let _sass; 41 let _sass;
@@ -59,13 +60,8 @@ export default class MessageEntrance extends Emiter { @@ -59,13 +60,8 @@ export default class MessageEntrance extends Emiter {
59 //sdk 信息 60 //sdk 信息
60 this.sdkInfo = _sdkInfo; 61 this.sdkInfo = _sdkInfo;
61 loger.warn(this.sdkInfo); 62 loger.warn(this.sdkInfo);
62 - //检查是否是移动端  
63 - GlobalConfig.isMobile = mdetect.isMobileUA();  
64 - if (GlobalConfig.isMobile) {  
65 - loger.warn("当前设备是移动设备");  
66 - } else {  
67 - loger.warn("当前设备是PC");  
68 - } 63 + //获取设备和系统信息
  64 + SystemConfig.getSystemInfo();
69 65
70 this.classRecordStatusUpdateTimer=0;//课堂录制状态发生改变后同步当前所有模块数据的计时器 66 this.classRecordStatusUpdateTimer=0;//课堂录制状态发生改变后同步当前所有模块数据的计时器
71 //初始化状态 67 //初始化状态
@@ -254,6 +250,7 @@ export default class MessageEntrance extends Emiter { @@ -254,6 +250,7 @@ export default class MessageEntrance extends Emiter {
254 this.switchMediaServer = this._switchMediaServer.bind(this); //手动切换ms服务器 250 this.switchMediaServer = this._switchMediaServer.bind(this); //手动切换ms服务器
255 this.setDebugInfo = this._setDebugInfo.bind(this); //设置debug信息 251 this.setDebugInfo = this._setDebugInfo.bind(this); //设置debug信息
256 } 252 }
  253 +
257 _setDebugInfo(_data) { 254 _setDebugInfo(_data) {
258 loger.log("设置debug信息-->", _data); 255 loger.log("设置debug信息-->", _data);
259 if (_data) { 256 if (_data) {
@@ -264,14 +261,6 @@ export default class MessageEntrance extends Emiter { @@ -264,14 +261,6 @@ export default class MessageEntrance extends Emiter {
264 _setDeviceInfo(_data) { 261 _setDeviceInfo(_data) {
265 loger.log("设置设备信息-->", _data); 262 loger.log("设置设备信息-->", _data);
266 if (_data) { 263 if (_data) {
267 - /* GlobalConfig.videoQuality=_data.videoQuality||2;//画面质量 0-低;1-中;2-高;  
268 - GlobalConfig.cameras=_data.cameras||[];//摄像头列表  
269 - GlobalConfig.microphones=_data.microphones||[];//麦克风列表  
270 - GlobalConfig.curCamera=_data.curCamera||'';//当前选择的摄像头  
271 - GlobalConfig.curMicrophone=_data.curMicrophone||'';//当前选择的麦克风  
272 - GlobalConfig.curVideoQuality=_data.curVideoQuality||2;//当前选择的分辨率  
273 - GlobalConfig.micGain=_data.micGain||50;//音量(0-80)*/  
274 -  
275 GlobalConfig.cameras = _data.cameras || []; 264 GlobalConfig.cameras = _data.cameras || [];
276 GlobalConfig.microphones = _data.microphones || []; 265 GlobalConfig.microphones = _data.microphones || [];
277 GlobalConfig.videoQuality = parseInt(_data.videoQuality); 266 GlobalConfig.videoQuality = parseInt(_data.videoQuality);
@@ -810,6 +799,13 @@ export default class MessageEntrance extends Emiter { @@ -810,6 +799,13 @@ export default class MessageEntrance extends Emiter {
810 joinClassSuccessCallBackData.ssTunnelAppURL = GlobalConfig.ssTunnelAppURL; 799 joinClassSuccessCallBackData.ssTunnelAppURL = GlobalConfig.ssTunnelAppURL;
811 joinClassSuccessCallBackData.currentSceneTableId = GlobalConfig.currentSceneTableId; //文档区域的模块显示 800 joinClassSuccessCallBackData.currentSceneTableId = GlobalConfig.currentSceneTableId; //文档区域的模块显示
812 joinClassSuccessCallBackData.serverAndLoacTimeDistanc = GlobalConfig.serverAndLoacTimeDistanc; 801 joinClassSuccessCallBackData.serverAndLoacTimeDistanc = GlobalConfig.serverAndLoacTimeDistanc;
  802 +
  803 + joinClassSuccessCallBackData.deviceType = GlobalConfig.deviceType;
  804 + joinClassSuccessCallBackData.language = GlobalConfig.language;
  805 + joinClassSuccessCallBackData.explorer = GlobalConfig.explorer;
  806 + joinClassSuccessCallBackData.explorerVersion = GlobalConfig.explorerVersion;
  807 + joinClassSuccessCallBackData.os = GlobalConfig.os;
  808 +
813 loger.log('加入课堂成功->'); 809 loger.log('加入课堂成功->');
814 loger.log(joinClassSuccessCallBackData); 810 loger.log(joinClassSuccessCallBackData);
815 811
@@ -2014,6 +2010,13 @@ export default class MessageEntrance extends Emiter { @@ -2014,6 +2010,13 @@ export default class MessageEntrance extends Emiter {
2014 joinClassSuccessCallBackData.ssTunnelAppURL = GlobalConfig.ssTunnelAppURL; 2010 joinClassSuccessCallBackData.ssTunnelAppURL = GlobalConfig.ssTunnelAppURL;
2015 joinClassSuccessCallBackData.currentSceneTableId = GlobalConfig.currentSceneTableId; //文档区域的模块显示 2011 joinClassSuccessCallBackData.currentSceneTableId = GlobalConfig.currentSceneTableId; //文档区域的模块显示
2016 joinClassSuccessCallBackData.serverAndLoacTimeDistanc = GlobalConfig.serverAndLoacTimeDistanc; 2012 joinClassSuccessCallBackData.serverAndLoacTimeDistanc = GlobalConfig.serverAndLoacTimeDistanc;
  2013 +
  2014 + joinClassSuccessCallBackData.deviceType = GlobalConfig.deviceType;
  2015 + joinClassSuccessCallBackData.language = GlobalConfig.language;
  2016 + joinClassSuccessCallBackData.explorer = GlobalConfig.explorer;
  2017 + joinClassSuccessCallBackData.explorerVersion = GlobalConfig.explorerVersion;
  2018 + joinClassSuccessCallBackData.os = GlobalConfig.os;
  2019 +
2017 loger.log(joinClassSuccessCallBackData); 2020 loger.log(joinClassSuccessCallBackData);
2018 //和加入课堂成功使用同样的消息处理 2021 //和加入课堂成功使用同样的消息处理
2019 this._emit(MessageTypes.CLASS_JOIN_SUCCESS, joinClassSuccessCallBackData); 2022 this._emit(MessageTypes.CLASS_JOIN_SUCCESS, joinClassSuccessCallBackData);
@@ -368,7 +368,7 @@ GlobalConfig.maxMediaChannels = 0; //最大音视频路数,以音视频路数 @@ -368,7 +368,7 @@ GlobalConfig.maxMediaChannels = 0; //最大音视频路数,以音视频路数
368 GlobalConfig.hasCamera = false; //摄像头是否可用 368 GlobalConfig.hasCamera = false; //摄像头是否可用
369 GlobalConfig.hasMicrophone = false; //麦克风是否可用 369 GlobalConfig.hasMicrophone = false; //麦克风是否可用
370 370
371 -GlobalConfig.deviceType = 0; //设备类型 0:电脑 1:安卓 2:ios 371 +GlobalConfig.deviceType = 0; //设备类型 0:电脑 1:ios 2:安卓
372 GlobalConfig.userIp = ""; //用户当前IP 372 GlobalConfig.userIp = ""; //用户当前IP
373 GlobalConfig.userId = 0; 373 GlobalConfig.userId = 0;
374 GlobalConfig.userName = ""; 374 GlobalConfig.userName = "";
@@ -379,8 +379,8 @@ GlobalConfig.openMicrophones = 0; @@ -379,8 +379,8 @@ GlobalConfig.openMicrophones = 0;
379 //视频质量相关设置 379 //视频质量相关设置
380 GlobalConfig.fps = 15; //帧频 380 GlobalConfig.fps = 15; //帧频
381 GlobalConfig.gop = 3; //关键帧间隔(秒) 381 GlobalConfig.gop = 3; //关键帧间隔(秒)
382 -GlobalConfig.videoQuality = 2; //画面质量 0-低;1-中;2-高;  
383 -GlobalConfig.curVideoQuality = 2; //当前分辨率 382 +GlobalConfig.videoQuality = 1; //画面质量 0-低;1-中;2-高;
  383 +GlobalConfig.curVideoQuality = 1; //当前分辨率
384 GlobalConfig.cameras = []; //摄像头列表 384 GlobalConfig.cameras = []; //摄像头列表
385 GlobalConfig.microphones = []; //麦克风列表 385 GlobalConfig.microphones = []; //麦克风列表
386 386
@@ -480,7 +480,13 @@ GlobalConfig.ssTunnelAppURL = ''; //屏幕共享插件的地址 @@ -480,7 +480,13 @@ GlobalConfig.ssTunnelAppURL = ''; //屏幕共享插件的地址
480 GlobalConfig.serverTime = 0; //服务器当前时间戳 480 GlobalConfig.serverTime = 0; //服务器当前时间戳
481 GlobalConfig.serverAndLoacTimeDistanc = 0; //本地时间和服务器时间错的差值; 481 GlobalConfig.serverAndLoacTimeDistanc = 0; //本地时间和服务器时间错的差值;
482 482
483 -GlobalConfig.isMobile = false; //是否是移动端  
484 GlobalConfig.rosterNumber=0;//当前总人数 483 GlobalConfig.rosterNumber=0;//当前总人数
  484 +
  485 +GlobalConfig.isMobile = false; //是否是移动端
  486 +GlobalConfig.language="";//浏览器语言
  487 +GlobalConfig.platform="pc";//平台 IOS/ANDROID/PC
  488 +GlobalConfig.explorer="未知";//浏览器
  489 +GlobalConfig.explorerVersion="未知";//浏览器版本
  490 +GlobalConfig.os="未知";//系统
485 export default GlobalConfig; 491 export default GlobalConfig;
486 492
  1 +/*
  2 + * 全局数据管理
  3 + * */
  4 +import Loger from 'Loger';
  5 +import mdetect from "mdetect";
  6 +import GlobalConfig from 'GlobalConfig';
  7 +
  8 +let loger = Loger.getLoger('SystemConfig');
  9 +class SystemConfig {
  10 + constructor() {
  11 +
  12 + }
  13 + //获取系统信息
  14 + static getSystemInfo(){
  15 + //检查是否是移动端
  16 + GlobalConfig.isMobile = mdetect.isMobileUA();
  17 + if (GlobalConfig.isMobile) {
  18 + loger.warn("当前设备是移动设备");
  19 + } else {
  20 + loger.warn("当前设备是PC");
  21 + }
  22 + if(mdetect.isIOS()){
  23 + GlobalConfig.deviceType=1;//"ios";
  24 + } if(mdetect.isAndroid()){
  25 + GlobalConfig.platform=2;//"android";
  26 + }else {
  27 + GlobalConfig.platform=0;//"pc";
  28 + }
  29 +
  30 + //语言
  31 + GlobalConfig.language ="unknown";
  32 + if(navigator){
  33 + let language=navigator.language || navigator.browserLanguage;
  34 + GlobalConfig.language = language.toLocaleLowerCase();
  35 + }
  36 + let browserInfo=this.getBrowserInfo();
  37 + GlobalConfig.explorer=browserInfo.explorer||"未知";
  38 + GlobalConfig.explorerVersion=browserInfo.explorerVersion||"未知";
  39 +
  40 + GlobalConfig.os=this.detectOS();
  41 + loger.log("deviceType:"+GlobalConfig.deviceType);
  42 + loger.log("language:"+GlobalConfig.language);
  43 + loger.log("explorer:"+GlobalConfig.explorer);
  44 + loger.log("explorerVersion:"+GlobalConfig.explorerVersion);
  45 + loger.log("os:"+GlobalConfig.os);
  46 + }
  47 + //获取浏览器和信息
  48 + static getBrowserInfo(){
  49 + var Sys = {};
  50 + var ua = navigator.userAgent.toLowerCase();
  51 + var re =/(trident|msie|firefox|chrome|opera|version).*?([\d.]+)/;
  52 + var m = ua.match(re);
  53 + Sys.explorer = m[1].replace(/version/, "'safari");
  54 +
  55 + //判断是否是IE11
  56 + if(Sys.explorer=="trident"){
  57 + Sys.explorer="IE11"
  58 + Sys.explorerVersion = "11.0";
  59 + }else if(Sys.explorer=="msie"){
  60 + //IE
  61 + Sys.explorer="IE"
  62 + Sys.explorerVersion = m[2];
  63 + }else {
  64 + //非IE
  65 + Sys.explorerVersion = m[2];
  66 + }
  67 + return Sys;
  68 + }
  69 + //系统信息
  70 + static detectOS() {
  71 + var sUserAgent = navigator.userAgent;
  72 + var isWin = (navigator.platform == "Win32") || (navigator.platform == "Windows");
  73 + var isMac = (navigator.platform == "Mac68K") || (navigator.platform == "MacPPC") || (navigator.platform == "Macintosh") || (navigator.platform == "MacIntel");
  74 + if (isMac) return "Mac";
  75 + var isUnix = (navigator.platform == "X11") && !isWin && !isMac;
  76 + if (isUnix) return "Unix";
  77 + var isLinux = (String(navigator.platform).indexOf("Linux") > -1);
  78 + if (isLinux) return "Linux";
  79 + if (isWin) {
  80 + var isWin2K = sUserAgent.indexOf("Windows NT 5.0") > -1 || sUserAgent.indexOf("Windows 2000") > -1;
  81 + if (isWin2K) return "Win2000";
  82 + var isWinXP = sUserAgent.indexOf("Windows NT 5.1") > -1 || sUserAgent.indexOf("Windows XP") > -1;
  83 + if (isWinXP) return "WinXP";
  84 + var isWin2003 = sUserAgent.indexOf("Windows NT 5.2") > -1 || sUserAgent.indexOf("Windows 2003") > -1;
  85 + if (isWin2003) return "Win2003";
  86 + var isWinVista= sUserAgent.indexOf("Windows NT 6.0") > -1 || sUserAgent.indexOf("Windows Vista") > -1;
  87 + if (isWinVista) return "WinVista";
  88 + var isWin7 = sUserAgent.indexOf("Windows NT 6.1") > -1 || sUserAgent.indexOf("Windows 7") > -1;
  89 + if (isWin7) return "Win7";
  90 + }
  91 + return "other";
  92 + }
  93 +}
  94 +export default SystemConfig;
  95 +
@@ -143,6 +143,12 @@ class ConferApe extends Ape { @@ -143,6 +143,12 @@ class ConferApe extends Ape {
143 //用户当前选择的MS 143 //用户当前选择的MS
144 nodeInfoRecordPdu.msIpPort = GlobalConfig.MS_PUBLISH_IP + ":" + GlobalConfig.MS_PUBLISH_PORT; 144 nodeInfoRecordPdu.msIpPort = GlobalConfig.MS_PUBLISH_IP + ":" + GlobalConfig.MS_PUBLISH_PORT;
145 145
  146 + nodeInfoRecordPdu.deviceType = GlobalConfig.deviceType;
  147 + nodeInfoRecordPdu.language = GlobalConfig.language;
  148 + nodeInfoRecordPdu.explorer = GlobalConfig.explorer;
  149 + nodeInfoRecordPdu.explorerVersion = GlobalConfig.explorerVersion;
  150 + nodeInfoRecordPdu.os = GlobalConfig.os;
  151 +
146 return nodeInfoRecordPdu; 152 return nodeInfoRecordPdu;
147 } 153 }
148 154
@@ -17,233 +17,240 @@ import EngineUtils from 'EngineUtils'; @@ -17,233 +17,240 @@ import EngineUtils from 'EngineUtils';
17 let loger = Loger.getLoger('MCU'); 17 let loger = Loger.getLoger('MCU');
18 18
19 class MCU extends Emiter { 19 class MCU extends Emiter {
20 - constructor() {  
21 - super();  
22 - this._apes = {};  
23 - this._everSocket = everSocket;  
24 - this._everSocket.on(everSocket.OPEN, this._everSocketOpenHandler.bind(this));  
25 - this._everSocket.on(everSocket.MESSAGE, this._everSocketMsgReceivedHandler.bind(this));  
26 - this._everSocket.on(everSocket.CLOSED, this._everSocketCloseHandler.bind(this));  
27 - this._everSocket.on(everSocket.ERROR, this._everSocketErrorHandler.bind(this));  
28 - } 20 + constructor() {
  21 + super();
  22 + this._apes = {};
  23 + this._everSocket = everSocket;
  24 + this._everSocket.on(everSocket.OPEN, this._everSocketOpenHandler.bind(this));
  25 + this._everSocket.on(everSocket.MESSAGE, this._everSocketMsgReceivedHandler.bind(this));
  26 + this._everSocket.on(everSocket.CLOSED, this._everSocketCloseHandler.bind(this));
  27 + this._everSocket.on(everSocket.ERROR, this._everSocketErrorHandler.bind(this));
  28 + }
29 29
30 - // 注册Ape  
31 - registerApe(ape) {  
32 - this._apes[ape._session_id] = ape;  
33 - } 30 + // 注册Ape
  31 + registerApe(ape) {
  32 + this._apes[ape._session_id] = ape;
  33 + }
34 34
35 - // EverSocket建立通道完毕  
36 - _everSocketOpenHandler() {  
37 - this._sendJoinClassRequest();  
38 - } 35 + // EverSocket建立通道完毕
  36 + _everSocketOpenHandler() {
  37 + this._sendJoinClassRequest();
  38 + }
39 39
40 - // EverSocket连接断开  
41 - _everSocketCloseHandler() {  
42 - //如果已经是断开状态,不需要多次发送异常消息  
43 - if (GlobalConfig.getCurrentStatus().code == GlobalConfig.statusCode_3.code) {  
44 - loger.warn('已经断开连接->');  
45 - return;  
46 - }  
47 - GlobalConfig.setCurrentStatus(GlobalConfig.statusCode_3);  
48 - this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_SOCKET_DISCONNECT); 40 + // EverSocket连接断开
  41 + _everSocketCloseHandler() {
  42 + //如果已经是断开状态,不需要多次发送异常消息
  43 + if (GlobalConfig.getCurrentStatus().code == GlobalConfig.statusCode_3.code) {
  44 + loger.warn('已经断开连接->');
  45 + return;
49 } 46 }
  47 + GlobalConfig.setCurrentStatus(GlobalConfig.statusCode_3);
  48 + this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_SOCKET_DISCONNECT);
  49 + }
50 50
51 - //EverSocket错误异常  
52 - _everSocketErrorHandler(_errorCode) {  
53 - //this._emit(MessageTypes.MCU_ERROR, _errorCode);  
54 - //如果自动重连次数已经达到最大值,重新选点  
55 - if (_errorCode == everSocket.ERR_SOCKET_RECONNECT_FAILED) {  
56 - this._emit(MessageTypes.SWITCH_MCU_IP);  
57 - } 51 + //EverSocket错误异常
  52 + _everSocketErrorHandler(_errorCode) {
  53 + //this._emit(MessageTypes.MCU_ERROR, _errorCode);
  54 + //如果自动重连次数已经达到最大值,重新选点
  55 + if (_errorCode == everSocket.ERR_SOCKET_RECONNECT_FAILED) {
  56 + this._emit(MessageTypes.SWITCH_MCU_IP);
58 } 57 }
  58 + }
59 59
60 - //MCU-发送加入课堂请求  
61 - _sendJoinClassRequest() {  
62 - //const classInfo = this.classInfo;  
63 - loger.log('MCU-发送加入课堂请求.');  
64 - loger.log(this.classInfo);  
65 - var descriptorPdu = new pdu['RCConferenceDescriptorPdu'];  
66 - descriptorPdu.id = this.classInfo.classId;  
67 - descriptorPdu.name = this.classInfo.className || "";  
68 - descriptorPdu.mode = 0;  
69 - descriptorPdu.capacity = 1;  
70 -  
71 - var joinRequestPdu = new pdu['RCConferenceJoinRequestPdu'];  
72 - joinRequestPdu.type = 2;  
73 - joinRequestPdu.initiator = this.classInfo.nodeId;  
74 - joinRequestPdu.nodeType = PduConsts.NT_TERMINAL; //normal  
75 - joinRequestPdu.classDescription = descriptorPdu;// classDescription  
76 -  
77 - let pduMsg = pdu.create_join_class_request_pdu(  
78 - joinRequestPdu.type,  
79 - this.classInfo.nodeId,  
80 - this.classInfo.classId,  
81 - 0,  
82 - ApeConsts.BROADCAST_CHANNEL_ID,  
83 - true,  
84 - PduConsts.DP_TOP,  
85 - this.classInfo.topNodeID,  
86 - PduConsts.SEG_ONCE  
87 - );  
88 -  
89 - pduMsg.set("site", this.classInfo.siteId);//课堂号对应的名称  
90 - pduMsg.set("userId", this.classInfo.userId);  
91 - pduMsg.set("userName", Base64.fromByteArray(ArrayBufferUtil.strToUint8Array(this.classInfo.userName)));  
92 - pduMsg.set("userRole", this.classInfo.userRole);  
93 - pduMsg.set("deviceType", "" + GlobalConfig.deviceType);  
94 - pduMsg.set("data", joinRequestPdu.toArrayBuffer());  
95 -  
96 - this._everSocket.send(pduMsg.toArrayBuffer());  
97 - } 60 + //MCU-发送加入课堂请求
  61 + _sendJoinClassRequest() {
  62 + //const classInfo = this.classInfo;
  63 + loger.log('MCU-发送加入课堂请求.');
  64 + loger.log(this.classInfo);
  65 + var descriptorPdu = new pdu['RCConferenceDescriptorPdu'];
  66 + descriptorPdu.id = this.classInfo.classId;
  67 + descriptorPdu.name = this.classInfo.className || "";
  68 + descriptorPdu.mode = 0;
  69 + descriptorPdu.capacity = 1;
98 70
99 - // EverSocket底层消息处理  
100 - _everSocketMsgReceivedHandler(data) {  
101 - let pduMsg = pdu.decode_pdu(data);  
102 - let pduType = pduMsg.get("type");  
103 - let pduData = pduMsg.get("data");  
104 - //loger.data('MCU-FirstLayer封装消息', 'type', pdu.id2type(pduMsg.type), pduMsg.type, 'sessionId', ApeConsts(pduMsg.sessionId), pduMsg.sessionId);  
105 - //loger.log('MCU-FirstLayer封装消息', 'type', pdu.id2type(pduMsg.type), pduMsg.type, 'sessionId', ApeConsts(pduMsg.sessionId), pduMsg.sessionId);  
106 - switch (pduType) {  
107 - case PduType.RCPDU_CONNECT_PROVIDER_RESPONSE:  
108 - //加入课堂请求返回数据处理  
109 - let joinConfPdu = pdu['RCConferenceJoinResponsePdu'].decode(pduData);  
110 - let pduResultCode = joinConfPdu.result;  
111 - loger.warn('RCPDU_CONNECT_PROVIDER_RESPONSE ->pduResultCode:' + pduResultCode);  
112 - switch (pduResultCode) {  
113 - case PduConsts.RET_SUCCESS:  
114 - //加入成功  
115 - this._updateMCUConfInfoDescription(joinConfPdu.classDescription);  
116 - this._emit(MessageTypes.CLASS_JOIN_MCU_SUCCESS, this.classInfo);  
117 - break;  
118 - case PduConsts.RET_FULL_CAPACITY:  
119 - this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_CLASS_JOIN_FULL);  
120 - //this._emit(MessageTypes.CLASS_JOIN_FAILED,MessageTypes.ERR_CLASS_JOIN_FULL);  
121 - //this._emit(MessageTypes.CLASS_JOIN_FULL);  
122 - break;  
123 - default:  
124 - loger.arn('JoinConfPdu-未知类型-等待处理.', pduResultCode);  
125 - break  
126 - }  
127 - break;  
128 - case PduType.RCPDU_SEND_DATA_REQUEST:  
129 - //先判断当前消息属于哪个APE 根据 sessionId来判断  
130 - let ape = this._apes[pduMsg.sessionId];  
131 - let sessionLabel = ApeConsts(pduMsg.sessionId);  
132 - if (ape) {  
133 - let subTypeLabel = pdu.id2type(pduMsg.subType);  
134 - //loger.log('MCU-SecondLayer封装消息', 'sessionId', sessionLabel, pduMsg.sessionId, 'subtype', subTypeLabel, pduMsg.subType);  
135 -  
136 - loger.warn('接收服务端消息----------------->subType->', pduMsg.subType, GlobalConfig.mcuDelay, GlobalConfig.messageDelay);  
137 - //延迟处理消息(3个条件--->ape允许延迟&&客户端设置需要延迟&&Sass设置的延迟时间大于0)  
138 - if (ape._apeDelayed && GlobalConfig.messageDelay && GlobalConfig.mcuDelay > 0) {  
139 - loger.warn('延迟处理消息->', GlobalConfig.mcuDelay);  
140 - setTimeout(() => {  
141 - //this._pduRegAdapterHandler(regBuffer, seekTime);  
142 - ape._emit(pduMsg.subType, pduMsg.data);  
143 - }, GlobalConfig.mcuDelay * 1000);//mcuDelay单位是秒,  
144 - // 这里需要换算为毫秒  
145 - return;  
146 - }  
147 - ape._emit(pduMsg.subType, pduMsg.data);  
148 - } else {  
149 - loger.warn(sessionLabel + '尚未注册');  
150 - }  
151 - break;  
152 - default:  
153 - loger.warn('PDU-未知类型-等待处理.', pduType);  
154 - }  
155 - } 71 + var joinRequestPdu = new pdu['RCConferenceJoinRequestPdu'];
  72 + joinRequestPdu.type = 2;
  73 + joinRequestPdu.initiator = this.classInfo.nodeId;
  74 + joinRequestPdu.nodeType = PduConsts.NT_TERMINAL; //normal
  75 + joinRequestPdu.classDescription = descriptorPdu;// classDescription
156 76
157 - _updateMCUConfInfoDescription(_data) {  
158 - // let _mcuConfDesc=new pdu['RCConferenceDescriptorPdu'].decode(mcuConfDesc);  
159 - loger.log('_updateMCUConfInfoDescription.');  
160 - //let classDescription=new pdu['RCConferenceDescriptorPdu'].decode(_data);  
161 - loger.log(_data);  
162 - //let info = this.mcuClassInfo.info;  
163 - //info._conference_name = ArrayBufferUtil.uint8ArrayToStr(mcuConfDesc.name, 0);  
164 - //info._capacity = mcuConfDesc.capacity;  
165 - //info._mode = mcuConfDesc.mode;  
166 - } 77 + let pduMsg = pdu.create_join_class_request_pdu(
  78 + joinRequestPdu.type,
  79 + this.classInfo.nodeId,
  80 + this.classInfo.classId,
  81 + 0,
  82 + ApeConsts.BROADCAST_CHANNEL_ID,
  83 + true,
  84 + PduConsts.DP_TOP,
  85 + this.classInfo.topNodeID,
  86 + PduConsts.SEG_ONCE
  87 + );
167 88
168 - // MU服务是否连接  
169 - get connected() {  
170 - if (this._everSocket && this._everSocket.connected)  
171 - return true;  
172 - return false;  
173 - } 89 + pduMsg.set("site", this.classInfo.siteId);//课堂号对应的名称
  90 + pduMsg.set("userId", this.classInfo.userId);
  91 + pduMsg.set("userName", Base64.fromByteArray(ArrayBufferUtil.strToUint8Array(this.classInfo.userName)));
  92 + pduMsg.set("userRole", this.classInfo.userRole);
  93 + pduMsg.set("deviceType", "" + GlobalConfig.deviceType);
  94 + pduMsg.set("data", joinRequestPdu.toArrayBuffer());
  95 +
  96 + this._everSocket.send(pduMsg.toArrayBuffer());
  97 + }
  98 +
  99 + // EverSocket底层消息处理
  100 + _everSocketMsgReceivedHandler(data) {
  101 + let pduMsg = pdu.decode_pdu(data);
  102 + let pduType = pduMsg.get("type");
  103 + let pduData = pduMsg.get("data");
  104 + //loger.data('MCU-FirstLayer封装消息', 'type', pdu.id2type(pduMsg.type), pduMsg.type, 'sessionId', ApeConsts(pduMsg.sessionId), pduMsg.sessionId);
  105 + //loger.log('MCU-FirstLayer封装消息', 'type', pdu.id2type(pduMsg.type), pduMsg.type, 'sessionId', ApeConsts(pduMsg.sessionId), pduMsg.sessionId);
  106 + switch (pduType) {
  107 + case PduType.RCPDU_CONNECT_PROVIDER_RESPONSE:
  108 + //加入课堂请求返回数据处理
  109 + let joinConfPdu = pdu['RCConferenceJoinResponsePdu'].decode(pduData);
  110 + let pduResultCode = joinConfPdu.result;
  111 + loger.warn('RCPDU_CONNECT_PROVIDER_RESPONSE ->pduResultCode:' + pduResultCode);
  112 + switch (pduResultCode) {
  113 + case PduConsts.RET_SUCCESS:
  114 + //加入成功
  115 + this._updateMCUConfInfoDescription(joinConfPdu.classDescription);
  116 + this._emit(MessageTypes.CLASS_JOIN_MCU_SUCCESS, this.classInfo);
  117 + break;
  118 + case PduConsts.RET_FULL_CAPACITY:
  119 + this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_CLASS_JOIN_FULL);
  120 + //this._emit(MessageTypes.CLASS_JOIN_FAILED,MessageTypes.ERR_CLASS_JOIN_FULL);
  121 + //this._emit(MessageTypes.CLASS_JOIN_FULL);
  122 + break;
  123 + default:
  124 + loger.arn('JoinConfPdu-未知类型-等待处理.', pduResultCode);
  125 + break
  126 + }
  127 + break;
  128 + case PduType.RCPDU_SEND_DATA_REQUEST:
  129 + //先判断当前消息属于哪个APE 根据 sessionId来判断
  130 + let ape = this._apes[pduMsg.sessionId];
  131 + let sessionLabel = ApeConsts(pduMsg.sessionId);
  132 + if (ape) {
  133 + let subTypeLabel = pdu.id2type(pduMsg.subType);
  134 + //loger.log('MCU-SecondLayer封装消息', 'sessionId', sessionLabel, pduMsg.sessionId, 'subtype', subTypeLabel, pduMsg.subType);
174 135
175 - // 课堂发送消息 -- 消息同意序列号  
176 - send(msg) {  
177 - if (this.connected) {  
178 - loger.log('发送数据到服务端-------------------->');  
179 - this._everSocket.send(msg.toArrayBuffer()); 136 + loger.warn('接收服务端消息----------------->subType->', pduMsg.subType, GlobalConfig.mcuDelay, GlobalConfig.messageDelay);
  137 + //延迟处理消息(3个条件--->ape允许延迟&&客户端设置需要延迟&&Sass设置的延迟时间大于0)
  138 + if (ape._apeDelayed && GlobalConfig.messageDelay && GlobalConfig.mcuDelay > 0) {
  139 + loger.warn('延迟处理消息->', GlobalConfig.mcuDelay);
  140 + setTimeout(() => {
  141 + //this._pduRegAdapterHandler(regBuffer, seekTime);
  142 + ape._emit(pduMsg.subType, pduMsg.data);
  143 + }, GlobalConfig.mcuDelay * 1000);//mcuDelay单位是秒,
  144 + // 这里需要换算为毫秒
  145 + return;
  146 + }
  147 + ape._emit(pduMsg.subType, pduMsg.data);
180 } else { 148 } else {
181 - loger.log('发送数据到服务端-------------------->失败->未连接到服务端');  
182 - this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_SOCKET_DISCONNECT); 149 + loger.warn(sessionLabel + '尚未注册');
183 } 150 }
  151 + break;
  152 + default:
  153 + loger.warn('PDU-未知类型-等待处理.', pduType);
184 } 154 }
  155 + }
185 156
186 - // 主动断开MCU连接  
187 - leaveMCU() {  
188 - for (let ape in this._apes) {  
189 - this._apes[ape].stopApe();  
190 - }  
191 - loger.log('leaveMCU');  
192 - GlobalConfig.setCurrentStatus(GlobalConfig.statusCode_3);  
193 - GlobalConfig.classJoinSuccess=false;  
194 - this._everSocket.end(); 157 + _updateMCUConfInfoDescription(_data) {
  158 + // let _mcuConfDesc=new pdu['RCConferenceDescriptorPdu'].decode(mcuConfDesc);
  159 + loger.log('_updateMCUConfInfoDescription.');
  160 + //let classDescription=new pdu['RCConferenceDescriptorPdu'].decode(_data);
  161 + loger.log(_data);
  162 + //let info = this.mcuClassInfo.info;
  163 + //info._conference_name = ArrayBufferUtil.uint8ArrayToStr(mcuConfDesc.name, 0);
  164 + //info._capacity = mcuConfDesc.capacity;
  165 + //info._mode = mcuConfDesc.mode;
  166 + }
  167 +
  168 + // MU服务是否连接
  169 + get connected() {
  170 + if (this._everSocket && this._everSocket.connected)
  171 + return true;
  172 + return false;
  173 + }
  174 +
  175 + // 课堂发送消息 -- 消息同意序列号
  176 + send(msg) {
  177 + if (this.connected) {
  178 + loger.log('发送数据到服务端-------------------->');
  179 + this._everSocket.send(msg.toArrayBuffer());
  180 + } else {
  181 + loger.log('发送数据到服务端-------------------->失败->未连接到服务端');
  182 + this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_SOCKET_DISCONNECT);
195 } 183 }
  184 + }
196 185
197 - // 主动建立MCU连接  
198 - joinMCU(_classInfo) {  
199 - loger.log('开始建立EverSocket通道.');  
200 - GlobalConfig.classJoinSuccess=false;  
201 - loger.log(_classInfo);  
202 - _classInfo.classId = parseInt(_classInfo.classId); // classId 必须整形  
203 - this.classInfo = _classInfo;  
204 - // 创建刷新nodeId  
205 - this.classInfo.nodeId = EngineUtils.creatSoleNumberFromTimestamp();  
206 - GlobalConfig.nodeId = this.classInfo.nodeId;//这是标识自己身份的id  
207 -  
208 - let nodeInfoRecordPdu = new pdu['RCNodeInfoRecordPdu'];  
209 - nodeInfoRecordPdu.name = this.classInfo.userName;  
210 - nodeInfoRecordPdu.nodeId = this.classInfo.nodeId;  
211 - nodeInfoRecordPdu.userId = this.classInfo.userId;  
212 - nodeInfoRecordPdu.role = ApeConsts.userTypesToId[this.classInfo.userRole] || 1; //NR_NORMAL用户的身份,根据用户登录时的身份设置  
213 - nodeInfoRecordPdu.level = 0;  
214 - nodeInfoRecordPdu.handUpTime=0;  
215 - nodeInfoRecordPdu.openCamera=0;  
216 - nodeInfoRecordPdu.openMicrophones=0;  
217 - nodeInfoRecordPdu.microphones=GlobalConfig.microphones;  
218 - nodeInfoRecordPdu.cameras=GlobalConfig.cameras;  
219 - nodeInfoRecordPdu.videoQuality=GlobalConfig.videoQuality;//设置分辨率的  
220 - nodeInfoRecordPdu.userIp=GlobalConfig.userIp;  
221 -  
222 - let conferenceRecord = {}; //RCConferenceRecord_T  
223 - conferenceRecord._conference_id = this.classInfo.classId;  
224 - conferenceRecord._top_node_id = this.classInfo.topNodeID;  
225 -  
226 - this.mcuClassInfo = {}; //RCMeetingInfo_T  
227 - this.mcuClassInfo.self = nodeInfoRecordPdu;  
228 - this.mcuClassInfo.info = conferenceRecord;  
229 -  
230 - // 内部mcuConfInfo  
231 - this.classInfo.mcuClassInfo = this.mcuClassInfo;  
232 -  
233 - //开启EverSocket  
234 - this._everSocket.begin(this.classInfo.MCUServerIP, this.classInfo.MCUServerPort); 186 + // 主动断开MCU连接
  187 + leaveMCU() {
  188 + for (let ape in this._apes) {
  189 + this._apes[ape].stopApe();
235 } 190 }
  191 + loger.log('leaveMCU');
  192 + GlobalConfig.setCurrentStatus(GlobalConfig.statusCode_3);
  193 + GlobalConfig.classJoinSuccess = false;
  194 + this._everSocket.end();
  195 + }
236 196
237 - //切换MCU的ip  
238 - switchMCUIp(_classInfo) {  
239 - if (_classInfo && _classInfo.MCUServerIP) {  
240 - this.classInfo.MCUServerIP = _classInfo.MCUServerIP;  
241 - this.classInfo.MCUServerPort = _classInfo.MCUServerPort;  
242 - if (this._everSocket) {  
243 - this._everSocket.switchSocketIp(this.classInfo.MCUServerIP, this.classInfo.MCUServerPort);  
244 - }  
245 - } 197 + // 主动建立MCU连接
  198 + joinMCU(_classInfo) {
  199 + loger.log('开始建立EverSocket通道.');
  200 + GlobalConfig.classJoinSuccess = false;
  201 + loger.log(_classInfo);
  202 + _classInfo.classId = parseInt(_classInfo.classId); // classId 必须整形
  203 + this.classInfo = _classInfo;
  204 + // 创建刷新nodeId
  205 + this.classInfo.nodeId = EngineUtils.creatSoleNumberFromTimestamp();
  206 + GlobalConfig.nodeId = this.classInfo.nodeId;//这是标识自己身份的id
  207 +
  208 + let nodeInfoRecordPdu = new pdu['RCNodeInfoRecordPdu'];
  209 + nodeInfoRecordPdu.name = this.classInfo.userName;
  210 + nodeInfoRecordPdu.nodeId = this.classInfo.nodeId;
  211 + nodeInfoRecordPdu.userId = this.classInfo.userId;
  212 + nodeInfoRecordPdu.role = ApeConsts.userTypesToId[this.classInfo.userRole] || 1; //NR_NORMAL用户的身份,根据用户登录时的身份设置
  213 + nodeInfoRecordPdu.level = 0;
  214 + nodeInfoRecordPdu.handUpTime = 0;
  215 + nodeInfoRecordPdu.openCamera = 0;
  216 + nodeInfoRecordPdu.openMicrophones = 0;
  217 + nodeInfoRecordPdu.microphones = GlobalConfig.microphones;
  218 + nodeInfoRecordPdu.cameras = GlobalConfig.cameras;
  219 + nodeInfoRecordPdu.videoQuality = GlobalConfig.videoQuality;//设置分辨率的
  220 + nodeInfoRecordPdu.userIp = GlobalConfig.userIp;
  221 +
  222 + nodeInfoRecordPdu.deviceType = GlobalConfig.deviceType;
  223 + nodeInfoRecordPdu.language = GlobalConfig.language;
  224 + nodeInfoRecordPdu.explorer = GlobalConfig.explorer;
  225 + nodeInfoRecordPdu.explorerVersion = GlobalConfig.explorerVersion;
  226 + nodeInfoRecordPdu.os = GlobalConfig.os;
  227 +
  228 +
  229 + let conferenceRecord = {}; //RCConferenceRecord_T
  230 + conferenceRecord._conference_id = this.classInfo.classId;
  231 + conferenceRecord._top_node_id = this.classInfo.topNodeID;
  232 +
  233 + this.mcuClassInfo = {}; //RCMeetingInfo_T
  234 + this.mcuClassInfo.self = nodeInfoRecordPdu;
  235 + this.mcuClassInfo.info = conferenceRecord;
  236 +
  237 + // 内部mcuConfInfo
  238 + this.classInfo.mcuClassInfo = this.mcuClassInfo;
  239 +
  240 + //开启EverSocket
  241 + this._everSocket.begin(this.classInfo.MCUServerIP, this.classInfo.MCUServerPort);
  242 + }
  243 +
  244 + //切换MCU的ip
  245 + switchMCUIp(_classInfo) {
  246 + if (_classInfo && _classInfo.MCUServerIP) {
  247 + this.classInfo.MCUServerIP = _classInfo.MCUServerIP;
  248 + this.classInfo.MCUServerPort = _classInfo.MCUServerPort;
  249 + if (this._everSocket) {
  250 + this._everSocket.switchSocketIp(this.classInfo.MCUServerIP, this.classInfo.MCUServerPort);
  251 + }
246 } 252 }
  253 + }
247 } 254 }
248 255
249 export default new MCU; 256 export default new MCU;
@@ -891,7 +891,7 @@ message RCNodeInfoRecordPdu { @@ -891,7 +891,7 @@ message RCNodeInfoRecordPdu {
891 optional bytes user_data = 8; 891 optional bytes user_data = 8;
892 optional string user_id = 9; 892 optional string user_id = 9;
893 optional uint32 handUpTime = 10; 893 optional uint32 handUpTime = 10;
894 - optional uint32 deviceType = 11; 894 + optional uint32 deviceType = 11;//设备类型,0:pc 1:ios 2:安卓
895 optional uint32 mobileDirection = 12; 895 optional uint32 mobileDirection = 12;
896 repeated string microphones = 13; 896 repeated string microphones = 13;
897 repeated string cameras = 14; 897 repeated string cameras = 14;
@@ -912,6 +912,10 @@ message RCNodeInfoRecordPdu { @@ -912,6 +912,10 @@ message RCNodeInfoRecordPdu {
912 repeated MsListItemPdu msList = 29; 912 repeated MsListItemPdu msList = 29;
913 optional string selfSilence = 30; 913 optional string selfSilence = 30;
914 optional string msIpPort = 31; 914 optional string msIpPort = 31;
  915 + optional string language = 32;//系统语言
  916 + optional string explorer = 33;//浏览器
  917 + optional string explorerVersion = 34;//浏览器版本
  918 + optional string os = 35;//系统版本
915 } 919 }
916 920
917 message RCVotingPollSettingsPdu { 921 message RCVotingPollSettingsPdu {