我一直在使用 C# 构建一个 WinForms 桌面应用程序,该应用程序使用 Aster.NET(以前/从 Asterisk.NET 派生)与 Asterisk 接口。我们在可靠地识别和跟踪与单个分机/用户相关的呼叫时遇到了真正的麻烦。
我们遇到的问题是由于 Asterisk 触发/触发的事件的不可预测性/模糊性,它们的变化很大,具体取决于呼叫在到达扩展之前的路由方式。
例如,在以下情况下,事件顺序/格式会有所不同: 呼叫在盲转之前到达 IVR;如果呼叫在有人转接之前到达 IVR;如果呼叫直接转到用户的分机。
Asterisk 使用不同的唯一 ID 跟踪呼叫的每一方的方式进一步阻碍了这一点(例如,呼叫的传入侧与呼叫的接收侧具有不同的 UID)。虽然我们已经设法在(随后变得丑陋!)代码中考虑到这一点,但我们仍然遇到了考虑调用可以采用的不同路由路径的问题。
因此,我正在寻找有关我们如何执行以下操作的任何建议:
- 可靠地识别用户分机的来电
- 我们需要能够识别被呼叫的分机和主叫方 ID(在盲转或有人值守转接和来自外部的直接呼叫之后)
- 可靠地跟踪来电的唯一 ID,因为它用于链接到通话记录
- 可靠地识别来自用户分机的拨出电话
- 考虑到与上述相同的警告
就目前而言,我们有一个极其复杂的事件处理程序链,它们的操作方式取决于应用程序的“当前状态”。
举一个例子:如果我们检测到一个 ChannelState 为 6 ('Up') 的 NewStateEvent,我们检查是否有正在进行的呼叫,并且UID 匹配,如果是,则当前呼叫已被应答。如果 UID 不匹配,但其他因素匹配(例如 channel、connectedlinenum 等),那么我们将其视为呼叫的“另一端”(即接收端或传入端)。
我不确定问题出在 API 上还是 AMI 上——但不管是哪一个,它都让我们非常头疼。
非常感谢任何建议。