在ATCOM IP01上的uClinux下的Asterisk 1.4.21.2。 (编辑:顺便说一下,我认为不可能将Asterisk升级到uClinux上1.4的更新版本,但如果有人知道某种方式,我有兴趣知道。但我不认为问题是特定于版本的。)
features.conf
中的功能图如下所示,但在通话过程中按键无效。
[featuremap]
blindxfer => *# ; Blind transfer (default is #)
disconnect => ***0 ; Disconnect (default is *)
;automon => *1 ; One Touch Record a.k.a. Touch Monitor
atxfer => *0 ; Attended transfer
;parkcall => #72 ; Park call (one step parking)
CLI显示已配置的功能图已生效:
IP0x*CLI> feature show channels
No feature channels in use
IP0x*CLI> feature show
Builtin Feature Default Current
--------------- ------- -------
Pickup *8 *8
Blind Transfer # *#
Attended Transfer *0
One Touch Monitor
Disconnect Call * ***0
Park Call
Dynamic Feature Default Current
--------------- ------- -------
(none)
Call parking
------------
Parking extension : 700
Parking context : parkedcalls
Parked call extensions: 701-750
各种不同的手机在使用(Grandstream BT-200,Panasonic KX-TGP500,X-Lite 4),但总是同样的问题。所有配置为使用rfc2833的手机,这是Asterisk默认的DTMF模式;还尝试在sip.conf中明确设置dtmfmode = rfc2833。
在通话期间没有按任何键可以获得Asterisk的任何回复。当不在通话中时(在拨号方案中或在语音信箱期间),*
和#
密钥始终由Asterisk识别。
如果使用full => verbose,debug,dtmf
或full => verbose,error,warning,dtmf
启用了DTMF日志记录,则尽管在呼叫期间遇到大量密钥,但日志中不会显示任何DTMF条目。
问题是什么?
<小时/> 编辑:现在出现其他信息,显示拨号方案中使用的拨号命令。编辑:我发现在不使用该ael宏的情况下仍然会出现问题,只需在extensions.conf中使用
exten=261,1,Dial(SIP/261)
即可。所以我已经从问题中删除了这个问题,以便将其整理掉。
我现在尝试在sip.conf中添加canreinvite = no
和relaxdtmf=yes
,但问题仍然存在。
我现在还发现在 ZAP 频道上的呼叫期间发生DTMF记录 (与之前尝试过的SIP频道相反)。但是DTMF仍然没有触发这些功能。示例DTMF日志如下。
[May 22 08:25:46] DTMF[474]: channel.c:2191 __ast_read: DTMF begin '*' received on SIP/251-01354004
[May 22 08:25:46] DTMF[474]: channel.c:2201 __ast_read: DTMF begin passthrough '*' on SIP/251-01354004
[May 22 08:25:46] DTMF[474]: channel.c:2116 __ast_read: DTMF end '*' received on SIP/251-01354004, duration 180 ms
[May 22 08:25:46] DTMF[474]: channel.c:2163 __ast_read: DTMF end accepted with begin '*' on SIP/251-01354004
[May 22 08:25:46] DTMF[474]: channel.c:2179 __ast_read: DTMF end passthrough '*' on SIP/251-01354004
[May 22 08:25:46] DTMF[474]: channel.c:2191 __ast_read: DTMF begin '*' received on SIP/251-01354004
[May 22 08:25:46] DTMF[474]: channel.c:2201 __ast_read: DTMF begin passthrough '*' on SIP/251-01354004
[May 22 08:25:46] DTMF[474]: channel.c:2116 __ast_read: DTMF end '*' received on SIP/251-01354004, duration 160 ms
[May 22 08:25:46] DTMF[474]: channel.c:2163 __ast_read: DTMF end accepted with begin '*' on SIP/251-01354004
[May 22 08:25:46] DTMF[474]: channel.c:2179 __ast_read: DTMF end passthrough '*' on SIP/251-01354004
[May 22 08:25:46] DTMF[474]: channel.c:2191 __ast_read: DTMF begin '*' received on SIP/251-01354004
[May 22 08:25:46] DTMF[474]: channel.c:2201 __ast_read: DTMF begin passthrough '*' on SIP/251-01354004
[May 22 08:25:47] DTMF[474]: channel.c:2116 __ast_read: DTMF end '*' received on SIP/251-01354004, duration 140 ms
[May 22 08:25:47] DTMF[474]: channel.c:2163 __ast_read: DTMF end accepted with begin '*' on SIP/251-01354004
[May 22 08:25:47] DTMF[474]: channel.c:2179 __ast_read: DTMF end passthrough '*' on SIP/251-01354004
[May 22 08:25:47] DTMF[474]: channel.c:2191 __ast_read: DTMF begin '0' received on SIP/251-01354004
[May 22 08:25:47] DTMF[474]: channel.c:2201 __ast_read: DTMF begin passthrough '0' on SIP/251-01354004
[May 22 08:25:47] DTMF[474]: channel.c:2116 __ast_read: DTMF end '0' received on SIP/251-01354004, duration 280 ms
[May 22 08:25:47] DTMF[474]: channel.c:2163 __ast_read: DTMF end accepted with begin '0' on SIP/251-01354004
[May 22 08:25:47] DTMF[474]: channel.c:2179 __ast_read: DTMF end passthrough '0' on SIP/251-01354004
IP0x*CLI>
答案 0 :(得分:4)
最后解决了这个问题。
确实,设置canreinvite=no
确实阻止了SIP电话在Asterisk最初建立呼叫之后协商它们之间的直接连接,因此将Asterisk保留在媒体路径中(从而意识到他们发送的任何DTMF)。
但即使如此,要让Asterisk实际响应到DTMF并调用已配置的传输功能,您必须在每次通话中明确启用传输基础,将T
和/或t
选项作为Dial命令参数传递。
较新版本的features.conf
提请注意:
;atxfer => *2 ; Attended transfer -- Make sure to set the T and/or t option in the Dial() or Queue() app call!
所以解决方法是,我必须更改我的AEL代码,以便在代码使用Dial命令的任何地方添加T
和/或t
参数。
我剩下的唯一剩下的谜题是如何中止转职;例如,如果没有回复,使等待超时变得乏味,或者转移已经开始转到语音邮件,可能需要返回到另一方。通过实验,我最终发现使用按键断开呼叫的功能也可以中止传输:
;disconnect => *0 ; Disconnect (default is *)
较新版本的features.conf
包含扩展评论,但不包含与转移相关的评论:
;disconnect => *0 ; Disconnect (default is *) -- Make sure to set the H and/or h option in the Dial() or Queue() app call!
我发现即使没有将H
和/或h
参数传递给拨号命令,断开连接功能也可用于中止有人值守的传输。这与H
和/或h
选项之间的拨号命令之间没有冲突:如果你想这样做并使用该功能进行任何类型的断开连接,它仍然存在在不断开整个呼叫的情况下有效中止转移(尽管使用除*
默认值之外的其他内容可能是必要的,因为任何以*
开头的序列现在都会切断呼叫!)。
我的AEL代码中的拨号命令现在是Zap / 1上的拨出呼叫:
Dial(Zap/1/${number},,T);
现在所有传输功能都正常工作。