正在显示
10 个修改的文件
包含
215 行增加
和
52 行删除
此 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.40.0.20170706", "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,14 +60,10 @@ export default class MessageEntrance extends Emiter { | @@ -59,14 +60,10 @@ 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 | ||
| 66 | + this.classRecordStatusUpdateTimer=0;//课堂录制状态发生改变后同步当前所有模块数据的计时器 | ||
| 70 | //初始化状态 | 67 | //初始化状态 |
| 71 | this.isGetUserIpCallback = false; //是否获取IP信息返回 | 68 | this.isGetUserIpCallback = false; //是否获取IP信息返回 |
| 72 | this.isGetFastestMcuCallback = false; //是否MCU选点结束 | 69 | this.isGetFastestMcuCallback = false; //是否MCU选点结束 |
| @@ -253,6 +250,7 @@ export default class MessageEntrance extends Emiter { | @@ -253,6 +250,7 @@ export default class MessageEntrance extends Emiter { | ||
| 253 | this.switchMediaServer = this._switchMediaServer.bind(this); //手动切换ms服务器 | 250 | this.switchMediaServer = this._switchMediaServer.bind(this); //手动切换ms服务器 |
| 254 | this.setDebugInfo = this._setDebugInfo.bind(this); //设置debug信息 | 251 | this.setDebugInfo = this._setDebugInfo.bind(this); //设置debug信息 |
| 255 | } | 252 | } |
| 253 | + | ||
| 256 | _setDebugInfo(_data) { | 254 | _setDebugInfo(_data) { |
| 257 | loger.log("设置debug信息-->", _data); | 255 | loger.log("设置debug信息-->", _data); |
| 258 | if (_data) { | 256 | if (_data) { |
| @@ -263,14 +261,6 @@ export default class MessageEntrance extends Emiter { | @@ -263,14 +261,6 @@ export default class MessageEntrance extends Emiter { | ||
| 263 | _setDeviceInfo(_data) { | 261 | _setDeviceInfo(_data) { |
| 264 | loger.log("设置设备信息-->", _data); | 262 | loger.log("设置设备信息-->", _data); |
| 265 | if (_data) { | 263 | if (_data) { |
| 266 | - /* GlobalConfig.videoQuality=_data.videoQuality||2;//画面质量 0-低;1-中;2-高; | ||
| 267 | - GlobalConfig.cameras=_data.cameras||[];//摄像头列表 | ||
| 268 | - GlobalConfig.microphones=_data.microphones||[];//麦克风列表 | ||
| 269 | - GlobalConfig.curCamera=_data.curCamera||'';//当前选择的摄像头 | ||
| 270 | - GlobalConfig.curMicrophone=_data.curMicrophone||'';//当前选择的麦克风 | ||
| 271 | - GlobalConfig.curVideoQuality=_data.curVideoQuality||2;//当前选择的分辨率 | ||
| 272 | - GlobalConfig.micGain=_data.micGain||50;//音量(0-80)*/ | ||
| 273 | - | ||
| 274 | GlobalConfig.cameras = _data.cameras || []; | 264 | GlobalConfig.cameras = _data.cameras || []; |
| 275 | GlobalConfig.microphones = _data.microphones || []; | 265 | GlobalConfig.microphones = _data.microphones || []; |
| 276 | GlobalConfig.videoQuality = parseInt(_data.videoQuality); | 266 | GlobalConfig.videoQuality = parseInt(_data.videoQuality); |
| @@ -356,7 +346,13 @@ export default class MessageEntrance extends Emiter { | @@ -356,7 +346,13 @@ export default class MessageEntrance extends Emiter { | ||
| 356 | 346 | ||
| 357 | //开启录制成功 | 347 | //开启录制成功 |
| 358 | _onClassRecordSuccess(_param) { | 348 | _onClassRecordSuccess(_param) { |
| 359 | - this.updaterRecordAllApeStatus(_param); | 349 | + clearTimeout(this.classRecordStatusUpdateTimer); |
| 350 | + let _this=this; | ||
| 351 | + this.classRecordStatusUpdateTimer=setTimeout(function(){ | ||
| 352 | + clearTimeout(this.classRecordStatusUpdateTimer); | ||
| 353 | + _this.updaterRecordAllApeStatus(_param); | ||
| 354 | + },2000); | ||
| 355 | + | ||
| 360 | } | 356 | } |
| 361 | 357 | ||
| 362 | //录制状态发送改变,更新所有模块的当前数据发送到MCU | 358 | //录制状态发送改变,更新所有模块的当前数据发送到MCU |
| @@ -803,6 +799,13 @@ export default class MessageEntrance extends Emiter { | @@ -803,6 +799,13 @@ export default class MessageEntrance extends Emiter { | ||
| 803 | joinClassSuccessCallBackData.ssTunnelAppURL = GlobalConfig.ssTunnelAppURL; | 799 | joinClassSuccessCallBackData.ssTunnelAppURL = GlobalConfig.ssTunnelAppURL; |
| 804 | joinClassSuccessCallBackData.currentSceneTableId = GlobalConfig.currentSceneTableId; //文档区域的模块显示 | 800 | joinClassSuccessCallBackData.currentSceneTableId = GlobalConfig.currentSceneTableId; //文档区域的模块显示 |
| 805 | 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 | + | ||
| 806 | loger.log('加入课堂成功->'); | 809 | loger.log('加入课堂成功->'); |
| 807 | loger.log(joinClassSuccessCallBackData); | 810 | loger.log(joinClassSuccessCallBackData); |
| 808 | 811 | ||
| @@ -1274,6 +1277,8 @@ export default class MessageEntrance extends Emiter { | @@ -1274,6 +1277,8 @@ export default class MessageEntrance extends Emiter { | ||
| 1274 | try { | 1277 | try { |
| 1275 | GlobalConfig.setClassStatusInfo(JSON.parse(_data.currentInfo)); | 1278 | GlobalConfig.setClassStatusInfo(JSON.parse(_data.currentInfo)); |
| 1276 | } catch (err) { | 1279 | } catch (err) { |
| 1280 | + loger.warn("从Sass获取的课堂数据JSON转换失败->"); | ||
| 1281 | + console.log("currentInfo",_data.currentInfo); | ||
| 1277 | GlobalConfig.setClassStatusInfo(_data.currentInfo); | 1282 | GlobalConfig.setClassStatusInfo(_data.currentInfo); |
| 1278 | } | 1283 | } |
| 1279 | loger.log(GlobalConfig.classStatusInfo); | 1284 | loger.log(GlobalConfig.classStatusInfo); |
| @@ -1630,26 +1635,29 @@ export default class MessageEntrance extends Emiter { | @@ -1630,26 +1635,29 @@ export default class MessageEntrance extends Emiter { | ||
| 1630 | 1635 | ||
| 1631 | //文档加入频道成功,同步到MCU服务器上的数据 | 1636 | //文档加入频道成功,同步到MCU服务器上的数据 |
| 1632 | docJoinChannelSuccess() { | 1637 | docJoinChannelSuccess() { |
| 1633 | - loger.log("docJoinChannelSuccess->isHost=", GlobalConfig.isHost, "length=", GlobalConfig.docListPrepare.length); | 1638 | + loger.log("docJoinChannelSuccess->isHost=", GlobalConfig.isHost,"当前总人数:",GlobalConfig.rosterNumber, "sassDoclength=", GlobalConfig.docListPrepare.length); |
| 1634 | //loger.log("docJoinChannelSuccess docListPrepare="); | 1639 | //loger.log("docJoinChannelSuccess docListPrepare="); |
| 1635 | //如果是主持人,那么需要判断一下文档模块同步的数据和从sass获取的文档数据是否相同,如果mcu服务器不存在的,需要上传 | 1640 | //如果是主持人,那么需要判断一下文档模块同步的数据和从sass获取的文档数据是否相同,如果mcu服务器不存在的,需要上传 |
| 1636 | - if (GlobalConfig.isHost && GlobalConfig.docListPrepare.length > 0) { | ||
| 1637 | - for (let i = 0; i < GlobalConfig.docListPrepare.length; i++) { | ||
| 1638 | - let value = GlobalConfig.docListPrepare[i]; | ||
| 1639 | - if (value) { | ||
| 1640 | - //loger.log("判断是否需要把提前上传的文档上传到mcu", value); | ||
| 1641 | - let paramInfo = { | ||
| 1642 | - "pageNum": value.pdfSize, | ||
| 1643 | - "fileName": value.name, | ||
| 1644 | - "fileType": value.type, | ||
| 1645 | - "relativeUrl": value.relativeLocation, | ||
| 1646 | - "url": value.absoluteLocation, | ||
| 1647 | - "creatUserId": value.createUserID, | ||
| 1648 | - "docId": value.id, | ||
| 1649 | - "md5": value.MD5, | ||
| 1650 | - "visible": false | ||
| 1651 | - }; | ||
| 1652 | - this._sendDocumentUpload(paramInfo); | 1641 | + if(GlobalConfig.docListPrepare&& GlobalConfig.docListPrepare.length > 0){ |
| 1642 | + //如果当前身份是老师或者当前课堂内只有一个人,有权限同步文档到MCU | ||
| 1643 | + if (GlobalConfig.isHost||GlobalConfig.rosterNumber<=1) { | ||
| 1644 | + for (let i = 0; i < GlobalConfig.docListPrepare.length; i++) { | ||
| 1645 | + let value = GlobalConfig.docListPrepare[i]; | ||
| 1646 | + if (value) { | ||
| 1647 | + //loger.log("判断是否需要把提前上传的文档上传到mcu", value); | ||
| 1648 | + let paramInfo = { | ||
| 1649 | + "pageNum": value.pdfSize, | ||
| 1650 | + "fileName": value.name, | ||
| 1651 | + "fileType": value.type, | ||
| 1652 | + "relativeUrl": value.relativeLocation, | ||
| 1653 | + "url": value.absoluteLocation, | ||
| 1654 | + "creatUserId": value.createUserID, | ||
| 1655 | + "docId": value.id, | ||
| 1656 | + "md5": value.MD5, | ||
| 1657 | + "visible": false | ||
| 1658 | + }; | ||
| 1659 | + this._sendDocumentUpload(paramInfo); | ||
| 1660 | + } | ||
| 1653 | } | 1661 | } |
| 1654 | } | 1662 | } |
| 1655 | } | 1663 | } |
| @@ -2002,6 +2010,13 @@ export default class MessageEntrance extends Emiter { | @@ -2002,6 +2010,13 @@ export default class MessageEntrance extends Emiter { | ||
| 2002 | joinClassSuccessCallBackData.ssTunnelAppURL = GlobalConfig.ssTunnelAppURL; | 2010 | joinClassSuccessCallBackData.ssTunnelAppURL = GlobalConfig.ssTunnelAppURL; |
| 2003 | joinClassSuccessCallBackData.currentSceneTableId = GlobalConfig.currentSceneTableId; //文档区域的模块显示 | 2011 | joinClassSuccessCallBackData.currentSceneTableId = GlobalConfig.currentSceneTableId; //文档区域的模块显示 |
| 2004 | 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 | + | ||
| 2005 | loger.log(joinClassSuccessCallBackData); | 2020 | loger.log(joinClassSuccessCallBackData); |
| 2006 | //和加入课堂成功使用同样的消息处理 | 2021 | //和加入课堂成功使用同样的消息处理 |
| 2007 | this._emit(MessageTypes.CLASS_JOIN_SUCCESS, joinClassSuccessCallBackData); | 2022 | this._emit(MessageTypes.CLASS_JOIN_SUCCESS, joinClassSuccessCallBackData); |
| @@ -133,15 +133,19 @@ class GlobalConfig { | @@ -133,15 +133,19 @@ class GlobalConfig { | ||
| 133 | this.classStopTime = data.classStopTime || this.classStopTime; //最后一次停止的时间(点暂停或结束),每次发送数据都获取当前时间戳 | 133 | this.classStopTime = data.classStopTime || this.classStopTime; //最后一次停止的时间(点暂停或结束),每次发送数据都获取当前时间戳 |
| 134 | this.classTimestamp = data.classTimestamp || this.classTimestamp; //相对于点开始课堂的时间戳 | 134 | this.classTimestamp = data.classTimestamp || this.classTimestamp; //相对于点开始课堂的时间戳 |
| 135 | 135 | ||
| 136 | - // 全局禁言状态 | ||
| 137 | - this.silence = data.silence || false; | ||
| 138 | - this.silenceUsers = JSON.parse(data.silenceUsers || '{}'); | ||
| 139 | 136 | ||
| 140 | this.recordStatus = data.recordStatus || this.recordStatus; //当前录制状态 | 137 | this.recordStatus = data.recordStatus || this.recordStatus; //当前录制状态 |
| 141 | this.recordTimestamp = data.recordTimestamp || this.recordTimestamp; //相对于首次开始录制的时间戳 | 138 | this.recordTimestamp = data.recordTimestamp || this.recordTimestamp; //相对于首次开始录制的时间戳 |
| 142 | this.recordFileName = data.recordFileName || this.recordFileName; //录制的文件名 | 139 | this.recordFileName = data.recordFileName || this.recordFileName; //录制的文件名 |
| 143 | this.recordDownloadUrl = data.recordDownloadUrl || this.recordDownloadUrl; //下载地址 | 140 | this.recordDownloadUrl = data.recordDownloadUrl || this.recordDownloadUrl; //下载地址 |
| 144 | this.currentSceneTableId = data.currentSceneTableId || 0; //文档区域的模块显示 | 141 | this.currentSceneTableId = data.currentSceneTableId || 0; //文档区域的模块显示 |
| 142 | + | ||
| 143 | + // 全局禁言状态 | ||
| 144 | + this.silence = data.silence || false; | ||
| 145 | + this.silenceUsers =data.silenceUsers || {}; | ||
| 146 | + if((typeof this.silenceUsers =='string')&& this.silenceUsers .constructor==String){ | ||
| 147 | + this.silenceUsers={}; | ||
| 148 | + } | ||
| 145 | } | 149 | } |
| 146 | 150 | ||
| 147 | // 判断自己是否主持人角色 | 151 | // 判断自己是否主持人角色 |
| @@ -364,7 +368,7 @@ GlobalConfig.maxMediaChannels = 0; //最大音视频路数,以音视频路数 | @@ -364,7 +368,7 @@ GlobalConfig.maxMediaChannels = 0; //最大音视频路数,以音视频路数 | ||
| 364 | GlobalConfig.hasCamera = false; //摄像头是否可用 | 368 | GlobalConfig.hasCamera = false; //摄像头是否可用 |
| 365 | GlobalConfig.hasMicrophone = false; //麦克风是否可用 | 369 | GlobalConfig.hasMicrophone = false; //麦克风是否可用 |
| 366 | 370 | ||
| 367 | -GlobalConfig.deviceType = 0; //设备类型 0:电脑 1:安卓 2:ios | 371 | +GlobalConfig.deviceType = 0; //设备类型 0:电脑 1:ios 2:安卓 |
| 368 | GlobalConfig.userIp = ""; //用户当前IP | 372 | GlobalConfig.userIp = ""; //用户当前IP |
| 369 | GlobalConfig.userId = 0; | 373 | GlobalConfig.userId = 0; |
| 370 | GlobalConfig.userName = ""; | 374 | GlobalConfig.userName = ""; |
| @@ -375,8 +379,8 @@ GlobalConfig.openMicrophones = 0; | @@ -375,8 +379,8 @@ GlobalConfig.openMicrophones = 0; | ||
| 375 | //视频质量相关设置 | 379 | //视频质量相关设置 |
| 376 | GlobalConfig.fps = 15; //帧频 | 380 | GlobalConfig.fps = 15; //帧频 |
| 377 | GlobalConfig.gop = 3; //关键帧间隔(秒) | 381 | GlobalConfig.gop = 3; //关键帧间隔(秒) |
| 378 | -GlobalConfig.videoQuality = 2; //画面质量 0-低;1-中;2-高; | ||
| 379 | -GlobalConfig.curVideoQuality = 2; //当前分辨率 | 382 | +GlobalConfig.videoQuality = 1; //画面质量 0-低;1-中;2-高; |
| 383 | +GlobalConfig.curVideoQuality = 1; //当前分辨率 | ||
| 380 | GlobalConfig.cameras = []; //摄像头列表 | 384 | GlobalConfig.cameras = []; //摄像头列表 |
| 381 | GlobalConfig.microphones = []; //麦克风列表 | 385 | GlobalConfig.microphones = []; //麦克风列表 |
| 382 | 386 | ||
| @@ -476,6 +480,13 @@ GlobalConfig.ssTunnelAppURL = ''; //屏幕共享插件的地址 | @@ -476,6 +480,13 @@ GlobalConfig.ssTunnelAppURL = ''; //屏幕共享插件的地址 | ||
| 476 | GlobalConfig.serverTime = 0; //服务器当前时间戳 | 480 | GlobalConfig.serverTime = 0; //服务器当前时间戳 |
| 477 | GlobalConfig.serverAndLoacTimeDistanc = 0; //本地时间和服务器时间错的差值; | 481 | GlobalConfig.serverAndLoacTimeDistanc = 0; //本地时间和服务器时间错的差值; |
| 478 | 482 | ||
| 483 | +GlobalConfig.rosterNumber=0;//当前总人数 | ||
| 484 | + | ||
| 479 | GlobalConfig.isMobile = false; //是否是移动端 | 485 | GlobalConfig.isMobile = false; //是否是移动端 |
| 486 | +GlobalConfig.language="";//浏览器语言 | ||
| 487 | +GlobalConfig.platform="pc";//平台 IOS/ANDROID/PC | ||
| 488 | +GlobalConfig.explorer="未知";//浏览器 | ||
| 489 | +GlobalConfig.explorerVersion="未知";//浏览器版本 | ||
| 490 | +GlobalConfig.os="未知";//系统 | ||
| 480 | export default GlobalConfig; | 491 | export default GlobalConfig; |
| 481 | 492 |
src/SystemConfig.js
0 → 100644
| 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 | ||
| @@ -259,7 +265,7 @@ class ConferApe extends Ape { | @@ -259,7 +265,7 @@ class ConferApe extends Ape { | ||
| 259 | return; | 265 | return; |
| 260 | } | 266 | } |
| 261 | 267 | ||
| 262 | - loger.log('startRecord', "isHost", GlobalConfig.isHost, "recordStatus", GlobalConfig.recordStatus); | 268 | + loger.warn('开启录制', "isHost", GlobalConfig.isHost, "recordStatus", GlobalConfig.recordStatus); |
| 263 | //如果是host | 269 | //如果是host |
| 264 | if (GlobalConfig.isHost) { | 270 | if (GlobalConfig.isHost) { |
| 265 | GlobalConfig.classStopTime = EngineUtils.creatTimestampStr(); | 271 | GlobalConfig.classStopTime = EngineUtils.creatTimestampStr(); |
| @@ -271,7 +277,7 @@ class ConferApe extends Ape { | @@ -271,7 +277,7 @@ class ConferApe extends Ape { | ||
| 271 | 277 | ||
| 272 | //停止录制 | 278 | //停止录制 |
| 273 | stopRecord(isForce) { | 279 | stopRecord(isForce) { |
| 274 | - loger.log('stopRecord', "isHost", GlobalConfig.isHost, "recordStatus", GlobalConfig.recordStatus); | 280 | + loger.warn('停止录制', "isHost", GlobalConfig.isHost, "recordStatus", GlobalConfig.recordStatus); |
| 275 | if (isForce && isForce == true) { | 281 | if (isForce && isForce == true) { |
| 276 | //强制停止,可以是host之外的身份(比如当前课堂老师异常退出,没有老师,会随机选择一个人来做释放操作) | 282 | //强制停止,可以是host之外的身份(比如当前课堂老师异常退出,没有老师,会随机选择一个人来做释放操作) |
| 277 | if (GlobalConfig.recordStatus) { | 283 | if (GlobalConfig.recordStatus) { |
| @@ -609,10 +615,16 @@ class ConferApe extends Ape { | @@ -609,10 +615,16 @@ class ConferApe extends Ape { | ||
| 609 | tableUpdateHandler(owner, itemIdx, itemData) { | 615 | tableUpdateHandler(owner, itemIdx, itemData) { |
| 610 | try { | 616 | try { |
| 611 | let model = this.unPackPdu(owner, itemIdx, itemData); | 617 | let model = this.unPackPdu(owner, itemIdx, itemData); |
| 612 | - loger.log('课堂数据更新->', model); | 618 | + console.log('课堂数据更新->', model); |
| 613 | 619 | ||
| 614 | //处理课堂更新的信息 | 620 | //处理课堂更新的信息 |
| 615 | if (model && model.classStatusInfo) { | 621 | if (model && model.classStatusInfo) { |
| 622 | + try{ | ||
| 623 | + model.classStatusInfo.silenceUsers=JSON.parse( model.classStatusInfo.silenceUsers); | ||
| 624 | + }catch (err){ | ||
| 625 | + | ||
| 626 | + } | ||
| 627 | + | ||
| 616 | GlobalConfig.setClassStatusInfo(model.classStatusInfo); | 628 | GlobalConfig.setClassStatusInfo(model.classStatusInfo); |
| 617 | 629 | ||
| 618 | if (model.classStatusInfo.isStopAllPublishMedia) { | 630 | if (model.classStatusInfo.isStopAllPublishMedia) { |
| @@ -778,6 +790,7 @@ class ConferApe extends Ape { | @@ -778,6 +790,7 @@ class ConferApe extends Ape { | ||
| 778 | //自己加入的时候,需要做一下判断操作,如果满足以下3个条件就要暂停课堂: | 790 | //自己加入的时候,需要做一下判断操作,如果满足以下3个条件就要暂停课堂: |
| 779 | // 1.当前课堂只有自己;2.自己的身份不是host;3当前的课堂状态为(CLASS_STATUS_STARTED= 1;//直播中) | 791 | // 1.当前课堂只有自己;2.自己的身份不是host;3当前的课堂状态为(CLASS_STATUS_STARTED= 1;//直播中) |
| 780 | let rosterLen = Object.keys(this.rosters).length; | 792 | let rosterLen = Object.keys(this.rosters).length; |
| 793 | + GlobalConfig.rosterNumber=rosterLen;//记录当前的总人数 | ||
| 781 | if (rosterLen < 1 && !GlobalConfig.isHost && GlobalConfig.classStatus == ApeConsts.CLASS_STATUS_STARTED) { | 794 | if (rosterLen < 1 && !GlobalConfig.isHost && GlobalConfig.classStatus == ApeConsts.CLASS_STATUS_STARTED) { |
| 782 | loger.warn("当前课堂没有老师->暂停课堂"); | 795 | loger.warn("当前课堂没有老师->暂停课堂"); |
| 783 | this.pauseClass({ isForce: true }); | 796 | this.pauseClass({ isForce: true }); |
| @@ -623,10 +623,19 @@ class DocApe extends Ape { | @@ -623,10 +623,19 @@ class DocApe extends Ape { | ||
| 623 | 623 | ||
| 624 | //果当前没有显示的文档,默认选择一个显示文档 | 624 | //果当前没有显示的文档,默认选择一个显示文档 |
| 625 | _showDefaultDoc() { | 625 | _showDefaultDoc() { |
| 626 | - //显示默认文档条件->1.非录制回放状态下 2.只有host有权限操作 3.当前激活的文档id不为0 | 626 | + /*//显示默认文档条件->1.非录制回放状态下 2.只有host有权限操作 3.当前激活的文档id不为0 |
| 627 | if (GlobalConfig.isRecordPlayBack || !GlobalConfig.isHost || GlobalConfig.activeDocId > 0) { | 627 | if (GlobalConfig.isRecordPlayBack || !GlobalConfig.isHost || GlobalConfig.activeDocId > 0) { |
| 628 | return; | 628 | return; |
| 629 | } | 629 | } |
| 630 | + */ | ||
| 631 | + //非录制回放状态下和当前激活的文档id不为0的时候也不能操作 | ||
| 632 | + if (GlobalConfig.isRecordPlayBack || GlobalConfig.activeDocId > 0) { | ||
| 633 | + return; | ||
| 634 | + } | ||
| 635 | + //如果自己不是老师,并且当前课堂内人数大于1,不能操作 | ||
| 636 | + if(!GlobalConfig.isHost&&GlobalConfig.rosterNumber>1){ | ||
| 637 | + return; | ||
| 638 | + } | ||
| 630 | 639 | ||
| 631 | let tempDocItemIdx;//临时记录文档数据,用于显示默认文档 | 640 | let tempDocItemIdx;//临时记录文档数据,用于显示默认文档 |
| 632 | for (let key in this.docList) { | 641 | for (let key in this.docList) { |
| @@ -123,6 +123,9 @@ class MediaModule { | @@ -123,6 +123,9 @@ class MediaModule { | ||
| 123 | return {"code": ApeConsts.RETURN_SUCCESS, | 123 | return {"code": ApeConsts.RETURN_SUCCESS, |
| 124 | "data":"", | 124 | "data":"", |
| 125 | "mediaId":freeChannel, | 125 | "mediaId":freeChannel, |
| 126 | + "userId":GlobalConfig.userId, | ||
| 127 | + "userName":GlobalConfig.userName, | ||
| 128 | + "userRole":GlobalConfig.userRole, | ||
| 126 | "publishUrl": publishUrl | 129 | "publishUrl": publishUrl |
| 127 | }; | 130 | }; |
| 128 | } | 131 | } |
| @@ -161,6 +164,9 @@ class MediaModule { | @@ -161,6 +164,9 @@ class MediaModule { | ||
| 161 | }; | 164 | }; |
| 162 | return {"code": ApeConsts.RETURN_SUCCESS, | 165 | return {"code": ApeConsts.RETURN_SUCCESS, |
| 163 | "data":"", | 166 | "data":"", |
| 167 | + "userId":GlobalConfig.userId, | ||
| 168 | + "userName":GlobalConfig.userName, | ||
| 169 | + "userRole":GlobalConfig.userRole, | ||
| 164 | "mediaId":freeChannel, | 170 | "mediaId":freeChannel, |
| 165 | "publishUrl": publishUrl | 171 | "publishUrl": publishUrl |
| 166 | }; | 172 | }; |
| @@ -202,6 +208,9 @@ class MediaModule { | @@ -202,6 +208,9 @@ class MediaModule { | ||
| 202 | return {"code": ApeConsts.RETURN_SUCCESS, | 208 | return {"code": ApeConsts.RETURN_SUCCESS, |
| 203 | "data":"", | 209 | "data":"", |
| 204 | "mediaId":shareChannel, | 210 | "mediaId":shareChannel, |
| 211 | + "userId":GlobalConfig.userId, | ||
| 212 | + "userName":GlobalConfig.userName, | ||
| 213 | + "userRole":GlobalConfig.userRole, | ||
| 205 | "publishUrl": publishUrl, | 214 | "publishUrl": publishUrl, |
| 206 | "streamId":streamId | 215 | "streamId":streamId |
| 207 | }; | 216 | }; |
| @@ -298,7 +298,7 @@ class WhiteBoardApe extends Ape { | @@ -298,7 +298,7 @@ class WhiteBoardApe extends Ape { | ||
| 298 | tableInsertHandler(owner, itemIdx, itemData) { | 298 | tableInsertHandler(owner, itemIdx, itemData) { |
| 299 | let whiteBoardModel = this.unPackPdu(owner, itemIdx, itemData); | 299 | let whiteBoardModel = this.unPackPdu(owner, itemIdx, itemData); |
| 300 | loger.log('tableInsertHandler',"activeDocId->",GlobalConfig.activeDocId ,"parentId->", whiteBoardModel.parentId); | 300 | loger.log('tableInsertHandler',"activeDocId->",GlobalConfig.activeDocId ,"parentId->", whiteBoardModel.parentId); |
| 301 | - loger.log(whiteBoardModel); | 301 | + //loger.log(whiteBoardModel); |
| 302 | if (whiteBoardModel) { | 302 | if (whiteBoardModel) { |
| 303 | if (GlobalConfig.activeDocId == whiteBoardModel.parentId && GlobalConfig.activeDocCurPage == whiteBoardModel.curPageNo) { | 303 | if (GlobalConfig.activeDocId == whiteBoardModel.parentId && GlobalConfig.activeDocCurPage == whiteBoardModel.curPageNo) { |
| 304 | //loger.log('显示新增的标注->'); | 304 | //loger.log('显示新增的标注->'); |
| @@ -72,7 +72,7 @@ class MCU extends Emiter { | @@ -72,7 +72,7 @@ class MCU extends Emiter { | ||
| 72 | joinRequestPdu.type = 2; | 72 | joinRequestPdu.type = 2; |
| 73 | joinRequestPdu.initiator = this.classInfo.nodeId; | 73 | joinRequestPdu.initiator = this.classInfo.nodeId; |
| 74 | joinRequestPdu.nodeType = PduConsts.NT_TERMINAL; //normal | 74 | joinRequestPdu.nodeType = PduConsts.NT_TERMINAL; //normal |
| 75 | - joinRequestPdu.classDescription = descriptorPdu; // classDescription | 75 | + joinRequestPdu.classDescription = descriptorPdu;// classDescription |
| 76 | 76 | ||
| 77 | let pduMsg = pdu.create_join_class_request_pdu( | 77 | let pduMsg = pdu.create_join_class_request_pdu( |
| 78 | joinRequestPdu.type, | 78 | joinRequestPdu.type, |
| @@ -86,7 +86,7 @@ class MCU extends Emiter { | @@ -86,7 +86,7 @@ class MCU extends Emiter { | ||
| 86 | PduConsts.SEG_ONCE | 86 | PduConsts.SEG_ONCE |
| 87 | ); | 87 | ); |
| 88 | 88 | ||
| 89 | - pduMsg.set("site", this.classInfo.siteId); //课堂号对应的名称 | 89 | + pduMsg.set("site", this.classInfo.siteId);//课堂号对应的名称 |
| 90 | pduMsg.set("userId", this.classInfo.userId); | 90 | pduMsg.set("userId", this.classInfo.userId); |
| 91 | pduMsg.set("userName", Base64.fromByteArray(ArrayBufferUtil.strToUint8Array(this.classInfo.userName))); | 91 | pduMsg.set("userName", Base64.fromByteArray(ArrayBufferUtil.strToUint8Array(this.classInfo.userName))); |
| 92 | pduMsg.set("userRole", this.classInfo.userRole); | 92 | pduMsg.set("userRole", this.classInfo.userRole); |
| @@ -210,7 +210,7 @@ class MCU extends Emiter { | @@ -210,7 +210,7 @@ class MCU extends Emiter { | ||
| 210 | this.classInfo = _classInfo; | 210 | this.classInfo = _classInfo; |
| 211 | // 创建刷新nodeId | 211 | // 创建刷新nodeId |
| 212 | this.classInfo.nodeId = EngineUtils.creatSoleNumberFromTimestamp(); | 212 | this.classInfo.nodeId = EngineUtils.creatSoleNumberFromTimestamp(); |
| 213 | - GlobalConfig.nodeId = this.classInfo.nodeId; //这是标识自己身份的id | 213 | + GlobalConfig.nodeId = this.classInfo.nodeId;//这是标识自己身份的id |
| 214 | 214 | ||
| 215 | let nodeInfoRecordPdu = new pdu['RCNodeInfoRecordPdu']; | 215 | let nodeInfoRecordPdu = new pdu['RCNodeInfoRecordPdu']; |
| 216 | nodeInfoRecordPdu.name = this.classInfo.userName; | 216 | nodeInfoRecordPdu.name = this.classInfo.userName; |
| @@ -223,9 +223,16 @@ class MCU extends Emiter { | @@ -223,9 +223,16 @@ class MCU extends Emiter { | ||
| 223 | nodeInfoRecordPdu.openMicrophones = 0; | 223 | nodeInfoRecordPdu.openMicrophones = 0; |
| 224 | nodeInfoRecordPdu.microphones = GlobalConfig.microphones; | 224 | nodeInfoRecordPdu.microphones = GlobalConfig.microphones; |
| 225 | nodeInfoRecordPdu.cameras = GlobalConfig.cameras; | 225 | nodeInfoRecordPdu.cameras = GlobalConfig.cameras; |
| 226 | - nodeInfoRecordPdu.videoQuality = GlobalConfig.videoQuality; //设置分辨率的 | 226 | + nodeInfoRecordPdu.videoQuality = GlobalConfig.videoQuality;//设置分辨率的 |
| 227 | nodeInfoRecordPdu.userIp = GlobalConfig.userIp; | 227 | nodeInfoRecordPdu.userIp = GlobalConfig.userIp; |
| 228 | 228 | ||
| 229 | + nodeInfoRecordPdu.deviceType = GlobalConfig.deviceType; | ||
| 230 | + nodeInfoRecordPdu.language = GlobalConfig.language; | ||
| 231 | + nodeInfoRecordPdu.explorer = GlobalConfig.explorer; | ||
| 232 | + nodeInfoRecordPdu.explorerVersion = GlobalConfig.explorerVersion; | ||
| 233 | + nodeInfoRecordPdu.os = GlobalConfig.os; | ||
| 234 | + | ||
| 235 | + | ||
| 229 | let conferenceRecord = {}; //RCConferenceRecord_T | 236 | let conferenceRecord = {}; //RCConferenceRecord_T |
| 230 | conferenceRecord._conference_id = this.classInfo.classId; | 237 | conferenceRecord._conference_id = this.classInfo.classId; |
| 231 | conferenceRecord._top_node_id = this.classInfo.topNodeID; | 238 | conferenceRecord._top_node_id = this.classInfo.topNodeID; |
| @@ -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 { |
-
请 注册 或 登录 后发表评论