如何检测对方挂机(Dialogic 4)急!急!急!(100分)

  • 主题发起人 主题发起人 枫之叶
  • 开始时间 开始时间

枫之叶

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大侠:
我在用Dialogic d/4语音卡开发的时候,遇到一个问题:
当对方拨号进入语音卡,然后挂机,这时如何能马上检测对方挂机信号?
请各位大侠帮帮忙!
 
首先声明我不懂这个。出出主意。
应答时是自动的还是检查信号的。
连接和断开的信号或状态应该不一样的。
 
可以通过TDX_CST事件中DE_SILON,DE_SILOF判断
用DX_CHGFREQ,DX_CHGDUR,DX_CHGREPCNT设置DefaultTones后效果还是不错的,
拨入拨出的挂机都可以判断出来。
 
比较简单,同意楼上的,我原来作过一个类似程序。
 
我使用其他公司的设备开发过类似程序,其实无论哪家公司的产品,
一样有此问题。只要使用模拟线路,检测忙音是不准确的,解决办法
是使用数字线路,但数字线路往往不能申请到双向的。
 
看你的电话线路是否支持反极信号,获都说是否有挂机信号送出,如没有找电信局,
要看电信局给不给面子或看钱子了.
 
:powerjet
还是不行,检测不到,不知是不是我使用不正确,能否发个Demo给我。
:lixijie
我使用的是模拟交换机,不知你是用什么解决的。
 
DE_SILON:begin
if (cstp^.cst_data = PSTNHOOK1) then
Inc(HookCount) else
HookCount:=0;
TryChannel;
end;
 
:powerjet
不行,因为当用户挂机时,Dialogic卡好像没有响应,所以你的判断代码根本就不会执行。
 
你要扑获事件。
那我就不懂你是如何判断电话打进来,自动应答?道理是一样的
 
:powerjet
没错,是通过捕获事件,但关键是当用户挂机时并没有激活任何事件。
 
:powerjet
用户挂机并不会激活TDX_CST事件
 
SetEvtMsk(DM_SILON or DM_SILOF);
 
仔细看看api我没有文档呀
 
