Назад | Перейти на главную страницу

Asterisk: использование Queue () в расширении h

Я пытаюсь заставить пользователей записывать сообщение, повесить трубку и продолжить вызов, набрать очереди и воспроизвести запись.

Я прошел большую часть пути, но сейчас, когда я звоню Queue() в расширении h он немедленно вешает трубку (участники очереди получают вызов примерно в течение 1 мс). Хотя я использую вариант c

Мой диалплан (сокращен для краткости)

[standard-gn-helpdesk-corona-afterhours]
; Hangup Extension
exten => h,1, NoOp(hangup standard-gn-helpdesk-corona-afterhours)
same => n, Gosub(sub-queue-gn-afterhours,s,1)
same => n, Return()

exten => s,1, NoOp(standard-gn-helpdesk-corona-afterhours)
same => n, Record(gn_ah_recording%d:ulaw)
same => n, Hangup()
; Callee has hungup by this point. `h` should be executed

[playback-recorded-message]
exten => s,1, NoOp(playback-recorded-message)
same => n, Playback(${RECORDED_FILE})

[sub-queue-gn-afterhours]
exten => s,1,NoOp(sub-queue-gn-afterhours)
; Has the `c` option which allows the queue to continue when callee hangs
same => n,Queue(GNAfterHours1,tkc,,,540,,,playback-recorded-message)
same => n,Return()

Любые предложения будут полезны. Я буду вынужден использовать Dial() вместо этого с F вариант?

На самом деле я не мог найти способ обойти все возникшие проблемы, мое окончательное решение оказалось хакерским обходным путем с использованием AGI для инициирования нового вызова с использованием локального канала. Мой план набора номеров выглядел примерно так:

[standard-gn-helpdesk-corona-afterhours]
; Hangup Extension
exten => h,1, NoOp(hangup standard-gn-helpdesk-corona-afterhours)
same => n, AGI(dial-playback-recorded-messages.php)
same => n, Hangup()

exten => s,1, NoOp(standard-gn-helpdesk-corona-afterhours)
same => n, Record(gn_ah_recording%d:wav)
same => n, Hangup()
; Callee has hungup by this point. `h` should be executed

[playback-recorded-message]
exten => s,1, NoOp(playback-recorded-message)
same => n, Playback(${RECORDED_FILE})

[sub-queue-gn-afterhours]
exten => s,1,NoOp(sub-queue-gn-afterhours)
 ; Total hack! This is bad practice, but I don't have shared func and I couldn't find another way to keep this variable in scope when using Queue -> Sub
same => n, Set(GLOBAL(RECORDED_FILE)=${RECORDED_FILE})
same => n,Queue(GNAfterHours1,tk,,,540,,,playback-recorded-message)
same => n,Return()

[from-internal-default]
; Outbound dial for AH
exten => 8745111,1, Answer()
same => n, Gosub(sub-queue-gn-afterhours,s,1)
same => n, Hangup()

; Inbound dial for AH
exten => 8745112,1, Answer()
same => n, Wait(3600)
same => n, Hangup()

Мой сценарий AGI выглядел так (урезан для простоты)

<?php
$recordingFile = $agi->get_variable("RECORDED_FILE", true);
$hasAh = (string) $agi->get_variable("HAS_AFTERHOURS", true); 

$originateMsg = new OriginateAction('local/8745112@from-internal-default');
$originateMsg->setContext('from-internal-default');
$originateMsg->setPriority('1');
$originateMsg->setExtension('8745111');
$originateMsg->setAsync(true);
$originateMsg->setTimeout(19000);
$originateMsg->setVariable('RECORDED_FILE', $recordingFile);
$originateMsg->setVariable('HAS_AFTERHOURS', $hasAh);
$response = $pamiClient->send($originateMsg);

Как это устроено:

  1. Звонящий входит и записывает сообщение
  2. Вызов вешает трубку и выполняет сценарий AGI, который инициирует новый вызов между локальным каналом 8745112 и набор местного внутреннего номера 8745111
  3. Расширение 8745112 просто ждет, чтобы соединение оставалось открытым
  4. Канал 8745111 перемещается в очередь, после подключения вызова запускается подпрограмма очереди сообщений playback-recorded-message который воспроизводит сообщение

Я уверен, что есть гораздо лучшее и менее хакерское решение, но с моим уровнем понимания Asterisk это лучшее, что я мог придумать. Надеюсь, это кому-то поможет