第一天
上午接到一个需求,询问现在我们的电话系统是否能做个呼叫转接。然后在网上搜了一下,发现有路子可走,所以简单试了一下,还真是可以。
首先,需求是什么?
客户拨通了400电话到我们的asterisk电话系统,比如说接通了坐席A;然后A需要在不挂断的情况下转拨给另外一个电话或者手机B。
实现:
找到http://www.asterisk-help.com/read.php?tid-191-page-1.html这篇文章说明了,配置features.conf
blindxfer=# ;转接开始的前缀
transferdigittimeout => 30
xfersound = beep
xferfailsound = beeperr
featuredigittimeout = 1000
atxfernoanswertimeout = 15
atxferdropcall = no
atxferloopdelay = 10
txfercallbackretries = 2
其中blindxfer 参数,默认是#1 ,按注释意思是按了#后开始拨号码。但是我改成了#,因为我不知道那个1是什么意思;
transferdigittimeout 参数,默认是3秒,刚开始以为是拨号的时间(英文不好)测试后发现其实是你按#后,到你拨第一个号码按键的时间。所以,你要转接的话,你得先查下号码是多少,然后再按#,接着开始拨号;
其他的参数默认的,也没仔细看,目前;
配置完features.conf后,你还需在你的拨号语法文件extensions.conf中配置:
比如exten => _x.,1,Dial(DAHDI/G0/${EXTEN},30,t), 注意加了t参数,t的意思是允许被叫用户按前面设置的#转接;相应的T是允许主叫用户按#转接。
这样就可以呼叫转接了,但是接着还有个问题:
比如我在按#后,转接输入号码,假如号码输错了,这时候该怎么办呢,难道是挂断?这个我还没解决测试,或许能够再按一下#,来重新输入。
第二天
在看http://www.voip-info.org/wiki/index.php?page=Asterisk+config+features.conf文档中,发现了另外一种转接的方式atxfer
之前在features.conf使用的是blindxfer ,也就是无人管理的转接,而且配置文件说明的也不详细。
现在的atxfer方式,据文档上的说明:
比如用户A打给坐席B,然后B需要转给分机C,B会先和C接通(blindxfer是接通后就自动断掉),然后B可以挂掉(挂掉后A与C将连通)或者按*(默认)返回到A与B的通话中。
这个方式或许可以解决掉输错号码的问题,也就是输错号码后,按*回到A与B通话中,然后再来一遍转接。
不过这些都还只是假想,还需要验证一下,傍晚试一下
第三天
了一下blindxfer 和atxfer 模式,发现:
atxfer确实和文档上说的一样,但是貌似这两种模式是共存的,就是说,就算你在features.conf把blindxfer注释掉,但其实还是有用。
这可以从CLI中输入features show(asterisk1.8+)或者show features看到你绑定的按键,所以为了防止混乱,干脆我就把blindxfer设为了##,atxfer设为了#,disconnect为*。
但是又出现了一个问题:
转接成功后,用户与被转接的座机连上了,也能通话了,但是他们挂断之后,有时候却会出现所有电话出不去,外线也进不来的情况
我的流程日志是这样的:(其中DAHDI/1234为 from-pstn外线)
首先是from-pstn DAHDI/3 外线打进来,进队列,然后DAHDI/8响应
-- Executing [s@from-pstn:4] Queue("DAHDI/3-1", "1000,t,,,15") in new stack
-- Started music on hold, class 'default', on DAHDI/3-1
-- Executing [4008@from-internal:1] Dial("Local/4008@from-internal-00000000;2", "DAHDI/8") in new stack
-- Called DAHDI/8
-- DAHDI/8-1 is ringing
-- Local/4008@from-internal-00000000;1 is ringing
-- DAHDI/8-1 is ringing
-- DAHDI/8-1 answered Local/4008@from-internal-00000000;2
-- Local/4008@from-internal-00000000;1 answered DAHDI/3-1
接着DAHDI/8 转接给9898,看日志应该是通过dahdi/4这个外线来拨通62539898
Stopped music on hold on DAHDI/3-1
== Begin MixMonitor Recording DAHDI/3-1
-- Started music on hold, class 'default', on DAHDI/3-1
-- Playing 'pbx-transfer.gsm' (language 'en')
Executing [9898@from-internal:1] Dial("Local/9898@from-internal-00000001;2", "DAHDI/G0/9898,30,th") in new stack
-- Called DAHDI/G0/9898
-- DAHDI/4-1 answered Local/9898@from-internal-00000001;2
然后DAHDI/8挂断,用户和9898通话,
== Manager 'asterccdaemon' logged off from 192.168.2.62
-- Hanging up on 'DAHDI/8-1'
-- Hungup 'DAHDI/8-1'
== Spawn extension (from-internal, 4008, 1) exited non-zero on 'Local/4008@from-internal-00000000;2'
-- Stopped music on hold on DAHDI/3-1
-- Playing 'beep.gsm' (language 'en')
== Spawn extension (from-pstn, s, 4) exited non-zero on 'Transfered/DAHDI/3-1'
== MixMonitor close filestream
接着就没有日志了,然后就是电话打不进也出不去,一直提示忙碌
Executing [18701008325@from-internal:1] Dial("DAHDI/8-1", "DAHDI/G0/18701008325,30,th") in new stack
[Jun 26 19:27:15] WARNING[24070]: app_dial.c:2341 dial_exec_full: Unable to create channel of type 'DAHDI' (cause 34 - Circuit/channel congestion)
== Everyone is busy/congested at this time (1:0/1/0)
-- Executing [18701008325@from-internal:2] Hangup("DAHDI/8-1", "") in new stack
== Spawn extension (from-internal, 18701008325, 2) exited non-zero on 'DAHDI/8-1‘
-- Hanging up on 'DAHDI/8-1'
-- Hungup 'DAHDI/8-1'
标红那一句,是不是说明用户的那个通道已经成僵尸了,所以给堵住了呢?再打进来,就提示坐席忙碌,没有空闲的了,而且CLI也没有任何日志。
第四天
分析原因:电话局->中继线->电话交换机->tdm卡,是模拟信号,对于模拟信号挂机、摘机检测确实会有漏的,除非从电话交换机把模拟信号转换为数字信号,但是这样tdm卡就没用了,因为tdm卡的作用就是将模拟信号转换为数字信号。
尝试解决:
1、通过给通道设置超时时间,到时间后,强制将该通道关闭。set(TIMEOUT())这样的语句。但是这样对超时时间的把控就 有问题了,有可能1小时,有可能几分钟。
2、向固话运营商申请反极信号,这样能比较准确挂机、摘机。不过我问联通的,一般人完全不知道这是啥。。而且据说不太好加,他们也做不好。
最后的解决:
我们在交换机中出6根模拟线(貌似交换机需要装个什么设备),通到语音卡(对语音卡来说,这6根线就相当于外线了),然后语音卡连接其他坐席,这样坐席就相当于分机了,拨打公司其他分机也就在交换机内部(之前是通过外线出去,然后进来,相当于占了2根外线),不用花钱了。并且,我们禁止转接到外线,只能转接到公司内部分机。这样,一直占线吊死的情况就不会了。