/************************** 视频业务 ******************************/
function VoipCall(callid) {
this.Js_CallID = callid; //js的callid
this.Ws_CallID = ""; //ws的callid
this.CalledNum = "";
this.LocalSdp = "";
this.RemoteSdp = "";
this.Status = 0; //0-初始 1-链接中 2-响铃中 3-已接入
this.CallIn = true; //呼入
}
VoipCallList = [];
VoipMode = 0; //0-默认模式 1-无话机调度模式 2-左话机调度模式 3-左右话机调度模式
VoipLeftPhone = "";
VoipRightPhone = "";
//-1左话机 -2右话机
getDcPhoneExt = function(phone)
{
console.log("getDcPhoneExt mode:", VoipMode, "phone:", phone);
if (phone > 0)
{
return DcInfo.Number;
}
if (VoipMode == 1)
{
return DcInfo.Number;
}
else if (VoipMode == 2)
{
return VoipLeftPhone;
}
else if (VoipMode == 3 && phone == -1)
{
return VoipLeftPhone;
}
else if (VoipMode == 3 && phone == -2)
{
return VoipRightPhone;
}
else
{
return DcInfo.Number;
}
}
onWebWorkerMessage_Voip = function (parm) {
switch (parm.Msg) {
case "VoipMakeAudioCallReq":
VoipMakeAudioCall(parm);
break
case "VoipMakeVideoCallReq":
VoipMakeVideoCall(parm);
break
case "VoipHangupCallReq":
VoipHangupCall(parm);
break
case "VoipHandleIncomingCallReq":
VoipHandleIncomingCall(parm);
break
case "VoipTransferCallReq":
VoipTransferCall(parm);
break
case "VoipHoldCallReq":
VoipHoldCall(parm);
break
case "VoipDispatchInsertCallReq":
VoipDispatchInsertCall(parm);
break
case "VoipDispatchInterruptCallReq":
VoipDispatchInterruptCall(parm);
break
case "VoipDispatchBreakCallReq":
VoipDispatchBreakCall(parm);
break
case "VoipDispatchMoniterCallReq":
VoipDispatchMoniterCall(parm);
break
case "VoipDispatchCallToConferenceReq":
VoipDispatchCallToConference(parm);
break
case "VoipDispatchSubstituteCallReq":
VoipDispatchSubstituteCall(parm);
break
case "VoipDispatchSetDcPhoneReq":
VoipDispatchSetDcPhone(parm);
break
case "VoipDispatchAnswerFifoReq":
VoipDispatchAnswerFifo(parm);
break
case "VoipDispatchCallBridgeReq":
VoipDispatchCallBridge(parm);
break
case "VoipDispatchStopRingReq":
VoipDispatchStopRing(parm);
break
case "VoipLastIncomingCall":
VoipLastIncomingCall(parm);
break
case "VoipConferenceInviteReq":
VoipConferenceInviteReq(parm);
break
case "VoipMsgToMcu":
VoipMsgToMcu(parm);
break
}
}
VoipMakeAudioCall = function (parm) {
var phone = getDcPhoneExt(parm.CallID)
if (phone != DcInfo.Number)
{
//话机模式
msg = new WsBaseMsg("Voip_Dispatch_Req", 811);
msg.Set("nOperationType", 7);
msg.Set("oData", {
Phone: phone,
Target: parm.ExtNum,
});
msg.Send();
}
else
{
var call = new VoipCall(parm.CallID);
call.CalledNum = parm.ExtNum;
call.LocalSdp = parm.OfferSdp;
call.Ws_CallID = guid();
call.CallIn = false;
VoipCallList.push(call);
msg = new WsBaseMsg("Voip_Call_Req", 801);
msg.onRspFail = function (reason) {
var msgData = {
Msg: "VoipCallStatusNotify",
CallID: parm.CallID,
Status: 4,
Reason: "timeout",
};
postMessage(msgData);
}
msg.Set("nCalledType", 0);
msg.Set("cCalledUserNum", parm.ExtNum);
msg.Set("cCalledUserName", "");
msg.Set("cCallID", call.Ws_CallID);
msg.Set("cCallingUserNum", DcInfo.Number);
msg.Set("cCallingUserName", DcInfo.Name);
msg.Set("nCallingUserType", 2);
msg.Set("cSdp", parm.OfferSdp);
if (typeof SysThirdID != "undefined") {
msg.Set("cThirdID", SysThirdID);
}
msg.Send("Voip_Call_Rsp");
}
}
VoipMakeVideoCall = function (parm) {
var call = new VoipCall(parm.CallID);
call.CalledNum = parm.ExtNum;
call.LocalSdp = parm.OfferSdp;
call.Ws_CallID = guid();
call.CallIn = false;
VoipCallList.push(call);
msg = new WsBaseMsg("Voip_Call_Req", 801);
msg.onRspFail = function (reason) {
var msgData = {
Msg: "VoipCallStatusNotify",
CallID: parm.CallID,
Status: 4,
Reason: "timeout",
};
postMessage(msgData);
}
msg.Set("nCalledType", 0);
msg.Set("cCalledUserNum", parm.ExtNum);
msg.Set("cCalledUserName", "");
msg.Set("cCallID", call.Ws_CallID);
msg.Set("cCallingUserNum", DcInfo.Number);
msg.Set("cCallingUserName", DcInfo.Name);
msg.Set("nCallingUserType", 2);
msg.Set("cSdp", parm.OfferSdp);
if (typeof SysThirdID != "undefined") {
msg.Set("cThirdID", SysThirdID);
}
msg.Send("Voip_Call_Rsp");
}
VoipHangupCall = function (parm) {
var phone = getDcPhoneExt(parm.CallID)
if (phone != DcInfo.Number)
{
//话机模式
msg = new WsBaseMsg("Voip_Dispatch_Req", 811);
msg.Set("nOperationType", 8);
msg.Set("oData", {
Phone: phone,
});
msg.Send();
}
else
{
for (var i = 0; i < VoipCallList.length; i++)
{
var call = VoipCallList[i];
if (call.Js_CallID == parm.CallID)
{
if (call.Status < 3)
{
msg = new WsBaseMsg("Voip_Call_Cancel", 804);
msg.Set("cCallID", call.Ws_CallID);
msg.Send();
}
else
{
msg = new WsBaseMsg("Voip_Call_Bye_Req", 805);
msg.Set("cCallID", call.Ws_CallID);
msg.Send();
}
VoipCallList.splice(i, 1);
break;
}
}
}
}
VoipHandleIncomingCall = function (parm) {
for (var i = 0; i < VoipCallList.length; i++)
{
var call = VoipCallList[i];
if (call.Js_CallID == parm.CallID)
{
if (call.Status < 3 && call.CallIn) //推送且还未接入
{
if (parm.Handle == 1)
{
var msgData = {
Msg: "VoipCallStatusNotify",
CallID: call.Js_CallID,
Status: 1,
Reason: "trying",
};
postMessage(msgData);
call.LocalSdp = parm.AnswerSdp;
msg = new WsBaseMsg("Voip_Call_Rsp", 802);
msg.Set("cCallID", call.Ws_CallID);
msg.Set("nRetCode", 200);
msg.Set("cSdp", parm.AnswerSdp);
msg.Send();
}
else
{
msg = new WsBaseMsg("Voip_Call_Rsp", 802);
msg.Set("cCallID", call.Ws_CallID);
msg.Set("nRetCode", 486);
msg.Set("cSdp", "");
msg.Send();
VoipCallList.splice(i, 1);
}
}
break;
}
}
}
VoipTransferCall = function (parm) {
phone = getDcPhoneExt(parm.CallID)
if (phone != DcInfo.Number)
{
//话机模式
msg = new WsBaseMsg("Voip_Dispatch_Req", 811);
msg.Set("nOperationType", 10);
msg.Set("oData", {
Phone: phone,
Target: parm.ExtNum,
});
msg.Send();
}
else {
//呼叫模式
for (var i = 0; i < VoipCallList.length; i++)
{
var call = VoipCallList[i];
if (call.Js_CallID == parm.CallID)
{
if (call.Status >= 3)
{
msg = new WsBaseMsg("Voip_Dispatch_Req", 811);
msg.Set("nOperationType", 10);
msg.Set("oData", {
Phone: DcInfo.ExtNumber,
Target: parm.ExtNum,
});
msg.Send();
}
break;
}
}
}
}
VoipHoldCall = function (parm) {
phone = getDcPhoneExt(parm.CallID)
if (phone != DcInfo.Number)
{
//话机模式
msg = new WsBaseMsg("Voip_Dispatch_Req", 811);
msg.Set("nOperationType", 9);
msg.Set("oData", {
Phone: phone,
});
msg.Send();
}
else {
//呼叫模式
}
}
VoipDispatchInsertCall = function (parm) {
phone = getDcPhoneExt(parm.CallID)
if (phone != DcInfo.Number)
{
//话机模式
msg = new WsBaseMsg("Voip_Dispatch_Req", 811);
msg.Set("nOperationType", 1);
msg.Set("oData", {
Phone: phone,
Target: parm.ExtNum,
});
msg.Send();
}
else {
//呼叫模式
}
}
VoipDispatchInterruptCall = function (parm) {
msg = new WsBaseMsg("Voip_Dispatch_Req", 811);
msg.Set("nOperationType", 2);
msg.Set("oData", {
Target: parm.ExtNum,
});
msg.Send();
}
VoipDispatchBreakCall = function (parm) {
phone = getDcPhoneExt(parm.CallID)
if (phone != DcInfo.Number)
{
//话机模式
msg = new WsBaseMsg("Voip_Dispatch_Req", 811);
msg.Set("nOperationType", 6);
msg.Set("oData", {
Phone: phone,
Target: parm.ExtNum,
});
msg.Send();
}
else {
//呼叫模式
}
}
VoipDispatchMoniterCall = function (parm) {
phone = getDcPhoneExt(parm.CallID)
if (phone != DcInfo.Number)
{
//话机模式
msg = new WsBaseMsg("Voip_Dispatch_Req", 811);
msg.Set("nOperationType", 3);
msg.Set("oData", {
Phone: phone,
Target: parm.ExtNum,
});
msg.Send();
}
else {
//呼叫模式
}
}
VoipDispatchCallToConference = function (parm) {
msg = new WsBaseMsg("Voip_Dispatch_Req", 811);
msg.Set("nOperationType", 4);
msg.Set("oData", {
Target: parm.ExtNum,
ConfID: parm.ConfID,
});
msg.Send();
}
VoipDispatchSubstituteCall = function (parm) {
phone = getDcPhoneExt(parm.CallID)
if (phone != DcInfo.Number)
{
//话机模式
msg = new WsBaseMsg("Voip_Dispatch_Req", 811);
msg.Set("nOperationType", 5);
msg.Set("oData", {
Phone: phone,
Target: parm.ExtNum,
});
msg.Send();
}
else {
//呼叫模式
}
}
VoipDispatchSetDcPhone = function (parm) {
VoipLeftPhone = parm.LeftExt;
VoipRightPhone = parm.RightExt;
if (VoipLeftPhone == "" && VoipRightPhone == "")
{
VoipMode = 1;
}
else if (VoipLeftPhone != "" && VoipRightPhone == "")
{
VoipMode = 2;
}
else if (VoipLeftPhone != "" && VoipRightPhone != "")
{
VoipMode = 3;
}
if (VoipMode > 1) {
msg = new WsBaseMsg("Voip_Dispatch_Req", 811);
msg.Set("nOperationType", 15);
msg.Set("oData", {
Left: VoipLeftPhone,
Right: VoipRightPhone,
});
msg.Send();
msg = new WsBaseMsg("Voip_Dispatch_Req", 811);
msg.Set("nOperationType", 14);
msg.Set("oData", {
});
msg.Send();
}
}
VoipDispatchAnswerFifo = function (parm) {
phone = getDcPhoneExt(parm.CallID)
if (phone != DcInfo.Number)
{
//话机模式
msg = new WsBaseMsg("Voip_Dispatch_Req", 811);
msg.Set("nOperationType", 11);
msg.Set("oData", {
Phone: phone,
Target: parm.ExtNum,
});
msg.Send();
}
else {
//呼叫模式
}
}
VoipDispatchCallBridge = function (parm) {
msg = new WsBaseMsg("Voip_Dispatch_Req", 811);
msg.Set("nOperationType", 12);
msg.Set("oData", {
Target1: parm.ExtNum,
Target: parm.OtherExtNum,
});
msg.Send();
}
VoipDispatchStopRing = function (parm) {
msg = new WsBaseMsg("Voip_Dispatch_Req", 811);
msg.Set("nOperationType", 13);
msg.Set("oData", {
Phone: parm.CallID,
});
msg.Send();
}
VoipLastIncomingCall = function (parm) {
//会议来电使用
}
VoipConferenceInviteReq = function (parm) {
msg = new WsBaseMsg("Voip_Dispatch_Req", 811);
msg.Set("nOperationType", 16);
msg.Set("oData", {
ConfID: parm.ConfID,
ExtNumList: parm.ExtNumList,
});
msg.Send();
}
VoipMsgToMcu = function (parm) {
msg = new WsBaseMsg("Voip_Dispatch_Req", 811);
msg.Set("nOperationType", 17);
msg.Set("oData", parm.Data);
msg.Send();
}
VoipOffline = function()
{
for (var i = 0; i < VoipCallList.length; i++)
{
var call = VoipCallList[i];
if (call)
{
var msgData = {
Msg: "VoipCallStatusNotify",
CallID: call.Js_CallID,
Status: 3,
Reason: "server offline",
};
postMessage(msgData);
}
}
VoipCallList = []
}
VoipOnline = function()
{
}
var VoipIncomingCallID = 16560;
//——————————————————————————————————————— weboscket 接收 ———————————————————————————————————————————
onWs_Voip_Call_Req = function (data) {
//推送来电
VoipIncomingCallID++;
var call = new VoipCall(VoipIncomingCallID);
call.CalledNum = data.cCallingUserNum;
call.CalledType = data.nCallingUserType;
call.CalledName = data.cCallingUserName;
call.CallIn = true;
call.Ws_CallID = data.cCallID;
call.Status = 2;
call.RemoteSdp = data.cSdp;
call.ThirdID = data.cThirdID;
VoipCallList.push(call);
msg = new WsBaseMsg("Voip_Call_Rsp", 802);
msg.Set("cCallID", call.Ws_CallID);
msg.Set("nRetCode", 101);
msg.Set("cSdp", "");
msg.Send();
msg = new WsBaseMsg("Voip_Call_Rsp", 802);
msg.Set("cCallID", call.Ws_CallID);
msg.Set("nRetCode", 180);
msg.Set("cSdp", "");
msg.Send();
var WebrtcSdpNotify = {
Msg: "WebrtcSdpNotify",
CallID: call.Js_CallID,
WebrtcSdp: call.RemoteSdp,
CallType: 1,
};
if (call.RemoteSdp.indexOf("m=video") != -1)
{
WebrtcSdpNotify.CallType = 2;
}
postMessage(WebrtcSdpNotify);
var msgData = {
Msg: "VoipIncomingCallNotify",
CallID: call.Js_CallID,
ExtNum: call.CalledNum,
Name: call.CalledName,
ConferenceInvite: 0,
CallType: 0,
ThirdID: data.cThirdID,
};
if (call.RemoteSdp.indexOf("m=video") != -1)
{
msgData.CallType = 1;
}
if (call.CalledType == 7)
{
msgData.ConferenceInvite = 1;
}
else if (call.CalledType == 8)
{
msgData.ConferenceInvite = 1;
msgData.CallType = 1;
}
postMessage(msgData);
}
onWs_Voip_Call_Rsp = function (data) {
for (var i = 0; i < VoipCallList.length; i++)
{
var call = VoipCallList[i];
if (call.Ws_CallID == data.cCallID)
{
switch (data.nRetCode)
{
case 101:
if (call.Status == 0)
{
call.Status = 1;
var msgData = {
Msg: "VoipCallStatusNotify",
CallID: call.Js_CallID,
Status: 1,
Reason: "trying",
};
postMessage(msgData);
}
break;
case 180:
if (call.Status <= 1)
{
call.Status = 2;
var msgData = {
Msg: "VoipCallStatusNotify",
CallID: call.Js_CallID,
Status: 1,
Reason: "ringing",
};
if (data.cSdp)
{
call.RemoteSdp = data.cSdp;
var WebrtcSdpNotify = {
Msg: "WebrtcSdpNotify",
CallID: call.Js_CallID,
WebrtcSdp: call.RemoteSdp,
CallType: 1,
};
if (call.RemoteSdp.indexOf("m=video") != -1)
{
WebrtcSdpNotify.CallType = 2;
}
postMessage(WebrtcSdpNotify);
}
postMessage(msgData);
}
break;
case 200:
if (call.Status <= 2)
{
call.Status = 3;
if (call.RemoteSdp == "")
{
call.RemoteSdp = data.cSdp;
var WebrtcSdpNotify = {
Msg: "WebrtcSdpNotify",
CallID: call.Js_CallID,
WebrtcSdp: call.RemoteSdp,
CallType: 1,
};
if (call.RemoteSdp.indexOf("m=video") != -1)
{
WebrtcSdpNotify.CallType = 2;
}
postMessage(WebrtcSdpNotify);
}
var msgData = {
Msg: "VoipCallStatusNotify",
CallID: call.Js_CallID,
Status: 2,
Reason: "ok",
};
postMessage(msgData);
msg = new WsBaseMsg("Voip_Call_Ack", 803);
msg.Set("cCallID", call.Ws_CallID);
msg.Set("cSdp", "");
msg.Send();
}
break;
case 404:
var msgData = {
Msg: "VoipCallStatusNotify",
CallID: call.Js_CallID,
Status: 9,
Reason: "offline",
};
postMessage(msgData);
VoipCallList.splice(i, 1);
break;
case 408:
var msgData = {
Msg: "VoipCallStatusNotify",
CallID: call.Js_CallID,
Status: 6,
Reason: "timeout",
};
postMessage(msgData);
VoipCallList.splice(i, 1);
break;
case 486:
var msgData = {
Msg: "VoipCallStatusNotify",
CallID: call.Js_CallID,
Status: 8,
Reason: "busy",
};
postMessage(msgData);
VoipCallList.splice(i, 1);
break;
case 603:
var msgData = {
Msg: "VoipCallStatusNotify",
CallID: call.Js_CallID,
Status: 5,
Reason: "busy",
};
postMessage(msgData);
VoipCallList.splice(i, 1);
break;
default:
if (data.nRetCode >= 400)
{
var msgData = {
Msg: "VoipCallStatusNotify",
CallID: call.Js_CallID,
Status: 7,
Reason: "fail",
};
postMessage(msgData);
VoipCallList.splice(i, 1);
}
break;
}
break;
}
}
}
onWs_Voip_Call_Ack = function (data) {
for (var i = 0; i < VoipCallList.length; i++)
{
var call = VoipCallList[i];
if (call.Ws_CallID == data.cCallID)
{
if (call.Status <= 2)
{
call.Status = 3;
var msgData = {
Msg: "VoipCallStatusNotify",
CallID: call.Js_CallID,
Status: 2,
Reason: "ok",
};
postMessage(msgData);
}
}
}
}
onWs_Voip_Call_Cancel = function (data) {
for (var i = 0; i < VoipCallList.length; i++)
{
var call = VoipCallList[i];
if (call.Ws_CallID == data.cCallID)
{
if (call.Status <= 2)
{
var msgData = {
Msg: "VoipCallStatusNotify",
CallID: call.Js_CallID,
Status: 3,
Reason: "cancel",
};
postMessage(msgData);
}
VoipCallList.splice(i, 1);
break;
}
}
}
onWs_Voip_Call_Bye_Req = function (data) {
for (var i = 0; i < VoipCallList.length; i++)
{
var call = VoipCallList[i];
if (call.Ws_CallID == data.cCallID)
{
if (call.Status == 3)
{
var msgData = {
Msg: "VoipCallStatusNotify",
CallID: call.Js_CallID,
Status: 3,
Reason: "hangup",
};
postMessage(msgData);
}
VoipCallList.splice(i, 1);
break;
}
}
}
onWs_Voip_Call_Bye_Rsp = function (data) {
for (var i = 0; i < VoipCallList.length; i++)
{
var call = VoipCallList[i];
if (call.Ws_CallID == data.cCallID)
{
break;
}
}
}
onWs_Voip_Conference_Ws_Notify = function (data) {
//会议端口
var port = data.nServerPort;
var msgData = {
Msg: "ConferenceWsInviteNotify",
ConfID: 0,
Url: "ws://127.0.0.1:"+port,
};
postMessage(msgData);
}
onWs_Voip_Dispatch_Rsp = function (data) {
var msgData = {
Msg: "VoipDispatchCallRsp",
CallID: 0,
ExtNum: data.cExtNum,
Type: data.nOperationType,
Result: data.nRetCode,
};
postMessage(msgData);
}
onWs_Voip_Fifo_Notify = function (data) {
var msgData = {
Msg: "VoipDispatchFifoNotify",
ExtNum: data.ExtNum,
IsAdd: data.Add,
IsHold: data.Hold,
IsAbort: data.Abort,
};
postMessage(msgData);
}
onWs_Voip_Fifo_Refresh = function (data) {
var msgData = {
Msg: "VoipDispatchFifoRefresh",
IncomingList: data.IncomingList,
HoldList: data.HoldList,
};
postMessage(msgData);
}
onWsTextMessage_Voip = function (msg) {
switch (msg.msg) {
case "Voip_Call_Req":
onWs_Voip_Call_Req(msg.data)
break;
case "Voip_Call_Rsp":
onWs_Voip_Call_Rsp(msg.data)
break;
case "Voip_Call_Ack":
onWs_Voip_Call_Ack(msg.data)
break;
case "Voip_Call_Cancel":
onWs_Voip_Call_Cancel(msg.data)
break;
case "Voip_Call_Bye_Req":
onWs_Voip_Call_Bye_Req(msg.data)
break;
case "Voip_Call_Bye_Rsp":
onWs_Voip_Call_Bye_Rsp(msg.data)
break;
case "Voip_Conference_Ws_Notify":
onWs_Voip_Conference_Ws_Notify(msg.data);
break
case "Voip_Dispatch_Rsp":
onWs_Voip_Dispatch_Rsp(msg.data);
break
case "Voip_Fifo_Notify":
onWs_Voip_Fifo_Notify(msg.data);
break
case "Voip_Fifo_Refresh":
onWs_Voip_Fifo_Refresh(msg.data);
break
}
}