asterisk - 使用 Asterisk AGI 使用 Originate 进行出站调用并控制调用双方

标签 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!但我似乎不知道将它们连接在一起的另一个 channel 是什么,而且我有一个问题,即如何通知我的入站支路出站支路的状态是什么,就好像我不尽快这样做一样出站端应答后,我的入站端继续执行,而如果出站端已应答并且正在从目的地请求 dtmf,则我需要它等待。我想我也许可以轮询数据库,但每个脚本都必须再次以某种方式引用。

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

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

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

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

谢谢

大卫

最佳答案

如果有人感兴趣,我自己通过使用 AMI 执行操作发起来调用我的出站调用并将入站 channel 发送到 AGI 脚本,然后我的 AGI 脚本控制出站调用,然后我自己完成了此操作使用 Bridge 将我的 AGI 脚本的出站调用桥接到使用传递的 channel 参数的入站调用,因此我的 2 个 channel 是完全独立的,因此我可以在将它们桥接在一起之前对它们中的任何一个进行我喜欢的操作。我花了几天的时间进行测试,但它是在没有使用本地 channel 或重写 app_originate 的情况下完成的。

关于asterisk - 使用 Asterisk AGI 使用 Originate 进行出站调用并控制调用双方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43895526/

相关文章:

python - PJSUA 使用 c 进行 sip 注册时出错

Asterisk 13.4 cdr 引擎为每个调用创建 2 条记录

mysql - res_mysql_config.so 模块丢失。无法安装

c# - 在 C# 中使用 AsterNET 发起 VoIP 调用

c# - 如何从我刚刚发起的调用中获取 UniqueId 和 channel 名称?

bash - Fedora 17 上为 "service asterisk start"

java - Asterisk 禁止错误