Команда BackgroundDetect()
Назначение
Проигрывает в фоне звуковой файл, совершает переход на екстеншен, выбранный пользователем при помощи DTMF или на екстеншен "talk", если на линии обнаружен голос.Описание
BackgroundDetect(filename[|sil[|min|max]])Команда BackgroundDetect похоже на функцию Background. Она начинает проигрывать заданный звуковой файл и ждет пока пользователь не наберет какую-нибудь DTMF цифру, (эта цифра должна быть номером правильного екстеншена в обрабатываемом контексте, или будет проигнорирована).
В процессе проигрывания звукового файла, аудиопоток от абонента контролируется этой командой, и если период присутствия сигналов на линии больше чем 'min' миллисекунд, но все еще меньше чем 'max' миллисекунд, который следует за периодом отсутствия сигналов на линии, по крайней мере 'sil' миллисекунд, тогда проигрывание файла прерывается и управление передается к екстеншену 'talk', если он описан в текущем контексте. Если же не заданы параметры sil, min и max, то по умолчанию они равны: 1000, 100 и бесконечности соответственно.
Коды возврата:
Возвращает -1, при разрыве связи, 0 - при успешном завершении воспроизведении, при отсутствии перехода на другой екстеншен.Пример
[incoming]exten => s,1,Answer
exten => s,2,ResponseTimeout(5)
exten => s,3,BackgroundDetect(mymenu)
exten => s,3,BackgroundDetect(chooseSomething)
exten => t,1,Goto(s,2)
exten => i,1,Playback(pbx-invalid)
exten => i,2,Goto(s,2)
exten => 1,1,DoSomething
exten => 2,1,DoSomethingElse
exten => 3,1,Dial(...)
exten => talk,1,Dial(...)
Простое детектирование автоответчика
Этот пример используется для совершения исходящих вызовов и передачи тревожного сигнала. Он работает по разному, в зависимости от того, кто ответил, автоответчик или живой человек, соответственно, для этого используются два различных контекста.
[detect]
exten => s,1,DigitTimeout(5)
exten => s,2,ResponseTimeout(5)
exten => s,3,SetVar(MACHINE=0)
exten => s,4,Answer
exten => s,5,BackgroundDetect(silence/5, 1000, 50)
exten => s,6,Noop(answering machine detected)
exten => s,7,SetVar(MACHINE=1)
exten => s,8,BackgroundDetect(silence/30, 1000, 50, 30050)
exten => s,9,Noop(too long of a message)
exten => s,10,Hangup
exten => talk,1,GotoIf($[${MACHINE}=1]?2:3)
exten => talk,2,Goto(detect-machine,s,1) ; обнаружен автоответчик
exten => talk,3,Goto(detect-human,s,1) ; обнаружен живой абонент
Основные принципы: Если обнаружен сигнал, после паузы в течении 5 секунд, предполагаем, что это абонент сказал что то типа ("алло?"), иначе, ждем пока сигнал закончится, и потом оставляем сообщение на автоответчике. Вам будут необходимы два файла с названием silence/5.gsm и silence/30.gsm, в вашей директории для звуковых файлов, которые содержат 5 и 30 секунд тишины.
Этот пример нуждается в некоторой настройки временных интервалов для команды BackgroundDetect.
Ссылки по теме:
- Команда Background: Проигрывает звуковой файл, в это время могут исполняться другие команды
- Команда Playtones: Проигрывает список тонов, в это время могут исполняться другие команды
- Команда DigitTimeout: Установка максимального таймаута между набираемыми цифрами
- Команда ResponseTimeout: Установка максимального времени ожидания ввода пользователя
- Команда Playback: Проигрывает звуковой файл
- Команда ControlPlayback: Проигрывает звуковой файл с возможностью перемотки вперед, назад и останова
- Команда MusicOnHold
- Звуковые файлы
- Asterisk tips answer-before-playback
- Asterisk tips ivr menu: Примеры интерактивных голосовых меню в Asterisk
Asterisk | Файлы конфигурации | План набора: extensions.conf | Список команд