技术 - 呼叫中心 - 中间件技术频道
  首页 > 技术 > 呼叫中心 > 技术 > 中间件 > 解决方案 > UniMedia 6S级电话语音中间件典型应用-多机同振 [附源码]

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

2009-05-15 00:00:00   作者:   来源:   评论:0  点击:


2009/05/15

1.应用场景
  假定发起呼叫的内线分机为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论坛报道

相关阅读:

分享到: 收藏

推荐阅读

专题