Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Приложение 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);


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.008 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал