Asterisk在所有呼叫期间忽略DTMF - 无法使用按键功能

时间:2014-05-20 06:43:52

标签: asterisk transfer phone-call dtmf uclinux

在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,dtmffull => verbose,error,warning,dtmf启用了DTMF日志记录,则尽管在呼叫期间遇到大量密钥,但日志中不会显示任何DTMF条目。

问题是什么?

<小时/> 编辑:现在出现其他信息,显示拨号方案中使用的拨号命令。

编辑:我发现在不使用该ael宏的情况下仍然会出现问题,只需在extensions.conf中使用exten=261,1,Dial(SIP/261)即可。所以我已经从问题中删除了这个问题,以便将其整理掉。

我现在尝试在sip.conf中添加canreinvite = norelaxdtmf=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>

1 个答案:

答案 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);

现在所有传输功能都正常工作。