Как в AGI-скрипте получить набор DTMF сигналов с завершением ввода по «*»?

stream_file ждёт ввода только 1 DTMF, wait_for_digit тоже, get_data ждёт ввода нескольких, но нельзя явно указать значение DTMF для прерывания ввода.
Пока только такой вариант видится:
while(true){
    $button=$agi->wait_for_digit(1000);
    if(chr($button['result'])!="*"){
        $buttons.=$chr($button)
    }elseif(chr($button)=="*" && strlen($buttons)<11){
        $agi->exec("Playback","wrong_number");
    }else{
        break;
    }
}

Есть решение лучше?

Задача довольно проста, нужно получить от звонящего номер телефона вида 8хххххххххх. Ввод номера заканчивается по нажатию "*".

UPD (30/12/2015):
Пока остановился на таком решении:
function ask_msisdn($iswrong=false){
    global $agi,$main_cfg;
    $msisdn='';
    //Промт ввода номера
    if(!$iswrong){
        $agi->exec("Playback",$main_cfg['sound_dir'].MSISDN_INPUT);
    }
    //допустимые значения
    $correct_numbers=array('0','1','2','3','4','5','6','7','8','9');
    while(true){
        //ждём DTMF полсекунды
        $pressed=$agi->wait_for_digit(500);
        $digit=chr($pressed['result']);
        if(in_array($digit,$correct_numbers)){
            //корректное значение, добавляем к массиву
            $msisdn[]=$digit;
        }elseif($digit=="*"&&count($msisdn)==11){
            //Набраны все 11 цифр, завершен набор нажатием звездочки
            break;
        }elseif($digit=="*"&&count($msisdn)<11){
            //Набрано меньше 11 цифр, запрашиваем снова
            $agi->exec("Playback",$main_cfg['sound_dir'].MSISDN_WRONG);
            $msisdn=ask_msisdn(true);
        }else{
            //ничего не нажали
            continue;
        }
        if(isset($msisdn[0])&&$msisdn[0]!='8'){
            //проверка первой цифры, нужна строго 8, иначе снова запрашиваем ввод номера
            $agi->exec("Playback",$main_cfg['sound_dir'].MSISDN_WRONG);
            $msisdn=ask_msisdn(true);
        }
    }
    return $msisdn;
}
  • Вопрос задан
  • 757 просмотров
Пригласить эксперта
Ответы на вопрос 2
AGI Command "GET OPTION filename digits timeout"
Behaves similar to STREAM FILE but used with a timeout option.

Streams filename and returns when digits is pressed or when timeout has been reached. Timeout is specified in ms. If timeout is not specified, the command will only terminate on the digits set. Filename can be an array of files or a single filename.
Ответ написан
@alexdora
Топ-менеджер
Сам не давно искал, как ловить номер.
Вот, может этот вопрос-ответ поможет вам, только тут решетка: Как реализовать такую схему звонка?
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы