使用Asterisk AGI使用Originate进行出站呼叫并控制呼叫的双方

时间:2017-05-10 14:33:53

标签: asterisk asternet

我正在使用Asterisk AGI构建一个非常复杂的IVR。我正在使用AsterNET .NET框架集成到FastAGI。

大多数脚本工作正常,我遇到的问题是拨打电话。 IVR应用程序将与进入拨号方案的入站呼叫一起工作,拨号方案将其发送到AGI以完成工作。 AGI脚本可以处理大量内容,数据库查找,多层菜单等,然后还可以使用数字来连接入站调用者。显然,我可以在AGI中使用Dial应用程序,例如:

Exec("Dial", "PJSIP/Number,30,r")

确实我能做到并且工作正常。但是,我需要更多地控制呼叫的出站端。例如,我需要保持入站响铃或播放音乐,而出站应答和我向出站播放音频。再次,我知道我可以使用Dial,但是,我需要播放音频到呼叫的出站端,并允许他们接受呼叫或使用DTMF拒绝它,而Dial不这样做。如果他们拒绝该呼叫,则出站将停止并返回入站脚本以执行其他操作,这可能会拨打其他号码,或执行其他操作,例如语音邮件。

所以,我考虑过使用Originate,并将其传递回另一个AGI脚本,如下所示:

Exec("Originate", "PJSIP/Number,app,AGI,agi://IP_Address:1234/outbound_call")

这又是一种作品。当出站端回答时,入站等待一点,然后出站端执行脚本中的任何操作,然后入站然后单独跟随它的脚本。那么我需要将它们连接在一起,所以我当然使用Bridge!但我似乎不知道另一个渠道是什么将他们加在一起,我有一个问题,我如何通知我的入境航段出境航段的状态,就好像我不尽快这样做出站航段回答我的入站航班继续执行,而我需要它等待出站已经应答并从目的地请求dtmf。我想我可能会轮询数据库,但每个脚本都必须以某种方式被引用。

我也尝试通过入站通道发送到出站脚本,例如:

("Originate", "PJSIP/Number,app,AGI,agi://IP_Address:1234/outbound_call," +  + request.Channel)

但我无法显示Channel变量,因为我无法在Originate Exec上为arg2获取多个参数,它只是将其视为arg3,如果type为app,则会忽略它。

也许我是从错误的角度来看这个,所以我很感激有关如何做到这一点的任何想法。我不能仅仅使用扩展来构建它,因为它太复杂了,并且它将接收许多同时调用,所有这些都使用相同的脚本,但同时调用不同的目的地等,并且它们都是动态的。

由于

大卫

1 个答案:

答案 0 :(得分:1)

如果有人有兴趣,我自己这样做是通过使用AMI做一个动作来源呼叫我的出站呼叫并发送到AGI脚本的入站通道,然后我的AGI脚本控制出站呼叫,然后我使用Bridge将我的AGI脚本的出站呼叫桥接到使用传递的channel参数的入站,所以我的2个通道是完全独立的,所以在我将它们连接在一起之前,我可以用它们中的任何一个做我喜欢的。花了我几天的测试时间,但没有使用本地频道或重写app_originate就完成了。

相关问题