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

Using Asterisk AGI to make outbound calls using Originate and controlling both sides of call

我正在使用 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,则忽略它。

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

谢谢

大卫

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