1

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)

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

使用各种不同的手机(Grandstream BT-200、Panasonic 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,但问题仍然存在。

我现在还发现 DTMF 记录确实发生在ZAP通道上的呼叫期间(与我之前尝试过的 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>
4

1 回答 1

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参数传递给 Dial 命令,断开连接功能也可用于中止有人值守的传输。H并且这与将and/or选项传递给 Dial 命令之间没有冲突h:如果您想执行此操作并将该功能用于任何类型的断开连接,它对于中止传输仍然有效而不断开整个呼叫(尽管使用其他然后可能需要使用默认值*,因为现在开始的任何序列*都会中断呼叫!)。

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

Dial(Zap/1/${number},,T);

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

于 2014-06-01T17:24:57.750 回答