首页>>厂商>>CT中间件厂商>>朗深技术

UniMedia 6S级电话语音中间件典型应用-多机同振 [附源码]

2009/05/15

1.应用场景

  用户有多个号码,在拨其中一个号码时,另一个号码同时振铃,并且接通一个后,另一个停止振铃。

2.源码片段
  假定发起呼叫的内线分机为1000,同时响铃的分机为1001,1002,具体代码
//////////////////////////////////////////////////////////////////
CALL callOriginal
CALL callFst
CALL callSnd
//全局变量声明
SCPMANAGER g_SCPManager

//进程主函数
sub main(LIST& cpl)
{
int iCallID, iTaskID, iRet
string sBno1,sBno2

//注册系统错误事件处理函数
EventMap(INF_SYS_ERROR, OnSysError, 0)
//注册CALL挂机事件处理函数
EventMap(INF_CTI_ONHOOK, OnCallEndInform, 0)
//注册异步结束事件处理函数
EventMap(INF_SYS_ASYNCFINISHED, OnAsyncFinished, 0)
//注册CALL连接事件处理函数
EventMap(INF_CTI_ROUTED, OnRoutedInform, 0)


//获取进程命令行参数中的CallID
cpl.GetItem(0, iCallID, iRet)

Log(DBG, "Call Income: CallID=", iCallID)

//根据对象ID获得当前Call对象
g_SCPManager.FindCallByID(iCallID, callOriginal, iRet)
//设置Call对象的业务处理进程ID为当前进程
callOriginal.AttachCurrentProcess(iRet)
//应答CALL
callOriginal.Answer(iRet)

//给主叫放等待音乐
callOriginal.Play(true,true,"musichold.vox",iTaskID,iRet)

Log(DBG,"给主叫播放等待音乐成功,TASKID=",iTaskID)

//根据业务需求确定多个被叫号码
sBno1 = "1001"
sBno2 = "1002"


int iMakeTaskID1,iMakeTaskID2
//发起两次呼叫
g_SCPManager.MakeCall("",sBno1,-1,true,callFst,iMakeTaskID1,iRet)
if (iRet == RET_FAIL)
{
Log(DBG,"呼出失败,Bno=",sBno1, "; error:",__LASTERRSTR__)
callOriginal.OnHook(iRet)
Exit("Make Call Fail")
}
else
{
//设置Call对象的业务处理进程ID为当前进程
callFst.AttachCurrentProcess(iRet)
Log(DBG,"正在呼出,Bno=",sBno1, "; CallID=",callFst.CallID)
}

g_SCPManager.MakeCall("",sBno2,-1,true,callSnd,iMakeTaskID2,iRet)
if (iRet == RET_FAIL)
{
Log(DBG,"呼出失败,Bno=",sBno2, "; error:",__LASTERRSTR__)
callFst.OnHook(iRet)
callOriginal.OnHook(iRet)
Exit("Make Call Fail")
}
else
{
//设置Call对象的业务处理进程ID为当前进程
callSnd.AttachCurrentProcess(iRet)
Log(DBG,"正在呼出,Bno=",sBno2, "; CallID=",callSnd.CallID)
}

Log(DBG,"等待主叫用户挂机...")
//等待用户挂机事件
Wait(-1)
}

//挂机通知处理函数,只有主叫挂机才结束脚本线程
sub OnCallEndInform(int tag, CALL& call)
{
Log(INF, "OnHooked. CallID=", call.CallID)
if (call.CallID == callOriginal.CallID)
{
Log(INF,"因主叫用户挂机,准备结束脚本线程...")
//增加下面三行就可以了
int ret
callFst.StopOP(-1,ret)
callSnd.StopOP(-1,ret)
Exit("callOriginal onhook")
}
}

//错误处理函数
sub OnSysError(int tag)
{
Log(ERR, "System error: ", __LASTERRSTR__)
}

//异步结束事件
sub OnAsyncFinished(int tag, CALL& call, int optype, int taskid, int ret)
{
int iRet

if (ret == RET_SUCC)
{
Log(INF, "异步结束OK. CallID=", call.CallID, " optype=", optype, " taskid=", taskid)
//如果是MAKE CALL成功异步事件需要进行连接处理
if (optype == 8)
{
//停止主叫等待音乐
callOriginal.StopOP(-1,iRet)
//连接主叫和先摘机的被叫
callOriginal.ConnectCall(call,iRet)

//停止还没有摘机的呼叫
if (call.CallID == callFst.CallID)
{

callSnd.StopOP(-1,iRet)
}
elseif(call.CallID == callSnd.CallID)
{
callFst.StopOP(-1,iRet)
}
}//make call 异步结束
}
else
{
Log(INF, "异步结束FAIL. CallID=", call.CallID, " optype=", optype, " taskid=", taskid)
}
}

//被路由通知处理函数
sub OnRoutedInform(int tag, CALL& call1, CALL& call2)
{
Log(INF, "Routed. CallID1=", call1.CallID, " CallID2=", call2.CallID)

CTI论坛报道


相关链接:
UniMedia 6S级电话语音中间件应用-自动人工互转 2009-05-15
UniMedia 6S级电话语音中间件典型应用-J2EE呼叫中心 2009-05-13
UniMedia 6S级电话语音中间件典型应用-电话QQ 2009-05-12
UniMedia 6S级电话语音中间件典型应用-B/S呼叫中心 2009-05-11
UniMedia 6S级电话语音中间件典型应用-企话通 2009-05-08