【发布时间】:2018-02-13 15:41:00
【问题描述】:
我已经能够创建一个应用程序,该应用程序 (ab) 使用 TAPI3Lib 并了解来电,将它们置于保持状态,拨打内部号码,将保持状态的线路连接到目标号码。
下面是获取来电号码的代码
private void tapi_ITTAPIEventNotification_Event_Event(TAPI3Lib.TAPI_EVENT TapiEvent, object pEvent)
{
try
{
switch (TapiEvent)
{
case TAPI3Lib.TAPI_EVENT.TE_CALLNOTIFICATION:
TAPI3Lib.ITCallNotificationEvent cln = pEvent as TAPI3Lib.ITCallNotificationEvent;
if (cln.Call.CallState == TAPI3Lib.CALL_STATE.CS_OFFERING)
{
string c = cln.Call.get_CallInfoString(TAPI3Lib.CALLINFO_STRING.CIS_CALLERIDNUMBER);
string target = cln.Call.Address.DialableAddress;
.
.
.
在这里,我对数据库运行 MSSQL 查询,以确定谁是号码的所有者。我在屏幕上显示一个表格,显示正在呼叫的潜在用户。表单上的按钮可让您拨打内部号码(此操作会自动添加当前线路保持状态。
IEnumCall ec = ia[line].EnumerateCalls();
uint arg = 0;
ITCallInfo ici;
try
{
ec.Next(1, out ici, ref arg);
ITBasicCallControl bc = (ITBasicCallControl)ici;
bc.Hold(true);
}
catch (Exception exp)
{
System.Windows.Forms.MessageBox.Show("May not have any call to put on hold!\n\n" + exp.ToString(), "TAPI3");
}
IEnumCall ec1 = ia[line].EnumerateCalls();
uint arg1 = 0;
ITCallInfo ici1;
try
{
ec1.Next(1, out ici1, ref arg1);
ITBasicCallControl bc1 = ia[line].CreateCall("107",TapiConstants.LINEADDRESSTYPE_IPADDRESS, TapiConstants.TAPIMEDIATYPE_AUDIO);
bc1.Connect(false);
}
catch (Exception exp)
{
System.Windows.Forms.MessageBox.Show("Target looks unreachable!\n\n" + exp.ToString(), "TAPI3");
}
这部分连接当前活动线路和保持线路;
ITBasicCallControl callOnHold = null;
ITBasicCallControl callConnected = null;
IEnumCall enumCall = ia[line].EnumerateCalls();
ITCallInfo callInfo;
uint dummy = 0;
while (true)
{
enumCall.Next(1, out callInfo, ref dummy);
if (callInfo == null)
return;
if (callInfo.CallState == CALL_STATE.CS_HOLD)
callOnHold = (ITBasicCallControl)callInfo;
else if (callInfo.CallState == CALL_STATE.CS_CONNECTED)
callConnected = (ITBasicCallControl)callInfo;
if (callOnHold != null && callConnected != null)
break;
}
callOnHold.Transfer(callConnected, true);
callConnected.Finish(FINISH_MODE.FM_ASTRANSFER);
启蒙如下;
ITAddress[] ia = new TAPI3Lib.ITAddress[10];
...
try
{
tobj = new TAPIClass();
tobj.Initialize();
IEnumAddress ea = tobj.EnumerateAddresses();
ITAddress ln;
uint arg3 = 0;
lines = 0;
cn = new callnotification();
tobj.ITTAPIEventNotification_Event_Event += new TAPI3Lib.ITTAPIEventNotification_EventEventHandler(cn.Event);
tobj.EventFilter = (int)(TAPI_EVENT.TE_CALLNOTIFICATION |
TAPI_EVENT.TE_DIGITEVENT |
TAPI_EVENT.TE_PHONEEVENT |
TAPI_EVENT.TE_CALLSTATE |
TAPI_EVENT.TE_GENERATEEVENT |
TAPI_EVENT.TE_GATHERDIGITS |
TAPI_EVENT.TE_REQUEST);
for (int i = 0; i < 10; i++)
{
ea.Next(1, out ln, ref arg3);
ia[i] = ln;
if (ln != null)
{
lines++;
}
else
break;
}
}
catch (Exception e)
{
System.Windows.Forms.MessageBox.Show(e.ToString());
}
--场景
CallA:来电
CallB:内部调用
接线员:主要接听接线员
Bob:此应用程序的用户
Alice:CallA的调用者
Bob 用他的手机拨打 Alice 的呼叫中心。 接线员看到一个包含Bob的姓名和号码的弹出屏幕,然后拿起电话。 (CallA 已存储)。 Bob 请求与 Alice 交谈。 接线员点击屏幕上的“Alice”(CallA现在处于保持状态,接线员的电话创建 CallB,它会拨打 Alice 的电话)。 Alice 接听电话并同意接听电话。 接线员点击屏幕上的“转接”,CallA和CallB连接。
--场景结束
--预期结果
当 Operator 呼叫 Alice 时,事件会看到 100 呼叫 107(其中 100 是 Operator 在 PBX 上的地址, 107 Alice的。当Operator连接两个通话时,我希望能够弹出与Operator相同的屏幕其中包括已连接呼叫者的信息。为了触发该事件,我错过了什么?因为当我尝试检查 cln.Call.get_CallInfoString(TAPI3Lib.CALLINFO_STRING.CIS_CALLERIDNUMBER) 时,我看到的只是 100,即调用 的 Operator >爱丽丝,这是正确的。我需要做什么检查才能确定呼叫已被转移→获取来电显示→弹出屏幕
--预期结果结束
我希望我能够按照我的想法描述它。感谢您抽出宝贵时间,请原谅我的冗长帖子。
【问题讨论】: