我正在使用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,则会忽略它。
也许我是从错误的角度来看待这件事的,所以我很感激你对如何做到这一点的任何想法。我不能只使用扩展来构建它,因为它太复杂了,而且它将同时接收许多调用,所有调用都使用相同的脚本,但同时调用不同的目的地等,而且它都是动态的。
感谢
David
如果有人感兴趣,我自己做了这件事,用AMI做一个Action Originate来调用我的出站呼叫,并将入站的通道发送给AGI脚本,然后我的AGI脚本控制出站呼叫,所以我的两个通道是完全分开的,所以在我把它们桥接在一起之前,我可以用它们中的任何一个做我喜欢的事情。我花了几天的时间进行测试,但没有使用本地频道或重写app_originate。