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 = no和relaxdtmf=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)
终于破解了这个。
确实,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)
所有传输功能现在都工作正常。