Asterisk: Очереди своими силами, как?

Хочется сделать очереди более гибкие что ли. Возможно ли такое?
Задача:
1. Входящий звонок -> IVR "Приветствие".
2. Играет музычка с возможными случайными вставками подготовленных шаблонов слов.
3. А тем временем выполняется AGI. Пытается дозвонить до одного внутр. номера, если 10 сек неответ, то другой внутр. номер. Если занято, то сразу другой внутренний номер. Если оба заняты, то ждать пока кто-то освободиться. В рабочее время если оба не отвечают, то переадресация на сотовый. В нерабочее время, не переадреосвывать.

В общем пунк 3 можно ещё усложнить, и проблема, что это всё может меняться динамически через AGI скрипт и БД. Вот как при этом клиенту просто играть музыку, а при поднятии трубки изнутри, сразу соединить.

Пробывал :
Background(demo);
agi(incoming.agi,${CALLERID(num)},${EXTEN});
Но при Background, так же как и при Playback и MusicOnHold, дальше скрипты не обрабатываются до завершения проигрывания.
  • Вопрос задан
  • 4937 просмотров
Пригласить эксперта
Ответы на вопрос 6
Celebro
@Celebro Автор вопроса
Вроде как нашёл решение. Может кому пригодиться.
AGI там просто для теста, перебирает пару номеров в бесконечном цикле. Можно усложнить.
и, при поднятии трубки, холд автоматически прерывается.
Осталась ещё одна проблема, если я отбиваю с мобилы звонок, то клиента тут же сбрасывает. Хотя у клиента всё так же играет холд пока я не возьму трубку. Может можно как-то отлавливать состояния, и продолжать обзвон дальше по списку??
context Incoming {
      _X. =>  {
                Answer();
                Ringing();
                Wait(2);
                agi(incoming.agi,${CALLERID(num)},${EXTEN});
       };

incoming.agi
#!/usr/bin/env perl
use Asterisk::AGI;

my $AGI = new Asterisk::AGI;
$|=1;
my ($callerid, $exten) = @ARGV;

print STDOUT "SET MUSIC ON HOLD DEFAULT\n"  # Запускаем музочку
while(1){
    $AGI->exec("Dial","SIP/1001,15,Ttgm");
    my $availstat1 = $AGI->get_variable('DIALSTATUS');
    $AGI->exec("Dial","SIP/1002,15,Ttgm");
    my $availstat2 = $AGI->get_variable('DIALSTATUS');
    $AGI->exec("Wait","7");
    $AGI->exec("Background","message_try_again");
    print STDOUT "SET MUSIC ON HOLD DEFAULT\n";
};


Да, можно так же выключить MoH.
print STDOUT "SET MUSIC ON HOLD OFF\n";
Ответ написан
falsebyte
@falsebyte
Background должен сразу же отдавать управление, в вашем случае verbose 5 и смотреть что происходит при поступлении звонка
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Попробуйте переводить входящий звонок на холд через BridgeWait(,participant), затем запускать дозвон и соединять через Bridge()
Ответ написан
@zeronice
VoIP, .NET, интернет
используйте макросы на Answer. вообще есть ли какая либо потребность в AGI, если достаточно деревянного asterisk-mysql и одной-двух таблиц с правилами и 10 строчек диалплана нативных asterisk-функци?
Ответ написан
Комментировать
Подтверждаю, команда Background сразу возвращает управление.
По поводу очередей мне немного не понятно, почему вам стандартные очереди Asterisk не подошли. Агенты в них также могут динамически регистрироваться.
Ответ написан
Комментировать
Ovoshlook
@Ovoshlook
можно ARI использовать. Мы писали на нем свой Queue. Очень удобно и быстро работает. AGI- прошлый век. Но! Данное решение работает на версиях астериск 12 и выше.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы