我一直在使用C#构建一个WinForms桌面应用程序,它使用Aster.NET(以前/从Asterisk.NET派生)与Asterisk连接.我们在可靠地识别和跟踪与单个分机/用户相关的呼叫时遇到了麻烦.
我们遇到的问题是由于Asterisk发起/触发的事件具有不可预测/模糊的特性,它们根据呼叫在到达扩展名之前的路由方式而大规模变化.
例如,事件序列/格式在以下情况下是不同的:呼叫在盲目转移之前命中IVR;如果一个电话在转发之前就打到了IVR;如果通话直接转到用户的分机号.
Asterisk使用不同的唯一ID跟踪呼叫的每一侧(例如,呼叫的呼入侧具有与呼叫的接收侧不同的UID)的方式进一步妨碍了这一点.虽然我们已经设法在(随后丑陋!)代码中解释了这一点,但我们仍然遇到了考虑呼叫可以采用的不同路由路径的问题.
因此,我正在寻找有关如何执行以下操作的任何建议:
>可靠地识别对用户分机的来电
>我们需要能够识别被呼叫的分机和始发呼叫者ID(在盲人或有人转接和外部直接呼叫之后)
>可靠地跟踪该来电的唯一ID,因为它用于链接到通话录音
>可靠地识别来自用户分机的拨出电话
>考虑到与上述相同的警告
因为我们现在有一个极其复杂的事件处理程序链,它们的运行方式取决于应用程序的“当前状态”.
举一个例子:如果我们检测到ChannelState为6(‘Up’)的NewStateEvent,我们检查是否正在进行正在进行的呼叫并且UID是否匹配,如果是,那么当前呼叫已被应答.如果UID不匹配,但其他因素(例如频道,连接线等),则我们将其选为呼叫的“另一侧”(即接收侧或接收侧).
我不确定问题出在API或AMI上 – 但无论它是什么导致我们一些真正的麻烦.
任何建议都非常感谢.
最佳答案 你有可能更新到Asterisk 12吗? AMI中的频道名称现在在Asterisk 12中稳定.
https://wiki.asterisk.org/wiki/display/AST/AMI+v2+Specification