I,U系列的语音卡一般采用轮寻方式编程,通过一个线程,循环的判断通道状态,根据状态返回值来跳转状态。
对外线的操作要比内线复杂,因为内线接着外面的电话机,基本上就是检测摘挂机,最多就是录放音操作了。
编程流程(之前请先明确您的需求和电话流程):
外线的一般流程:
呼入--收主叫,导航音,根据按键转分机,0转人工查询电话
初始状态(我们的范例中是WS/CS_HANGUP):
判断TV_RingDetect(int)返回值是否>0
是:需要收主叫的,若主叫是DTMF格式,现在收主叫,如果FSK格式,那就等振铃>=2收;
收主叫号码后,TV_OffHookCtrl摘机,TV_StartPlayFile放音;跳转状态;
状态2: TV_PlayFileRest判断放音是否结束;
TV_GetDTMFChar收取按键码;
如果收到按键码,先TV_StopPlayFile,if 按键码是''0'',if 人工空闲(可用标志性变量判断,或直接判断此内线是否挂机状态),给指定人工查询的内线振铃,最好有个变量用来标志,转状态4;
如果按键码非‘0’,那就停止放音先,然后转到状态3;
状态3:收按键码,追加到已经收取的DTMF串后,然后判断位数是否够分机号码长度,如果够,给对应这个号码的分机振铃,同时,同状态2中转人工处理一样,去检测分机状态,转状态4;
状态4:如果分机/人工摘机,TV_ConnectChannels,内外线通道双向连接,就可以通话了,转状态5;
状态5 :判断内线是否挂机或者外线是否忙音个数〉=3,对外线进行挂机,挂机时记得TV_DisConnect,还有一些状态的复位
其中对内线的操作,可以在内线检测流程中加以控制,也可以写在一起。
外线呼出流程
首先想象一下我们使用电话呼出的过程:
1. 摘起电话;如果没有任何动静,或者根本不是拨号音(嘟……一直保持),那就是电信交换机或者线路故障了,如果正常,那我们就开始按键拨号;
2. 拨号后,过上几秒钟,如果占线,会听到“嘟-嘟-”的忙音,或者正忙的提示音;若是空闲,能够听到“嘟----嘟----”的声音,或者彩铃,我们称之为回铃音;
3. 如果对方没有占线,但是在很长时间没有接听,一般大概1分钟吧,这时能听到“嘟-嘟-”的忙音,或者提示无人接听;
4. 现在已经开始通话了,说完ByeBye之后,被叫挂电话了,这时又会听到“嘟-嘟-”的忙音。
用语音卡外线呼出的流程与上面的类似:
1. 控制外线摘机TV_OffHookCtrl,然后起一个2--5秒的定时器TV_StartTimer,具体时间根据交换机发过来拨号音的速度设置;然后,转入步骤2;
2. 在这个定时器时间内,循环的TV_CheckSignal,看是否是拨号音,如果是,立即拨号,TV_StartDial,进入步骤3;如果你不想检测信号音拨号,先确保线路正常,接着在摘机后停留1-2S后,直接TV_StartDial也可以,然后进入步骤3;
3. 循环判断拨号是否完毕,看TV_DialRest是否=0;如果拨号完毕,TV_StartMonitor开始检测对方是否摘机;如果用普通电信线拨联通手机,可能交换机通信会比较慢,建议在此加一个2--6S的定时器,待TV_TimerElapsed<0/==-1,再TV_StartMonitor;进入步骤4;
4. TV_MonitorOffHook判断对方是否摘机;返回值〉0就是摘机(彩铃除外);如果线路是极性反转线路(彩铃情况下判断摘机),请调用TV_ListenOffHook判断。如果摘机,进入状态5;
5. 双方通话过程,期间要循环检测线路上的忙音,来判断对方是否挂机。一般忙音要至少3个以上,识别为挂机。人与人之间可以通过语言来提示一下挂机,能听到对方挂机时电话的响声,但是语音卡毕竟不是人脑,它不能与被叫的人之间进行ByeBye的沟通,只能靠交换机给它的忙音来判断。如果已经确认对方挂机,那么,我们也挂掉电话,TV_HangUpCtrl。挂机后最好停留0.5-2S再开始下一个呼叫,下一个呼叫依然是1--5不断循环。
在循环外呼的时候,不少开发人员省略了1步骤后的定时器操作,他们的步骤:摘机--呼出……-挂机--摘机--呼出--;在实际生活中,我们可以自己尝试一下,通话中,挂掉听筒,然后迅速拿起,时间很短的情况下,可能通话还可以继续。呵呵,交换机也需要反应时间。所以,建议在摘机后,还有挂机后,都停留0.5--2秒的时间,给交换机和语音卡一个休息时间,就像我们不可能在放下水杯的同时,刚端过水的手就能摸到键盘是一样的。
浙公网安备 33010602011771号