首頁>>廠商>>CT中間件廠商>>朗深技術(shù)

UniMedia 6S級(jí)電話語音中間件典型應(yīng)用-電話QQ [附源碼]

2009/05/11

1.應(yīng)用場景
  電信增值應(yīng)用。客戶打電話進(jìn)入系統(tǒng),按鍵選擇聊天室,或者自動(dòng)查找匹配的用戶,進(jìn)行一對(duì)一的聊天。

2.源碼片段

  假定呼入電話,聽到提示音,按鍵為1的為等待聊天用戶,電話呼入按鍵為2的為主動(dòng)尋找等待聊天的用戶

//全局變量定義

SCPMANAGER g_SCPManager
CALL g_TheCall
int g_iTaskID

sub main(LIST& cpl)
{
int iCallID, iRet

//注冊系統(tǒng)錯(cuò)誤處理函數(shù)
EventMap(INF_SYS_ERROR, OnSysError, 0)
//注冊掛機(jī)通知處理函數(shù)
EventMap(INF_CTI_ONHOOK, OnCallEndInform, 0)
//注冊被路由通知處理函數(shù)
EventMap(INF_CTI_ROUTED, OnRoutedInform, 0)
//注冊取消路由通知處理函數(shù)
EventMap(INF_CTI_UNROUTED, OnUnroutedInform, 0)
//注冊異步結(jié)束通知處理函數(shù)
EventMap(INF_SYS_ASYNCFINISHED, OnAsyncFinishedInform, 0)

//在BOOT進(jìn)程啟動(dòng)該進(jìn)程時(shí),參數(shù)是按照CALLID、ANO、BNO,UUD順序先后存放在參數(shù)列表cpl中
//根據(jù)業(yè)務(wù)需要取出參數(shù)值

//獲得命令行參數(shù)的callid
cpl.GetItem(0, iCallID, iRet)
Log(DBG, "Call Income: CallID=", iCallID)

//根據(jù)對(duì)象ID獲得當(dāng)前Call對(duì)象
g_SCPManager.FindCallByID(iCallID, g_TheCall, iRet)
//設(shè)置Call對(duì)象的業(yè)務(wù)處理進(jìn)程ID為當(dāng)前進(jìn)程
g_TheCall.AttachCurrentProcess(iRet)
//應(yīng)答CALL
g_TheCall.Answer(iRet)


//來話聊天業(yè)務(wù)處理過程:
//來話應(yīng)答成功后,首先進(jìn)行放音收碼,在分析用戶的按鍵
// 如果用戶按鍵為"1",則假定用戶為等候交談的客戶,設(shè)置業(yè)務(wù)參數(shù)名值對(duì)為("Number"、"Waiting"),用戶聽音樂等待其它用戶的交談申請(qǐng)
// 如果用戶按鍵為"2",則假定用戶為主動(dòng)尋找交談的客戶,則從業(yè)務(wù)參數(shù)名值對(duì)為("Number"、"Waiting")的等待用戶中查找一個(gè)進(jìn)行交談,并把等待呼叫的名值對(duì)該為("Number"、"Connecting")
// 如果用戶按鍵為其它,則在循環(huán)播放收碼
while(true)
{
//同步循環(huán)放音收碼
string sDigits,sTermChar
g_TheCall.PlayReceiveDTMF(true, "welcome.vox", 1, "*", sTermChar, sDigits, -1, iRet)

switch(sDigits)
{
case("1")
//等待被連接
Log(DBG, "Playing wait music to Income Call(", iCallID, ").")
g_TheCall.Play(true, true, "musichold.vox", g_iTaskID, iRet)
//設(shè)置呼叫對(duì)象的業(yè)務(wù)名值對(duì)
g_TheCall.SetParam("Number", sDigits, iRet)
//注冊被連接事件函數(shù)
EventMap(INF_CTI_ROUTED, OnRoutedInform, 1)

//無限等待(直到用戶主動(dòng)掛機(jī))
Wait(-1)
break

case("2")
//設(shè)置呼叫對(duì)象為查找用戶的標(biāo)志
g_TheCall.SetParam("Number", sDigits, iRet)
//查找空閑等候用戶,主動(dòng)進(jìn)行連接
Log(DBG, "Matching user(", iCallID, ")...")

//查找交談對(duì)象并進(jìn)行連接操作,實(shí)現(xiàn)通話交流
MatchWaitingUser(g_TheCall)

//無限等待(直到用戶主動(dòng)掛機(jī))
Wait(-1)
break

default
Log(DBG, "用戶按鍵其它碼,需重新收碼,Digits=", sDigits)
break
}//end of Switch
}// end of While

Log(DBG, "Finished. Bye.")
}

//查找函數(shù)的業(yè)務(wù)處理過程:
//首先給主動(dòng)查找用戶播放等待提示語音
//然后根據(jù)呼叫對(duì)象的名值對(duì)從全局呼叫對(duì)象實(shí)例管理器中查找等待呼叫
//如果成功找到,則停止當(dāng)前呼叫的提示語音,主動(dòng)進(jìn)行連接通話操作
//如果沒有找到,則等待1秒鐘在循環(huán)查找
sub MatchWaitingUser(CALL& call)
{
int iRet,iTaskID

//異步循環(huán)放音
call.Play(true, true, "waiting.vox", iTaskID, iRet)


while(true)
{
CALL callWait
//根據(jù)名值對(duì)查找等待呼叫對(duì)象
g_SCPManager.FindCallByParam("Number", "1", callWait, iRet)
if (iRet == RET_SUCC)
{
//重新設(shè)置等待連接呼叫的名值對(duì)
callWait.SetParam("Number","Connecting",iRet)

//找到等待用戶,停止當(dāng)前呼叫的語音提示
call.StopOP(iTaskID, iRet)

//主動(dòng)連接兩個(gè)CALL
call.ConnectCall(callWait, iRet)
break
}
else
{
//沒有找到,1000毫秒后繼續(xù)尋找
Wait(1000)
}
}//end of while
}

//Chat工程中所有事件處理函數(shù)實(shí)現(xiàn)

//錯(cuò)誤處理函數(shù)
sub OnSysError(int tag)
{
Log(ERR, "System error: ", __LASTERRSTR__)
}

//掛機(jī)通知處理函數(shù)
sub OnCallEndInform(int tag, CALL& call)
{
Log(INF, "OnHooked. CallID=", call.CallID)
Log(INF, "Exit...")
Exit("掛機(jī)退出")
}

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

int iRet
string paraValue
//在連接前已經(jīng)把等待呼叫的名值對(duì)的值由1改為Connecting
call1.GetParam("Number", paraValue, iRet)
if (paraValue == "Connecting")
{
//call1如果是被連接的等待用戶,需要停止它已經(jīng)在播放的等候音樂
call1.StopOP(g_iTaskID, iRet)
}
}

//取消路由通知處理函數(shù)
sub OnUnroutedInform(int tag, CALL& call1, CALL& call2)
{
Log(INF, "Unrouted. CallID1=", call1.CallID, " CallID2=", call2.CallID)
}

//異步結(jié)束通知處理函數(shù)
sub OnAsyncFinishedInform(int tag, CALL& call, int optype, int taskid, int ret)
{
if (ret == RET_SUCC)
{
Log(INF, "異步結(jié)束OK. CallID=", call.CallID, " optype=", optype, " taskid=", taskid)
}
else
{
Log(INF, "異步結(jié)束FAIL. CallID=", call.CallID, " optype=", optype, " taskid=", taskid)
}
}

CTI論壇報(bào)道


相關(guān)鏈接:
UniMedia 6S級(jí)電話語音中間件典型應(yīng)用-B/S呼叫中心 2009-05-11
UniMedia 6S級(jí)電話語音中間件典型應(yīng)用-企話通 2009-05-08
UniMedia 6S級(jí)電話語音中間件典型應(yīng)用-C/S呼叫中心 2009-05-07
朗深技術(shù) UniMedia——6S級(jí)電話語音中間件 2009-05-06
辉县市| 应用必备| 和田市| 措勤县| 卓尼县| 青龙| 定州市| 金寨县| 东乌珠穆沁旗| 东阿县| 乐都县| 东丰县| 大同县| 海城市| 电白县| 边坝县| 连江县| 昆明市| 台前县| 乐亭县| 兴文县| 金乡县| 泾源县| 剑川县| 山阴县| 江安县| 辛集市| 巨野县| 东源县| 建湖县| 瓮安县| 台前县| 平远县| 东丽区| 鹿邑县| 芦溪县| 监利县| 永吉县| 大新县| 治多县| 龙川县|