Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Список использованных источников⇐ ПредыдущаяСтр 13 из 13
Приложение 1 Листинг программы «Альтернативная процедура ввода ПИН-кода» #!/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); |
||
Последнее изменение этой страницы: 2018-05-29; просмотров: 143. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |