李勇

1.增加MCU动态切换,如果MCU连接出错,自动重连5次没连接成功,会进行MCU选点,切换MCU再连接

此 diff 太大无法显示。
@@ -27,7 +27,7 @@ import Server from "config/Server"; @@ -27,7 +27,7 @@ import Server from "config/Server";
27 import UTF8 from 'utf-8'; 27 import UTF8 from 'utf-8';
28 28
29 let loger = Loger.getLoger('McuClient'); 29 let loger = Loger.getLoger('McuClient');
30 -let _sdkInfo = {"version": "v1.9.11.20170419", "author": "www.3mang.com"}; 30 +let _sdkInfo = {"version": "v1.9.12.20170419", "author": "www.3mang.com"};
31 31
32 //APE 32 //APE
33 let _sass; 33 let _sass;
@@ -78,6 +78,7 @@ export default class MessageEntrance extends Emiter { @@ -78,6 +78,7 @@ export default class MessageEntrance extends Emiter {
78 _mcu = Mcu; 78 _mcu = Mcu;
79 _mcu.on('*', (type, data) => this._emit(type, data)); 79 _mcu.on('*', (type, data) => this._emit(type, data));
80 _mcu.on(MessageTypes.CLASS_JOIN_MCU_SUCCESS, this._mcuJoinMCUClassSuccessHandler.bind(this));//加入MCU课堂完成 80 _mcu.on(MessageTypes.CLASS_JOIN_MCU_SUCCESS, this._mcuJoinMCUClassSuccessHandler.bind(this));//加入MCU课堂完成
  81 + _mcu.on(MessageTypes.CHANGE_MCU_IP, this._changeMcuIpHandler.bind(this));//切换MCU,重新选点
81 82
82 //录制回放 83 //录制回放
83 _recordPlayback = RecordPlayBackParse; 84 _recordPlayback = RecordPlayBackParse;
@@ -198,8 +199,8 @@ export default class MessageEntrance extends Emiter { @@ -198,8 +199,8 @@ export default class MessageEntrance extends Emiter {
198 _mcuErrorHandler(_data, _option) { 199 _mcuErrorHandler(_data, _option) {
199 let option = _option || ""; 200 let option = _option || "";
200 let errorMessage = {"code": _data, "reson": MessageTypes.ErrorReson[_data] + " " + option}; 201 let errorMessage = {"code": _data, "reson": MessageTypes.ErrorReson[_data] + " " + option};
201 - loger.error("MCU_ERROR", errorMessage);  
202 this._emit(MessageTypes.ERROR_EVENT, errorMessage); 202 this._emit(MessageTypes.ERROR_EVENT, errorMessage);
  203 + loger.error("MCU_ERROR", errorMessage);
203 } 204 }
204 205
205 //获取当前的状态 206 //获取当前的状态
@@ -734,6 +735,31 @@ export default class MessageEntrance extends Emiter { @@ -734,6 +735,31 @@ export default class MessageEntrance extends Emiter {
734 this._emit(MessageTypes.CLASS_JOIN_SUCCESS, joinClassSuccessCallBackData); 735 this._emit(MessageTypes.CLASS_JOIN_SUCCESS, joinClassSuccessCallBackData);
735 } 736 }
736 737
  738 + //切换MCU
  739 + _changeMcuIpHandler(){
  740 + if(GlobalConfig.isRecordPlayBack){
  741 + //录制回放不做操作
  742 + return;
  743 + }
  744 + loger.log('MCU->动态选点');
  745 + let _this=this;
  746 + this._getFastestMcuServer(function (_data) {
  747 + loger.log("MCU选点结束->", _data);
  748 + if (_data && _data.ip) {
  749 + GlobalConfig.MCUServerIP = _data.ip;
  750 + GlobalConfig.MCUServerPort = _data.port;
  751 + }else {
  752 + //随机选择一个
  753 + if (GlobalConfig.mcuList &&GlobalConfig.mcuList.length > 0) {
  754 + let index = parseInt(Math.random() * GlobalConfig.mcuList.length);
  755 + GlobalConfig.DOCServerIP = GlobalConfig.mcuList[index].ip || "";
  756 + GlobalConfig.DOCServerPort = GlobalConfig.mcuList[index].port || "";
  757 + }
  758 + }
  759 + loger.log('MCU->切换->', GlobalConfig.DOCServerIP, GlobalConfig.DOCServerPort );
  760 + });
  761 + }
  762 +
737 //Sass删除文档数据 763 //Sass删除文档数据
738 _sassDeleteDocument(_param) { 764 _sassDeleteDocument(_param) {
739 if (!_mcu.connected) { 765 if (!_mcu.connected) {
@@ -15,13 +15,15 @@ @@ -15,13 +15,15 @@
15 import Emiter from 'Emiter'; 15 import Emiter from 'Emiter';
16 import Loger from 'Loger'; 16 import Loger from 'Loger';
17 let loger = Loger.getLoger('EverSocket'); 17 let loger = Loger.getLoger('EverSocket');
18 - 18 +const MCU_MAX_RECONNECTION = 5;//最多重连次数
19 class EverSocket extends Emiter { 19 class EverSocket extends Emiter {
20 constructor() { 20 constructor() {
21 super(); 21 super();
22 this._connected = false; 22 this._connected = false;
23 this._lastActiveTime = 0;//最后一次收到消息的时间 23 this._lastActiveTime = 0;//最后一次收到消息的时间
24 this._enableEverSocket = false; 24 this._enableEverSocket = false;
  25 + this.reConnectionCounter = 0;//重连次数
  26 +
25 } 27 }
26 28
27 begin(ip, port) { 29 begin(ip, port) {
@@ -42,9 +44,9 @@ class EverSocket extends Emiter { @@ -42,9 +44,9 @@ class EverSocket extends Emiter {
42 44
43 send(data) { 45 send(data) {
44 if (this._connected) { 46 if (this._connected) {
45 - if(data){  
46 - loger.log('SEND MESSAGE,byteLength---->',data.byteLength);  
47 - }else { 47 + if (data) {
  48 + loger.log('SEND MESSAGE,byteLength---->', data.byteLength);
  49 + } else {
48 loger.log('SEND MESSAGE---->'); 50 loger.log('SEND MESSAGE---->');
49 } 51 }
50 this.websocket.send(data); 52 this.websocket.send(data);
@@ -73,6 +75,14 @@ class EverSocket extends Emiter { @@ -73,6 +75,14 @@ class EverSocket extends Emiter {
73 75
74 _reConnection() { 76 _reConnection() {
75 this._clear(); 77 this._clear();
  78 + window.clearTimeout(this.reConnectionTimeout);
  79 + this.reConnectionCounter++;
  80 + if (this.reConnectionCounter > MCU_MAX_RECONNECTION) {
  81 + loger.warn('已经达到最大重连次数!');
  82 + this._emit(EverSocket.ERROR, EverSocket.ERR_SOCKET_RECONNECT_FAILED);
  83 + this.reConnectionCounter=0;
  84 + }
  85 +
76 this.reConnectionTimeout = window.setTimeout(() => { 86 this.reConnectionTimeout = window.setTimeout(() => {
77 loger.log('WebSocket重新建立.'); 87 loger.log('WebSocket重新建立.');
78 window.clearTimeout(this.reConnectionTimeout); 88 window.clearTimeout(this.reConnectionTimeout);
@@ -88,7 +98,7 @@ class EverSocket extends Emiter { @@ -88,7 +98,7 @@ class EverSocket extends Emiter {
88 window.clearInterval(this.reConnectionTimeout); 98 window.clearInterval(this.reConnectionTimeout);
89 this._setConnected(false);//先设置状态 99 this._setConnected(false);//先设置状态
90 this._enableEverSocket = false; 100 this._enableEverSocket = false;
91 - if(this.websocket==null){ 101 + if (this.websocket == null) {
92 loger.log('WebSocket,Timers已经销毁'); 102 loger.log('WebSocket,Timers已经销毁');
93 return; 103 return;
94 } 104 }
@@ -107,6 +117,7 @@ class EverSocket extends Emiter { @@ -107,6 +117,7 @@ class EverSocket extends Emiter {
107 117
108 _onOpen() { 118 _onOpen() {
109 loger.log('WebSocket建立成功', this.wsURL); 119 loger.log('WebSocket建立成功', this.wsURL);
  120 + this.reConnectionCounter = 0;
110 121
111 //启动心跳,检查socket链接状态 122 //启动心跳,检查socket链接状态
112 this.pingTimer = window.setInterval(this._sendPingHandler.bind(this), EverSocket.PING_INTERVAL); 123 this.pingTimer = window.setInterval(this._sendPingHandler.bind(this), EverSocket.PING_INTERVAL);
@@ -159,9 +170,9 @@ class EverSocket extends Emiter { @@ -159,9 +170,9 @@ class EverSocket extends Emiter {
159 170
160 171
161 /*//修改之前的 172 /*//修改之前的
162 -EverSocket.prototype.PONG_INTERVAL = EverSocket.PONG_INTERVAL = 5000;  
163 -EverSocket.prototype.PING_INTERVAL = EverSocket.PING_INTERVAL = 3000;  
164 -EverSocket.prototype.RECONN_INTERVAL = EverSocket.RECONN_INTERVAL = 2000;*/ 173 + EverSocket.prototype.PONG_INTERVAL = EverSocket.PONG_INTERVAL = 5000;
  174 + EverSocket.prototype.PING_INTERVAL = EverSocket.PING_INTERVAL = 3000;
  175 + EverSocket.prototype.RECONN_INTERVAL = EverSocket.RECONN_INTERVAL = 2000;*/
165 176
166 177
167 //20170223-mcu服务端修改了心跳的逻辑,如果客户端30秒没有请求,就会按离开的处理 178 //20170223-mcu服务端修改了心跳的逻辑,如果客户端30秒没有请求,就会按离开的处理
@@ -170,11 +181,14 @@ EverSocket.prototype.PONG_INTERVAL = EverSocket.PONG_INTERVAL = 21000;// @@ -170,11 +181,14 @@ EverSocket.prototype.PONG_INTERVAL = EverSocket.PONG_INTERVAL = 21000;//
170 EverSocket.prototype.PING_INTERVAL = EverSocket.PING_INTERVAL = 10000;//心跳间隔 181 EverSocket.prototype.PING_INTERVAL = EverSocket.PING_INTERVAL = 10000;//心跳间隔
171 EverSocket.prototype.RECONN_INTERVAL = EverSocket.RECONN_INTERVAL = 3000;//重连的间隔 182 EverSocket.prototype.RECONN_INTERVAL = EverSocket.RECONN_INTERVAL = 3000;//重连的间隔
172 183
  184 +
  185 +EverSocket.prototype.ERR_SOCKET_RECONNECT_FAILED =EverSocket.ERR_SOCKET_RECONNECT_FAILED=20001;//MCU自动重连失败,已经达到最大重连次数
  186 +
173 EverSocket.prototype.CONNECTING = EverSocket.CONNECTING = 0; 187 EverSocket.prototype.CONNECTING = EverSocket.CONNECTING = 0;
174 EverSocket.prototype.OPEN = EverSocket.OPEN = 1; 188 EverSocket.prototype.OPEN = EverSocket.OPEN = 1;
175 EverSocket.prototype.CLOSING = EverSocket.CLOSING = 2; 189 EverSocket.prototype.CLOSING = EverSocket.CLOSING = 2;
176 EverSocket.prototype.CLOSED = EverSocket.CLOSED = 3; 190 EverSocket.prototype.CLOSED = EverSocket.CLOSED = 3;
177 EverSocket.prototype.MESSAGE = EverSocket.MESSAGE = 4; 191 EverSocket.prototype.MESSAGE = EverSocket.MESSAGE = 4;
178 - 192 +EverSocket.prototype.ERROR = EverSocket.ERROR = 5;
179 export default new EverSocket(); 193 export default new EverSocket();
180 194
@@ -42,8 +42,6 @@ MessageTypes.VIDEO_BROADCAST= "video_broadcast";//'视频控制广播消息; @@ -42,8 +42,6 @@ MessageTypes.VIDEO_BROADCAST= "video_broadcast";//'视频控制广播消息;
42 MessageTypes.VIDEO_GET_PUBLISH_PATH= "video_get_publish_path";//获取视频推流地址 42 MessageTypes.VIDEO_GET_PUBLISH_PATH= "video_get_publish_path";//获取视频推流地址
43 MessageTypes.VIDEO_PUBLISH_RESULT= "video_publish_result";//获取视频推流结果 43 MessageTypes.VIDEO_PUBLISH_RESULT= "video_publish_result";//获取视频推流结果
44 44
45 -  
46 -  
47 //音频模块事件定义 45 //音频模块事件定义
48 MessageTypes.AUDIO_PLAY ="audio_play";// 'audio.play';//播放 46 MessageTypes.AUDIO_PLAY ="audio_play";// 'audio.play';//播放
49 MessageTypes.AUDIO_STOP = "audio_stop";//'audio.stop';//停止 47 MessageTypes.AUDIO_STOP = "audio_stop";//'audio.stop';//停止
@@ -52,6 +50,9 @@ MessageTypes.AUDIO_BROADCAST= "audio_broadcast";//'audio.broadcast'; @@ -52,6 +50,9 @@ MessageTypes.AUDIO_BROADCAST= "audio_broadcast";//'audio.broadcast';
52 MessageTypes.AUDIO_GET_PUBLISH_PATH= "audio_get_publish_path";//获取音频推流地址 50 MessageTypes.AUDIO_GET_PUBLISH_PATH= "audio_get_publish_path";//获取音频推流地址
53 MessageTypes.AUDIO_PUBLISH_RESULT= "audio_publish_result";//获取音频推流结果 51 MessageTypes.AUDIO_PUBLISH_RESULT= "audio_publish_result";//获取音频推流结果
54 52
  53 +MessageTypes.CHANGE_MS_IP ="change_ms_ip";//切换ms 重新选点
  54 +
  55 +
55 //文档模块事件定义 56 //文档模块事件定义
56 MessageTypes.DOC_DELETE="document_delete";//'document.delete';//删除文档 57 MessageTypes.DOC_DELETE="document_delete";//'document.delete';//删除文档
57 MessageTypes.DOC_UPDATE ="document_update";// 'document.update';//更新文档(添加、变更) 58 MessageTypes.DOC_UPDATE ="document_update";// 'document.update';//更新文档(添加、变更)
@@ -71,6 +72,10 @@ MessageTypes.WHITEBOARD_ANNOTATION_UPDATE ="whiteboard_annotation_update";// 'wh @@ -71,6 +72,10 @@ MessageTypes.WHITEBOARD_ANNOTATION_UPDATE ="whiteboard_annotation_update";// 'wh
71 //MessageTypes.WHITEBOARD_ANNOTATION_CLEAR = 'whiteboard.annotation.clear'; 72 //MessageTypes.WHITEBOARD_ANNOTATION_CLEAR = 'whiteboard.annotation.clear';
72 73
73 74
  75 +//MCU
  76 +MessageTypes.CHANGE_MCU_IP ="change_mcu_ip";//切换mcu 重新选点
  77 +
  78 +
74 //录制回放 79 //录制回放
75 MessageTypes.RECORD_PLAYBACK_UPDATE ="record_playback_update";//录制回放更新信息 80 MessageTypes.RECORD_PLAYBACK_UPDATE ="record_playback_update";//录制回放更新信息
76 81
@@ -127,6 +132,7 @@ MessageTypes.ERR_NETWORK=10000;//网络错误 @@ -127,6 +132,7 @@ MessageTypes.ERR_NETWORK=10000;//网络错误
127 MessageTypes.ERR_UNKNOWN=10001;//未知错误 132 MessageTypes.ERR_UNKNOWN=10001;//未知错误
128 133
129 MessageTypes.ERR_SOCKET_DISCONNECT=20000;//MCU断开连接,已经离开课堂 134 MessageTypes.ERR_SOCKET_DISCONNECT=20000;//MCU断开连接,已经离开课堂
  135 +MessageTypes.ERR_SOCKET_RECONNECT_FAILED=20001;//MCU自动重连失败,已经达到最大重连次数
130 136
131 //---------------错误消息 Error Reson 定义------------------------------------------------- 137 //---------------错误消息 Error Reson 定义-------------------------------------------------
132 MessageTypes.ErrorReson={}; 138 MessageTypes.ErrorReson={};
@@ -178,8 +184,7 @@ MessageTypes.ErrorReson[MessageTypes.ERR_NETWORK]="网络错误"; @@ -178,8 +184,7 @@ MessageTypes.ErrorReson[MessageTypes.ERR_NETWORK]="网络错误";
178 MessageTypes.ErrorReson[MessageTypes.ERR_UNKNOWN]="未知错误"; 184 MessageTypes.ErrorReson[MessageTypes.ERR_UNKNOWN]="未知错误";
179 185
180 MessageTypes.ErrorReson[MessageTypes.ERR_SOCKET_DISCONNECT]="MCU断开连接,已经离开课堂"; 186 MessageTypes.ErrorReson[MessageTypes.ERR_SOCKET_DISCONNECT]="MCU断开连接,已经离开课堂";
181 -  
182 - 187 +MessageTypes.ErrorReson[MessageTypes.ERR_SOCKET_RECONNECT_FAILED]="MCU自动重连失败,已经达到最大重连次数";
183 188
184 export default MessageTypes; 189 export default MessageTypes;
185 190
@@ -24,6 +24,7 @@ class MCU extends Emiter { @@ -24,6 +24,7 @@ class MCU extends Emiter {
24 this._everSocket.on(everSocket.OPEN, this._everSocketOpenHandler.bind(this)); 24 this._everSocket.on(everSocket.OPEN, this._everSocketOpenHandler.bind(this));
25 this._everSocket.on(everSocket.MESSAGE, this._everSocketMsgReceivedHandler.bind(this)); 25 this._everSocket.on(everSocket.MESSAGE, this._everSocketMsgReceivedHandler.bind(this));
26 this._everSocket.on(everSocket.CLOSED, this._everSocketCloseHandler.bind(this)); 26 this._everSocket.on(everSocket.CLOSED, this._everSocketCloseHandler.bind(this));
  27 + this._everSocket.on(everSocket.ERROR,this._everSocketErrorHandler.bind(this));
27 } 28 }
28 29
29 // 注册Ape 30 // 注册Ape
@@ -41,7 +42,14 @@ class MCU extends Emiter { @@ -41,7 +42,14 @@ class MCU extends Emiter {
41 GlobalConfig.setCurrentStatus(GlobalConfig.statusCode_3); 42 GlobalConfig.setCurrentStatus(GlobalConfig.statusCode_3);
42 this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_SOCKET_DISCONNECT); 43 this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_SOCKET_DISCONNECT);
43 } 44 }
44 - 45 + //EverSocket错误异常
  46 + _everSocketErrorHandler(_errorCode){
  47 + this._emit(MessageTypes.MCU_ERROR,_errorCode);
  48 + //如果自动重连次数已经达到最大值,重新选点
  49 + if(_errorCode==everSocket.ERR_SOCKET_RECONNECT_FAILED){
  50 + this._emit(MessageTypes.CHANGE_MCU_IP);
  51 + }
  52 + }
45 53
46 //MCU-发送加入课堂请求 54 //MCU-发送加入课堂请求
47 _sendJoinClassRequest() { 55 _sendJoinClassRequest() {