1

我正在使用 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,如果类型为 app,则将其忽略。

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

谢谢

大卫

4

1 回答 1

1

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

于 2017-05-12T22:38:52.757 回答