Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Приложение 1. Листинг программы «Альтернативная процедура ввода ПИН-кода»⇐ ПредыдущаяСтр 15 из 15
Листинг программы «Альтернативная процедура ввода ПИН-кода» #! /usr/bin/perl
# $ARGV[0] - путь к файлу приветствия # $ARGV[1] - тайм-аут ввода очередной цифры в миллисекундах # $ARGV[2] - длина ПИН-кода # $ARGV[3] - собранный ПИН-код # $ARGV[4] - код завершения
# $ARGV[4] = 0 - нормальное завершение # $ARGV[4] = 1 - ничего не набрано к истечению тайм-аута # $ARGV[4] = 2 - признак необходимости повторить ввод # $ARGV[4] = 3 - ошибочный ПИН-код
# Подключаем модуль работы с AGI интерфейсом use Asterisk:: AGI; $|=1;
$AGI = new Asterisk:: AGI; my %input = $AGI-> ReadParse();
# Удаляем пробелы в начале и конце передаваемых параметров (если они есть) $ARGV[0] =~ s/^\s+|\s+$//g; $ARGV[1] =~ s/^\s+|\s+$//g; $ARGV[2] =~ s/^\s+|\s+$//g; $ARGV[3] =~ s/^\s+|\s+$//g; $ARGV[4] =~ s/^\s+|\s+$//g;
# Если звонок еще в предответном состоянии - отвечаем $AGI-> answer(); my %AGI;
# Инициализируем переменные $status=" "; $result=" "; $to=" ";
# Заставляем Asterisk выполнить команду GET DATA # Формат команды: GET DATA < file to be streamed> [timeout] [max digits] # где < file to be streamed> - путь к медиафайлу, который надо воспроизвести абоненту # [timeout] - тайм-аут ожидания ввода цифры # [max digits] - максимальное количество цифр # Ждем ввода одной цифры print " GET DATA $ARGV[0] $ARGV[1] 1\n"; # Возвращаемый результат: # неудачное завершение: 200 result=-1 # тайм-аут с введенными цифрами: 200 result=< digits> (timeout) # тайм-аут без введенных цифр: 200 result= (timeout) # удачное завершение: 200 result=< digits> # Получаем и разбираем результат $result = < STDIN>; $tt=$result; ($status, $res_str, $to)=split / /, $result; ($fake, $result)=split /=/, $res_str; $to =~ s/^\s+|\s+$//g; $result =~ s/^\s+|\s+$//g; # Если команда завершилась удачно, но цифр не введено - была просто нажата # # возвращаем признак необходимости повторить набор ПИН-кода и выходим if (($result eq '') & & ($to eq '')) { $AGI-> set_variable($ARGV[4], 2); exit(0); } # Ничего не набрали в течение тайм-аута - возвращаем соотвтетствующий признак и выходим if ($result eq '') { $AGI-> set_variable($ARGV[4], 1); exit(0); } # Была нажата * - возвращаем признак необходимости повторить набор ПИН-кода и выходим if ($result eq " *") { $AGI-> set_variable($ARGV[4], 2); exit(0); } # Получены символы отличные от цифр - (A, B, C, D) - # возвращаем признак ошибочного ПИН-кода и выходим if ($result =~ /^\D+$/) { $AGI-> set_variable($ARGV[4], 3); exit(0); }
# Файл приветствия воспроизведен, первая цифра получена. Подолжаем сбор далее $count = 1; while (1) { # Ожидаем очередной символ с заданным тайм-аутом $digit = $AGI-> wait_for_digit($ARGV[1]); # Произошел тайм-аут, возвращаем признак ошибочного ПИН-кода и выходим if ($digit == 0) { $AGI-> set_variable($ARGV[4], 3); exit(0); } $count++; # Анализируем полученное # Нам был возвращен код символа. Получаем сам символ функцией chr() $digit = chr($digit); # Нажата * или # - возвращаем признак необходимости повторить набор ПИН-кода и выходим if (($digit eq " *") || ($digit eq " #")) { $AGI-> set_variable($ARGV[4], 2); exit(0); } # Получены символы отличные от цифр - (A, B, C, D) - # возвращаем признак ошибочного ПИН-кода и выходим if ($result =~ /^\D+$/) { $AGI-> set_variable($ARGV[4], 3); exit(0); } # Добавляем очередную цифру в ПИН-код $result = " $result"." $digit"; # Если собрано 8 цифр - проверяем ПИН-код на принадлежность к техническим # если верно - завершаем цикл сбора цифр if (($count == 8) & & (substr($result, 0, 1) eq " 0")) { last; } # Если собрано к-во цифр, заданное $ARGV[2], завершаем цикл сбора цифр if ($count == $ARGV[2]) { last; } } # Устанавливаем в $ARGV[3] собранный ПИН-код $AGI-> set_variable($ARGV[3], $result); # Устанавливаем в $ARGV[4] признак успешной операции $AGI-> set_variable($ARGV[4], 0); # Завершаем работу exit(0);
|