to:枫之叶
D/4 检测一般忙音(单频/双频方波)准确率还是很高的。首先需要检测忙音的参数,
可以用PBXpert工具分析得到各种参数如频率,峰值长度,偏差,谷值长度,偏差等等。
然后在dx_open后1、调用dx_deltones清除tone 2、调用dx_blddtcad构建忙音tone 3、
调用dx_addtone添加忙音tone。4、调用dx_distone 禁止 DM_TONEOFF
然后在放音、录音、收键等操作中检测cst_event 是否等于DE_TONEON,并判断cst_data
是否为你用dx_blddtcad构建的信号音ID。你可以自己计数。
(技术支持没有免费的啊!^^ ~《》@#¥¥¥¥¥¥)
 
powerjet:
我用你的办法测试一下,还是没法精确的测试用户挂机信号,可能是我的方法不正确,你
能否给我发个Demo程序,Email:w_h_z98@163.com,谢谢!
 
to:枫之叶
对于模拟线路,假如电信局极性翻转业务则可以检测到,假如没有,那就只有靠检测
忙音了,在大城市忙音比较准确,一般可以在挂机后2秒内检测到,但是有些地方电信局
设备陈旧,忙音不准确,那就没有办法了,我现在做的程序这几个方面均在考虑,对于忙
音不准确的,我还没有最后定怎么做,但思路是通过可以准确检测的信号,判断变化,准确
信号可以自己制造出来。假如你只是想解决对方拨号过来再挂机这种情况,我想不必太在意,
您设置好没个流程的最长时间,假如超时,就挂断,这种方法在以前一些证券公司采用过。
其实这个问题在需要自动拨号出去时最需要解决。
 
to lixijie:
我原先也是设置最大操作时间,但总感觉不是很完善。
to hotplum:
谢谢你提供的方法,我正在调试,你能否提供一个Demo程序,如果分不够,我可以再加。
 
to:枫之叶
好久没做dialogic系统。我把前年做过的Dialogic系统程序的几个函数帖上来给你看看
参考一下:
/*****************************************************
BOOL hk_detectsignal(DX_CST* cstp,UINT sigs,int sigcount);
测信号音
cstp CST事件
sigs 信号音(可以是多种信号音)
sigcount 信号音个数
返回 TRUE //测到
*****************************************************/
BOOL CChannel::hk_detectsignal(DX_CST* cstp,UINT sigs,int sigcount)
{
int tonetype,tonecount;
char linemsg[256];
if (cstp->cst_event!= DE_TONEON) return (FALSE);
tonetype=cstp->cst_data;
switch (tonetype)
{
case TID_DIAL_LCL:
fsigcount[0]++;
sprintf(linemsg,"通道%02d %s %d次",m_channelno,Dxxxboard.DefaultTones[0].str,fsigcount[0]);
break;
case TID_DIAL_INTL:
fsigcount[1]++;
sprintf(linemsg,"通道%02d %s %d次",m_channelno,Dxxxboard.DefaultTones[1].str,fsigcount[1]);
break;
case TID_DIAL_XTRA:
fsigcount[2]++;
sprintf(linemsg,"通道%02d %s %d次",m_channelno,Dxxxboard.DefaultTones[2].str,fsigcount[2]);
break;
case TID_BUSY1:
fsigcount[3]++;
sprintf(linemsg,"通道%02d %s %d次",m_channelno,Dxxxboard.DefaultTones[3].str,fsigcount[3]);
break;
case TID_BUSY2:
fsigcount[4]++;
sprintf(linemsg,"通道%02d %s %d次",m_channelno,Dxxxboard.DefaultTones[4].str,fsigcount[4]);
break;
case TID_RNGBK1:
fsigcount[5]++;
sprintf(linemsg,"通道%02d %s %d次",m_channelno,Dxxxboard.DefaultTones[5].str,fsigcount[5]);
break;
case TID_RNGBK2:
fsigcount[6]++;
sprintf(linemsg,"通道%02d %s %d次",m_channelno,Dxxxboard.DefaultTones[6].str,fsigcount[6]);
break;
case TID_FAX1:
fsigcount[7]++;
sprintf(linemsg,"通道%02d %s %d次",m_channelno,Dxxxboard.DefaultTones[7].str,fsigcount[7]);
break;
case TID_FAX2:
fsigcount[8]++;
sprintf(linemsg,"通道%02d %s %d次",m_channelno,Dxxxboard.DefaultTones[8].str,fsigcount[8]);
break;
}
Dxxxboard.hk_listmsg(linemsg);
tonecount=0;
if ((sigs&Dxxxconst.DIAL_LCL)==Dxxxconst.DIAL_LCL)
{
tonecount=tonecount+fsigcount[0];
}
if ((sigs&Dxxxconst.DIAL_INTL)==Dxxxconst.DIAL_INTL)
{
tonecount=tonecount+fsigcount[1];
}
if ((sigs&Dxxxconst.DIAL_XTRA)==Dxxxconst.DIAL_XTRA)
{
tonecount=tonecount+fsigcount[2];
}
if ((sigs&Dxxxconst.BUSY1)==Dxxxconst.BUSY1)
{
tonecount=tonecount+fsigcount[3];
}
if ((sigs&Dxxxconst.BUSY2)==Dxxxconst.BUSY2)
{
tonecount=tonecount+fsigcount[4];
}
if ((sigs&Dxxxconst.RNGBK1)==Dxxxconst.RNGBK1)
{
tonecount=tonecount+fsigcount[5];
}
if ((sigs&Dxxxconst.RNGBK2)==Dxxxconst.RNGBK2)
{
tonecount=tonecount+fsigcount[6];
}
if ((sigs&Dxxxconst.FAX1)==Dxxxconst.FAX1)
{
tonecount=tonecount+fsigcount[7];
}
if ((sigs&Dxxxconst.FAX2)==Dxxxconst.FAX2)
{
tonecount=tonecount+fsigcount[8];
}
if (tonecount>=sigcount)
{
return(TRUE);
}
return (FALSE);
}
/*****************************************************
int hk_setsignal();
设置信号音
返回 >0 设置成功
*****************************************************/
int CChannel::hk_setsignal()
{
if (dx_deltones(m_voxdev) == -1)
{
return(-1);
}
for (int index (0);
index < MAX_TONES;
index++)
{
if (dx_blddtcad(Tone_T[index].tid,
Tone_T[index].freq1,
Tone_T[index].deviation1,
Tone_T[index].freq2,
Tone_T[index].deviation2,
Tone_T[index].ontime,
Tone_T[index].ondeviation,
Tone_T[index].offtime,
Tone_T[index].offdeviation,
Tone_T[index].repcnt)== -1)
{
return(-1);
}
if (dx_addtone(m_voxdev,(unsigned char)NULL,0) == -1)
{
return(-1);
}
if (dx_distone(m_voxdev,Tone_T[index].tid,DM_TONEOFF) == -1)
{
return(-1);
}
}
return(1);
}
 
后退
顶部