Команда 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.

Ссылки по теме:



Asterisk | Файлы конфигурации | План набора: extensions.conf | Список команд