星号:转发呼叫而不立即回答

时间:2013-01-04 13:44:17

标签: asterisk phone-call forwarding

我想转发一个电话。我可以定义扩展,接听电话并使用拨号命令。但是,这不是我想要的。我不想立即接听电话。我宁愿等第二个电话接听。

怎么做?当我只使用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))。但我不知道如何在宏中加入这两个调用。

有什么想法吗?

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

  1. 来电者:响了
  2. SIP电话(或软件)响起
  3. 通过SIP电话接听电话
  4. SIP电话:没有声音。
  5. 来电者:它停止响铃,没有声音
  6. 当我在拨号(...)命令之前添加命令Playback(无效)时,它完全不同:

    1. 来电者:响了
    2. 来电:来电已接听,并且会读取“无效”信息。
    3. 来电者:响了(但接听电话,来电者支付这个响铃时间)
    4. SIP电话(或软件)响起
    5. 通过SIP电话接听电话
    6. 呼叫已成功连接

    7. 当且仅当在拨号(...)命令之前未明确应答呼叫时(例如通过播放(...)或应答()),似乎出现问题。所以,像下面这样的东西可能会有所帮助(类似JQuery的伪代码):

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

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

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


      我几乎用Dial(SIP / ...,超时,A(无效))解决了这个问题。现在,我要使用另一种(零长度或几乎零长度)的声音。

4 个答案:

答案 0 :(得分: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. 播放一个简短的声音(即beeperr)至address@somewhere.com
  5. 原来的电话会被接听并弥合。
  6. 在这种情况下,来电者听不到蜂鸣声。声音仅播放到address@somewhere.com。这会在通过address@somewhere.com接听电话和接听原始电话之间短暂停顿。在暂停时,会播放beeperr。

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

答案 1 :(得分:2)

是的,正确的方法就是拨打。

如果您没有响铃,您可以使用星号和gsm网关的铃声/早期媒体参数。

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

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

答案 2 :(得分:0)

我建议的是:

  1. 打开您的第一个电话,然后将它们引导到动态会议中,播放铃声。将会议号码设置为唯一的8位数字。
  2. 打开第二个电话,并将上述会议号码存储为频道变量。
  3. 如果第二个呼叫应答,请阅读频道变量,然后将该呼叫放入相应的会议中。
  4. 如果第二个电话没有应答,则挂断第一个电话。您可以通过仅为一个参与者轮询所有会议的AMI来确定这一点,检查其频道的“摘机”时间,如果它太长,则表示无应答/无加入。
  5. 我已经将这种方法用于类似的客户端项目,并且很容易实现Asterisk Dial Plan和AGI的组合。 我使用假脱机调用文件作为使用适当的通道变量等运行拨号的方法。它简单,快速,干净。

答案 3 :(得分: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消息和&#34; R&#34;在远程端没有的情况下,参数应该产生本地铃声。

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

Nir ​​S