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")
Проблема
Паркуюсь нормально, но когда я пытаюсь перенаправить со стоянки в свою очередь, вызывающее устройство просто отключается и соединение теряется.
Как я могу перевести запаркованный вызов в мою очередь или передать его прямо в очередь (было бы лучше) без необходимости исходить?
2 ответа
Просто держите вместо парковки и составляйте свой список таких звонков.
Для перехода в очередь я могу выполнить слепой перенос, как описано на веб-сайте Asterisk. Ссылки ниже:
Чтобы добиться этого с помощью AsterNET, я могу использовать то же действие RedirectAction, которое я использовал, но мне нужно изменить контекст. Это не может быть по умолчанию для контекста, по умолчанию мы позволяем Asterisk управлять им, и почему-то он не может справиться, как я ожидал. Таким образом, это должно быть четко указано как международный перевод. Событие, возникающее после этой передачи контекста, - это Manager_BlindTransfer.
Таким образом, с помощью своего 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")
Резюме
Было просто вопросом правильного контекста для использования.
from-internal-xfer