首页 > 解决方案 > Asterisk AsterNET 如何从停车转移到排队?

问题描述

我使用 C# AsterNET 来管理我的 Asterisk 命令和事件,现在我确实有一个新功能可以使用。

这很简单(我认为),但我现在被困住了。

设想

我确实有两个队列,8100 和 8300,​​以及 2 个分机是 8101 和 8301。当我确实有来自 PSTN 的呼叫时,它被驱动到 8100 队列。当 8101 分机可用时,我会将此分机添加到 8100 队列,因此主叫 PSTN 设备将被重定向到此 8101 分机。

到这里为止一切都很好。

有时我确实停放了呼叫设备并使用我的应用程序让 8301 知道它,因此使用同一应用程序的 8301 用户可以发送命令,要求将该停放的频道重定向到他的 SIP 电话。也工作正常。

范围

现在我想要一些功能让 8101 将此呼叫设备转移到我的另一个队列 8300。所以我只是尝试重用我的停放方法和重定向方法

internal void Park(string channel, int parkTimeout)
{
    ParkAction pa = new ParkAction(channel, channel, parkTimeout.ToString());

    ManagerResponse mr = manager.SendAction(pa);
}

internal void RedirectFromParking(string channel, string exten)
{
    RedirectAction ra = new RedirectAction
    {
        Priority = 1,
        Context = "default",
        Channel = channel,
        Exten = exten
    };

    ManagerResponse mr = manager.SendAction(ra);
}

Park("abc123456", 10000);

RedirectFromParking("abc123456", "8300")

问题

我的停车很好,但是当我尝试从停车重定向到我的队列时,呼叫设备刚刚断开并且连接丢失。

如何将驻留的呼叫转移到我的队列或将其直接转移到队列(会更好)而无需发起?

标签: asteriskasteriskamiasternet

解决方案


要转移到队列,我可以按照 Asterisk 网站上的文档进行盲转移。以下链接:

ManagerAction_BlindTransfer

ManagerEvent_BlindTransfer

要使用 AsterNET 实现此目的,我可以使用我正在使用的相同RedirectAction,但我确实需要更改上下文。它不能作为上下文的默认值,因为默认情况下我们让 Asterisk 管理它,但它无法按我的预期处理。因此需要明确指定为内部转移。此上下文传输后引发的事件是Manager_BlindTransfer

Manager_Action_RedirectAction

因此,使用我的 SIP 电话,我在调试引发的事件方法时设法转移了一个呼叫,这样我就可以捕捉到使用的上下文。使用正确的上下文

ManagerConnection manager = new ManagerConnection(address, port, user, password);

manager.BlindTransfer += Manager_BlindTransfer;

private void Manager_BlindTransfer(object sender, BlindTransferEvent e)
{

}

在此之后,我创建了另一种方法来使用正确的上下文直接传输到队列。

internal void TransferToQueue(string channel, string queue)
{
    RedirectAction ma = new RedirectAction
    {
        Priority = priority,
        Context = "from-internal-xfer",
        Channel = channel,
        Exten = queue
    };

    ManagerResponse mr = manager.SendAction(ma);
}

TransferToQueue("abc123456", "8300")

概括

只是要使用的正确上下文的问题。

来自内部xfer


推荐阅读