/************************** 视频业务 ******************************/ 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 } }