Asterisk 在所有通话期间都会忽略 DTMF - 无法使用按键功能

Reg*_*dit 1 asterisk transfer phone-call uclinux dtmf

ATCOM IP01 上 uClinux 下的 Asterisk 1.4.21.2。(编辑:顺便说一句,我认为不可能在 uClinux 上将 Asterisk 升级到 1.4 的更新版本,但如果有人知道一种方法,我很想知道。但我不认为问题是版本特定。)

中的featuremapfeatures.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)
Run Code Online (Sandbox Code Playgroud)

CLI显示配置的featuremap已经生效:

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
Run Code Online (Sandbox Code Playgroud)

使用各种不同的手机(潮流BT-200、松下KX-TGP500、X-Lite 4),但总是出现同样的问题。所有电话均配置为使用 rfc2833,这是 Asterisk 的默认 DTMF 模式;还尝试在 sip.conf 中显式设置 dtmfmode=rfc2833 。

通话期间按下的任何按键都不会得到 Asterisk 的任何响应。当未通话时(在拨号方案中或在语音邮件期间),Asterisk 始终会识别*和键。#

full => verbose,debug,dtmf如果使用或打开 DTMF 日志记录full => verbose,error,warning,dtmf,则尽管在呼叫期间按了多次按键,日志中也不会出现 DTMF 条目。

问题可能是什么?


编辑:现在附加信息如下,显示拨号计划中使用的拨号命令。

编辑:我发现在不使用 ael 宏的情况下仍然会出现问题,只需exten=261,1,Dial(SIP/261)在 extensions.conf 中添加即可。所以我从问题中删除了 ael 以理顺它。

我现在尝试在 sip.conf 中添加canreinvite = norelaxdtmf=yes,但问题仍然存在。

我现在还发现,在ZAP通道(与我之前尝试过的 SIP 通道相反)上通话期间确实会进行 DTMF 日志记录。但 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>
Run Code Online (Sandbox Code Playgroud)

Reg*_*dit 5

终于破解了这个。

确实,canreinvite=no在 Asterisk 最初建立呼叫后,设置确实会阻止 SIP 电话在它们之间协商直接连接,因此使 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!
Run Code Online (Sandbox Code Playgroud)

因此,解决方法是,我必须更改 AEL 代码,以便在代码使用 Dial 命令的任何位置添加T和/或参数。t

我剩下的唯一的难题是如何中止有人值守的传输;例如,如果没有回复,则等待超时变得很乏味,或者转接已开始转到语音信箱,可能需要返回对方。通过实验,我最终发现使用按键断开通话的功能也可以中止传输:

;disconnect => *0               ; Disconnect  (default is *)  
Run Code Online (Sandbox Code Playgroud)

较新版本features.conf包含扩展注释,但与传输无关:

;disconnect => *0               ; Disconnect  (default is *) -- Make sure to set the H and/or h option in the Dial() or Queue() app call!
Run Code Online (Sandbox Code Playgroud)

我发现,即使不将H和/或h参数传递给 Dial 命令,断开连接功能也可用于中止有人值守的转接。H并且这与将和/或选项传递给 Dial 命令之间没有冲突h:如果您想执行此操作并使用该功能进行任何类型的断开连接,它对于中止传输而不断开整个呼叫仍然有效(尽管使用其他东西)比默认的*可能变得必要,因为任何开始的序列*现在都会切断呼叫!)。

我的 AEL 代码中用于 Zap/1 上拨出呼叫的 Dial 命令现在是:

Dial(Zap/1/${number},,T);
Run Code Online (Sandbox Code Playgroud)

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