李勇

1.调整MCU MS选点模块,新增IpManager.js (ServerCheck.js暂停使用),调整选点流程

import Emiter from 'Emiter';
import Loger from 'Loger';
import MessageTypes from 'MessageTypes';
import GlobalConfig from 'GlobalConfig';
import Emiter from 'src/Emiter';
import Loger from 'src/Loger';
import MessageTypes from 'src/MessageTypes';
import GlobalConfig from 'src/GlobalConfig';
import MD5 from "md5";
import ApeConsts from 'apes/ApeConsts';
import ApeConsts from 'src/apes/ApeConsts';
import iphunter from 'iphunter';
import Server from "config/Server";
import Server from "src/config/Server";
import fetchJsonp from 'fetch-jsonp';
// 日志对象
... ...
此 diff 太大无法显示。
... ... @@ -5,7 +5,7 @@ require('string.fromcodepoint');
import Emiter from './Emiter';
import Sass from 'Sass';
import ServerCheck from 'ServerCheck';
import IpManager from 'IpManager';
import RecordPlayBackParse from 'RecordPlayBackParse';
import MD5 from "md5";
import Mcu from 'mcu';
... ... @@ -22,15 +22,16 @@ import GlobalConfig from 'GlobalConfig';
import ApeConsts from 'apes/ApeConsts';
import Base64 from 'base64-js';
import ArrayBufferUtil from 'libs/ArrayBufferUtil';
import Server from "config/Server";
import UTF8 from 'utf-8';
let loger = Loger.getLoger('McuClient');
let _sdkInfo = {"version": "v1.9.6.20170418", "author": "www.3mang.com"};
let _sdkInfo = {"version": "v1.9.11.20170419", "author": "www.3mang.com"};
//APE
let _sass;
let _serverCheck;
let _ipManager;
let _mcu;
let _confer_ape;
let _chat_ape;
... ... @@ -49,6 +50,10 @@ export default class MessageEntrance extends Emiter {
loger.log(this.sdkInfo);
//初始化状态
this.isGetUserIpCallback = false;//是否获取IP信息返回
this.isGetFastestMcuCallback = false;//是否MCU选点结束
this.isGetFastestMsCallback = false;//是否MS选点结束
GlobalConfig.setCurrentStatus(GlobalConfig.statusCode_0);
//全局的Error处理
... ... @@ -66,9 +71,8 @@ export default class MessageEntrance extends Emiter {
_sass.on(_sass.CLASS_SAVE_RECORD_INFO_SUCCESS, this._sassSaveClassRecordInfoSuccessHandler.bind(this));//保存课堂录制信息
_sass.on(_sass.DELETE_DOCUMENT_SUCCESS, this._sassDeleteDocumentSuccess.bind(this));//sass删除文档成功
//ServerCheck ip
_serverCheck = ServerCheck;
_serverCheck.on(_serverCheck.SEVER_CHECK_BEST_IP_SUCCESS, this._serverCheckBestIpSuccessHandler.bind(this));//ip选点,获取最佳ip完成
//选点模块
_ipManager = new IpManager();
// 底层MCU消息层
_mcu = Mcu;
... ... @@ -362,9 +366,9 @@ export default class MessageEntrance extends Emiter {
GlobalConfig.hasCamera = (typeof _param.hasCamera == "boolean") ? _param.hasCamera : false;
GlobalConfig.hasMicrophone = (typeof _param.hasMicrophone == "boolean") ? _param.hasMicrophone : false;
loger.log("autoLoginMd5", GlobalConfig.classId, GlobalConfig.userId, GlobalConfig.userRole);
//loger.log("autoLoginMd5", GlobalConfig.classId, GlobalConfig.userId, GlobalConfig.userRole);
let autoLoginMd5 = MD5("" + GlobalConfig.classId + GlobalConfig.userId + GlobalConfig.userRole);
loger.log("joinClass-GlobalConfig.autoLogin", GlobalConfig.autoLogin, "autoLoginMd5-", autoLoginMd5);
//loger.log("joinClass-GlobalConfig.autoLogin", GlobalConfig.autoLogin, "autoLoginMd5-", autoLoginMd5);
if (GlobalConfig.autoLogin && autoLoginMd5 == GlobalConfig.autoLogin) {
// MD5(classId+userId+userRole)==m
//自动登录,跳过验证流程
... ... @@ -438,7 +442,6 @@ export default class MessageEntrance extends Emiter {
//视频质量相关设置
GlobalConfig.fps = _data.fps || 15;
GlobalConfig.gop = _data.gop || 3;
;
GlobalConfig.videoQuality = _data.videoQuality || 2;
//是否自动开始(身份是host的时候才用到的)
... ... @@ -506,7 +509,7 @@ export default class MessageEntrance extends Emiter {
}
//录制回放不需要选点
//录制回放不需要获取ip信息和选点
if (GlobalConfig.isRecordPlayBack) {
if (_recordPlayback) {
//开启录制回放流程
... ... @@ -516,22 +519,115 @@ export default class MessageEntrance extends Emiter {
loger.warn("开启录制回放流程失败,还未创建模块");
}
} else {
//根据用户的userIp获取信息
//根据用户的userIp获取信息,选点
this.getUserIpInfo();
}
}
//根据UserIp获取ip信息,选点
getUserIpInfo() {
if (_serverCheck) {
_serverCheck.getUserIpInfo("", GlobalConfig.userIp);
if (_ipManager) {
_ipManager.getUserIpInfo("", GlobalConfig.userIp, this._getUserIpCallbackHandler.bind(this), 1000);
}
}
//获取IP信息完成
_getUserIpCallbackHandler(_data) {
//获取IP信息,返回一次就不再处理
if (this.isGetUserIpCallback) {
return;
}
this.isGetUserIpCallback = true;
if (_data && _data.ret == "ok") {
GlobalConfig.country = _data.country;//国家
GlobalConfig.city = _data.city;//城市
GlobalConfig.province = _data.province;//服务商
GlobalConfig.isp = _data.isp;//服务商
}
//合并MCU 、MS的列表
this._mergeMcuAndMsList();
//开始选点
let _this = this;
this._getFastestMsServer(function (_data) {
loger.log("MS选点结束->", _data);
if (_data && _data.ip) {
GlobalConfig.MSServerIP = _data.ip;
GlobalConfig.MSServerPort = _data.port;
}
_this.isGetFastestMcuCallback = true;
_this._startConnectMCU();
});
this._getFastestMcuServer(function (_data) {
loger.log("MCU选点结束->", _data);
if (_data && _data.ip) {
GlobalConfig.MCUServerIP = _data.ip;
GlobalConfig.MCUServerPort = _data.port;
}
_this.isGetFastestMsCallback = true;
_this._startConnectMCU();
});
}
//开始连接MCU(MCU和MS都选点结束之后才开始连接)
_startConnectMCU() {
if (this.isGetFastestMcuCallback && this.isGetFastestMsCallback) {
this._joinMCU();
}
}
//合并Sever和Sass的mcu、ms列表
_mergeMcuAndMsList() {
if (_ipManager) {
GlobalConfig.mcuListFromServer = _ipManager.getServerMcuList(
GlobalConfig.country,
GlobalConfig.province,
GlobalConfig.city,
GlobalConfig.isp,
Server.serverList);
GlobalConfig.msListFromServer = _ipManager.getServerMsList(
GlobalConfig.country,
GlobalConfig.province,
GlobalConfig.city,
GlobalConfig.isp,
Server.serverList);
}
//console.log(" GlobalConfig.mcuListFromServer", GlobalConfig.mcuListFromServer)
//console.log(" GlobalConfig.msListFromServer", GlobalConfig.msListFromServer)
//合并所有MCU、MS 列表
GlobalConfig.mcuListAll.length = 0;
GlobalConfig.mcuListAll = GlobalConfig.mcuListAll.concat(GlobalConfig.mcuList, GlobalConfig.mcuListFromServer);
GlobalConfig.msListAll.length = 0;
GlobalConfig.msListAll = GlobalConfig.msListAll.concat(GlobalConfig.msList, GlobalConfig.msListFromServer);
//console.log(" GlobalConfig.mcuListAll", GlobalConfig.mcuListAll)
//console.log(" GlobalConfig.msListAll", GlobalConfig.msListAll)
}
//开始MCU选点操作
_getFastestMcuServer(_callback) {
if (_ipManager) {
_ipManager.getFastestMcuServer(GlobalConfig.mcuListAll, _callback);
} else {
if (_callback) {
_callback({'ip': ""});
}
}
}
//MCU MS ip选点完成,开加入MCU
_serverCheckBestIpSuccessHandler(_data) {
loger.log("_serverCheckBestIpSuccessHandler,IP选点结束");
this._joinMCU();
// //开始MS选点操作
_getFastestMsServer(_callback) {
if (_ipManager) {
_ipManager.getFastestMsServer(GlobalConfig.msListAll, _callback);
} else {
if (_callback) {
_callback({ip: ""});
}
}
}
//保存课堂状态信息
... ... @@ -577,7 +673,7 @@ export default class MessageEntrance extends Emiter {
// MCU 课堂成功
_mcuJoinMCUClassSuccessHandler(_data) {
loger.log('MCU 课堂成功.');
//loger.log('MCU 课堂成功.');
GlobalConfig.setCurrentStatus(GlobalConfig.statusCode_2);
//返回给客户端初始化成功的数据
... ...
... ... @@ -254,8 +254,8 @@ GlobalConfig.portal="112.126.80.182:80";//Sass IP
//GlobalConfig.ip="112.126.80.182";
//GlobalConfig.port="80";
GlobalConfig.MCUServerIP="114.215.195.70";
GlobalConfig.MCUServerPort=9003;
GlobalConfig.MCUServerIP="";
GlobalConfig.MCUServerPort='';
GlobalConfig.MSServerIP = "";//推流 播流的地址
GlobalConfig.MSServerPort ="";
... ... @@ -328,6 +328,7 @@ GlobalConfig.videoQuality=2;//画面质量 0-低;1-中;2-高;
GlobalConfig.classAllParam={};//Sass直接返回的所有课堂信息(最全)
GlobalConfig.classDetail={};//Sass直接返回的当前课堂基本信息
//从Sass获取的
GlobalConfig.docListPrepare=[]; // 已经提前上传的文档,进入课堂后需要自动加载
GlobalConfig.recordList=[];//录制服务器地址集合
GlobalConfig.docList=[];//文档服务器地址集合
... ... @@ -338,11 +339,18 @@ GlobalConfig.musicListPrepare=[];//提提前上传的music集合
GlobalConfig.rsList=[];//录制回放中视频点播地址
//根据IP从server获取
GlobalConfig.mcuListFromServer=[];//根据userIP从server获取的mcu列表
GlobalConfig.msListFromServer=[];//根据userIP从server获取的ms列表
GlobalConfig.country ="";//国家
GlobalConfig.city ="";//城市
GlobalConfig.province = "";//服务商
GlobalConfig.isp ="";//服务商
GlobalConfig.mcuListAll=[];//所有MCU集合(sass+server)
GlobalConfig.msListAll=[];//所有MS集合(sass+server)
GlobalConfig.isRecordPlayBack=false;//是否是录制回放,默认是否
GlobalConfig.allowRecordMaxTime=14400;//(秒)允许录制的最长时间,默认是4小时
export default GlobalConfig;
... ...
/**
*
* IP 管理(ip信息或,动态选点)
* */
import Emiter from 'Emiter';
import Loger from 'Loger';
import MD5 from "md5";
import iphunter from 'iphunter';
import fetchJsonp from 'fetch-jsonp';
// 日志对象
const loger = Loger.getLoger('IpManager');
const TIME_OUT = 2000;//选点超时
const MS_DEFAULT_PORT = "1935";//默认流媒体端口
const MCU_DEFAULT_PORT = "7777";//默认的mcu端口
const SPEED_TEST_PORT = '5555';//测速端口(MCU/MS)
class IpManager extends Emiter {
constructor() {
super();
}
//根据userIp获取ip相关的信息,参数是userIp
getUserIpInfo(token, userIp, _callback, _timeOutDelay) {
let userIpInfo = {
ret: -1
};
// //("addr=" + ip + "&token=b657c3507b324353e09c1958ee956a98efceb3e3"),转成MD5
let md5Str = MD5("addr=" + userIp + "&token=b657c3507b324353e09c1958ee956a98efceb3e3");
let timestamp = new Date().getTime();
let url = `http://ipapi.ipip.net/find?addr=${userIp}&sid=14&uid=5237&sig=${md5Str}&_=${timestamp}`;
loger.log("获取IP信息->", url);
let _this = this;
fetchJsonp(url, {
timeout: _timeOutDelay || TIME_OUT,
}).then(function (response) {
return response.json();
}).then(function (json) {
// loger.log('获取IP信息返回', json)
if (json) {
userIpInfo.ret = json.ret;
userIpInfo.country = json.data[0];//国家
userIpInfo.province = json.data[1];//省份
userIpInfo.city = json.data[2];//城市
userIpInfo.isp = json.data[4];//运营商
}
loger.warn('获取IP信息->完成->', userIpInfo);
if (_callback) {
_callback(userIpInfo);
/*/if (userIpInfo.ret == "ok") {
GlobalConfig.country = userIpInfo.country;//国家
GlobalConfig.city = userIpInfo.city;//城市
GlobalConfig.province = userIpInfo.province;//服务商
GlobalConfig.isp = userIpInfo.isp;//服务商
// loger.log("获取ip详情成功,country:" + GlobalConfig.country + ",city:" + GlobalConfig.city + ",isp:" + GlobalConfig.isp);
this._chooseBestIpFromServer();
}*/
}
}).catch(function (ex) {
loger.warn('获取IP信息->失败->', ex.message);
if (_callback) {
_callback(userIpInfo);
}
});
}
//获取最快的MCU服务器地址,参数是一个ip数组
getFastestMcuServer(_ipList, _callback, _timeOutDelay) {
loger.log('开始MCU选点-> ', _ipList);
let callbackData = {ip: ""};
if (_ipList == null || _ipList.length < 1) {
if (_callback) {
_callback(callbackData);
}
return;
}
//对传入的ip数组进行组织
let newList = new Set();
let listLen = _ipList.length;
for (let i = 0; i < listLen; i++) {
let msItem = _ipList[i];
if (msItem && msItem.ip) {
//测速的时候,ip地址要拼接成带端口的完整地址,测速的端口是固定的
newList.add((msItem.ip + ':' + SPEED_TEST_PORT));
}
}
//过滤完重复ip
let ipListArr = Array.from(newList);
loger.log('MCU选点->列表', ipListArr);
if (ipListArr == null || ipListArr.length < 1) {
if (_callback) {
_callback(callbackData);
}
return;
}
try {
iphunter(ipListArr, function (fatest_ip_response) {
if (!fatest_ip_response) {
loger.warn('MCU选点-> nothing!');
if (_callback) {
_callback(callbackData);
}
} else {
loger.log('MCU选点->done -> ', fatest_ip_response);
let fastestIp = fatest_ip_response.replace((':' + SPEED_TEST_PORT), '') || ""
callbackData.ip = fastestIp;
callbackData.port = '';
//根据ip从原来的ip列表中查找端口
let listLen = _ipList.length;
for (let i = 0; i < listLen; i++) {
let msItem = _ipList[i];
if (msItem && msItem.ip) {
if (fastestIp == msItem.ip) {
callbackData.port = msItem.port || MCU_DEFAULT_PORT;
break;
}
}
}
//返回数据
if (_callback) {
_callback(callbackData);
}
}
}, _timeOutDelay || TIME_OUT);
} catch (err) {
loger.log('MCU选点->失败', err.message);
}
}
//获取最快的MS服务器地址,参数是一个ip数组
getFastestMsServer(_ipList, _callback, _timeOutDelay) {
loger.log('开始MS选点->', _ipList);
let callbackData = {ip: ""};
if (_ipList == null || _ipList.length < 1) {
if (_callback) {
_callback(callbackData);
}
return;
}
//对传入的ip数组进行组织
let newList = new Set();
let listLen = _ipList.length;
for (let i = 0; i < listLen; i++) {
let msItem = _ipList[i];
if (msItem && msItem.ip) {
//测速的时候,ip地址要拼接成带端口的完整地址,测速的端口是固定的
newList.add((msItem.ip + ':' + SPEED_TEST_PORT));
}
}
//过滤完重复ip
let ipListArr = Array.from(newList);
if (ipListArr == null || ipListArr.length < 1) {
if (_callback) {
_callback(callbackData);
}
return;
}
loger.log('MS选点->列表', ipListArr);
try {
iphunter(ipListArr, function (fatest_ip_response) {
if (!fatest_ip_response) {
loger.warn('MS选点-> nothing!');
if (_callback) {
_callback(callbackData);
}
} else {
loger.log('MS选点->done -> ', fatest_ip_response);
let fastestIp = fatest_ip_response.replace((':' + SPEED_TEST_PORT), '') || ""
callbackData.ip = fastestIp;
callbackData.port = '';
//根据ip从原来的ip列表中查找端口
let listLen = _ipList.length;
for (let i = 0; i < listLen; i++) {
let msItem = _ipList[i];
if (msItem && msItem.ip) {
if (fastestIp == msItem.ip) {
callbackData.port = msItem.port || MS_DEFAULT_PORT;
break;
}
}
}
//返回数据
if (_callback) {
_callback(callbackData);
}
}
}, _timeOutDelay || TIME_OUT);
} catch (err) {
loger.warn('MS选点->ERROR -> ', err.message);
if (_callback) {
_callback(callbackData);
}
}
}
//根据user信息从配置文件中MCU连接地址
getServerMcuList(country, province, ctiy, isp, jsona) {
let countryData = jsona.MCU[country];
//按country没有查找到就返回default
if (!countryData) {
countryData = jsona.MCU.default || [];
return countryData;
}
if (country != "中国") {
return countryData;
}
//中国的需要细分
//按isp查找
let ispData = countryData.isp[isp];
//isp查找到就返回
if (ispData) {
// loger.log("_returnServerMCU->ispData",ispData);
return ispData;
}
//isp没查找到,用province
let provinceData = countryData.province[province];
//用province查找到就返回
if (provinceData) {
// loger.log("_returnServerMCU->provinceData",provinceData);
return provinceData;
}
//isp province都没有,使用default
let defaultData = countryData.default
if (defaultData) {
// loger.log("_returnServerMCU->defaultData",defaultData);
return defaultData;
} else {
// loger.log("_returnServerMCU->defaultData","");
return [];
}
return [];
}
//根据user信息从配置文件中MS连接地址
getServerMsList(country, province, ctiy, isp, jsona) {
let countryData = jsona.MS[country];
//按country没有查找到就返回default
if (!countryData) {
countryData = jsona.MS.default || [];
// loger.log("_returnServerMS->countryData->default",countryData);
return countryData;
}
if (country != "中国") {
// loger.log("_returnServerMS->countryData",countryData);
return countryData;
}
//中国的需要细分
//按isp查找
let ispData = countryData.isp[isp];
//isp查找到就返回
if (ispData) {
// loger.log("_returnServerMS->ispData",ispData);
return ispData;
}
//isp没查找到,用province
let provinceData = countryData.province[province];
//用province查找到就返回
if (provinceData) {
// loger.log("_returnServerMS->provinceData",provinceData);
return provinceData;
}
//isp province都没有,使用default
let defaultData = countryData.default
if (defaultData) {
// loger.log("_returnServerMS->defaultData",defaultData);
return defaultData;
} else {
// loger.log("_returnServerMS->defaultData","");
return [];
}
return [];
}
}
export default IpManager;
... ...