Студопедия

КАТЕГОРИИ:

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

Список использованных источников




 



Приложение 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 не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...