2

我想转接一个电话。我可以定义分机、接听电话和使用拨号命令。但 t 不是我想要的。我不想立即接听电话。我宁愿等待第二个电话被接听。

怎么做?当我只使用 Dial(Sip/...) 而不应答时,双方完全沉默。

我已阅读(请参阅http://fonality.com/trixbox/forums/trixbox-forums/open-discussion/call-forward-without-answer-dialplan)可以通过禁用传真来解决它。我已经卸载了传真模块,但它并没有解决问题。在同一页面上,我读到我可以尝试类似http://www.voip-info.org/wiki/view/Asterisk%20auto-dial%20out的东西,但这看起来太高级了。

我有另一个想法。使用拨号(Sip/..., 60, M(a-macro))。但我不知道如何在宏中加入这两个调用。

任何的想法?

编辑:说清楚。当我只使用 Dial(例如 Dial(SIP/uri) 或 Dial(SIP/uri, 60, r))时,它会执行以下操作:

  1. 来电者:响了
  2. SIP 电话(或软件)响铃
  3. 呼叫由 SIP 电话应答
  4. SIP 电话:没有声音。
  5. 来电者:它停止响铃,没有声音

当我在 Dial(...) 命令之前添加命令 Playback(invalid) 时,它完全不同:

  1. 来电者:响了
  2. 来电者:接听电话并读取“无效”消息。
  3. 来电者:响铃(但电话已接听,来电者支付此响铃时间)
  4. SIP 电话(或软件)响铃
  5. 呼叫由 SIP 电话应答
  6. 通话已成功连接

似乎当且仅当在 Dial(...) 命令之前没有明确应答呼叫(例如通过 Playback(...) 或 Answer())时才会出现问题。因此,以下内容可能会有所帮助(类似 JQuery 的伪代码):

call_1.Dial(...).onAnswer(function(call_2){
    call_1.Answer();
});

Asterisk 尝试了类似的东西,但是 Asterisk 的方式是错误的。

当然,在 Dial(...) 之前添加 Answer() 有效,但我不想在重定向呼叫被应答之前接听电话


我几乎通过使用拨号(SIP/...,超时,A(无效))解决了这个问题。现在,我必须使用另一种(零长度或几乎为零长度)声音。

4

4 回答 4

3

我无法创建有效的零长度声音,但以下解决方案对我来说似乎已经足够了:

exten => s,1,<log it>
exten => s,n,Dial(SIP/address@somewhere.com, 600, A(beeperr))
exten => s,n,GotoIf($["${DIALSTATUS}" = "ANSWER"]?:callfail)
exten => s,n(callfail),<report call fail>

代码中最重要的部分是Dial(SIP/address@somewhere.com, 600, A(beeperr)).

现在,它起作用了:

  1. 来电者拨打电话。
  2. 创建了对 address@somewhere.com 的调用。
  3. 呼叫 address@somewhere.com 由用户接听。
  4. 向地址@somewhere.com 播放短声(即哔哔声)
  5. 原始呼叫被应答和桥接。

在这种情况下,呼叫者听不到蜂鸣器的声音。仅向 address@somewhere.com 播放声音。这会在通过 address@somewhere.com 接听电话和接听原始电话之间产生短暂的停顿。在暂停中,会播放beeperr。

也许 directmedia=no 是解决方案的一部分,但我不确定。

于 2013-01-14T10:38:33.867 回答
2

是的,正确的方法是拨号。

如果您没有收到任何振铃,则您可以使用星号和 gsm 网关的振铃/早期媒体参数。

但是,如果您使用便宜的 gsm 网关,您将无法向提供商方发送任何内容(gsm 提供商不允许这样做)。要通过 gsm 网络发送早期媒体,您必须通过 e1 线路等数字设备连接到 gsm 提供商。

作为选项,您可以尝试使用 r 选项拨号命令或在拨号前使用振铃命令,但这非常依赖于 gsm 网关设置。

于 2013-01-05T01:41:22.110 回答
0

我的建议是这样的:

  1. 打开您的第一个电话,将他们引导到一个动态会议中,播放铃声。将会议号码设置为唯一的 8 位号码。
  2. 打开您的第二个通话,并将上述会议号码存储为频道变量。
  3. 如果第二个呼叫应答,则读取通道变量,然后将该呼叫挂断到适当的会议中。
  4. 如果第二个电话没有接听,则挂断第一个电话。您可以通过轮询 AMI 来确定只有一名参与者的所有会议,检查他们频道的“摘机”时间,如果时间太长,则意味着无应答/无加入。

我在一个类似的客户项目中使用了这种方法,它很容易实现为 Asterisk Dial Plan 和 AGI 的组合。我使用假脱机呼叫文件作为使用适当的通道变量等运行拨号的一种方式。它简单、快速、干净。

于 2013-01-08T18:53:58.457 回答
0

好,

在我看来,您的主要问题不是直接与拨号方案相关,而是与网络相关。听不到任何声音的情况通常是由于您的 Asterisk 服务器位于一个位置,而您的客户端和终端位于 NAT 防火墙后面。或者,另一种可能性,您的 Asterisk 服务器位于防火墙后面,其中一方也是如此。在其中任何一个中,如果您的 sip.conf 配置配置不正确,它将无法正常工作。

现在,如果您想尝试一些时髦的东西,请执行以下操作:

exten => _XXXX,1,Noop(*** Here we Go ***)
exten => _XXXX,n,Playback(SomeShortFile,noanswer)
exten => _XXXX.n,Dial(Your SIP destination,60,R)

第二行应该将 SIP 180 消息更改为 SIP 183 消息,并且“R”参数应该生成本地铃声,以防远程端没有。

如果这不能解决问题,我建议您将 sip.conf 配置传递到http://www.pastebin.ca,并与我们分享链接,以便我们查看。

尼尔小号

于 2013-01-14T12:52:11.150 回答