我正在使用 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,则将其忽略。
也许我是从错误的角度来看这个的,所以我很感激任何关于如何做到这一点的想法。我不能只使用扩展来构建它,因为它太复杂了,它会同时接收许多调用,所有调用都使用相同的脚本,但同时调用不同的目的地等,而且都是动态的。
谢谢
大卫