- •Основы технологий ip телефонии
- •7.91501, 8.915.01 – “Компьютерные системы и сети”
- •7.91502, 8.91502 - “Системное программирование”
- •Введение
- •Лабораторная работа №1 Пользовательское оборудование ip-телефонии. Настройка и использование
- •Задание на лабораторную работу
- •Краткие теоретические сведения
- •Введение в ip-телефонию
- •Принципы пакетной передачи речи
- •Сигнальные протоколы ip-телефонии
- •Виды соединений в сети ip-телефонии
- •Современные требования к ip-телефонии
- •Основные преимущества ip-телефонии
- •Порядок выполнения работы
- •Работа с ata.
- •Работа с ip-телефоном
- •Регистрация
- •Тестирование и демонстрация работы
- •Краткие теоретические сведения
- •Модули каналов
- •Модули форматов данных
- •Модули кодеров/декодеров
- •Дополнительные модули
- •Модули ресурсов
- •Модули функций плана набора
- •Модули приложений плана набора
- •Встроенные приложения плана набора
- •Порядок выполнения работы
- •Содержимое отчета
- •Контрольные вопросы
- •Лабораторная работа №3 Изучение протоколов ip телефонии
- •Задание на лабораторную работу
- •Краткие теоретические сведения
- •Сообщения протокола sip
- •Адресация
- •Запросы
- •Дополнительные типы запросов
- •Ответы на запросы
- •Порядок выполнения работы
- •Содержимое отчета
- •Контрольные вопросы
- •Команда Background()
- •Команда Playtones()
- •Порядок выполнения работы
- •Содержимое отчета
- •Контрольные вопросы
- •Лабораторная работа №5 Тестирование кодеков.
- •Задание на лабораторную работу
- •Краткие теоретические сведения
- •Кодирование речевой информации
- •Декодирование речевой информации
- •Механизмы оптимизации задержек в сети
- •Порядок выполнения работы
- •Содержимое отчета
- •Контрольные вопросы
- •Рекомендованная литература
Команда Playtones()
Проигрывает список тонов. Может проигрывать тональную последовательность по имени tonename, согласно его определению в файле indications.conf, или, описанный прямо в команде, список - tonelist, с частотами и продолжительностью сигналов.
Выполнение будет немедленно продолжено со следующей по приоритету команды, при этом тональные сигналы будут продолжать генерироваться. Используйте команду StopPlaytones для останова проигрывания тонов. В данном случае эта команда, по своим действиям, аналогична команде Background, которая проигрывает заданный звуковой файл "в фоновом режиме".
-
; testing playtones
exten => 209,1,Answer
exten => 209,2,Playtones(congestion)
; Тоны будут генерироваться пока не наступит
;состояние таймаута
; или пользователь не наберет номер другого
; екстеншена
exten => 264,1,Answer
exten => 264,2,Wait(1)
exten => 264,3,Playtones(!950/330,!1400/330,!1800/330,0)
exten => 264,4,Wait(5)
exten => 264,5,StopPlaytones
exten => 264,6,Wait(2)
exten => 264,7,Playback(beep)
exten => 264,8,Hangup
Рисунок 4.4 – Пример. Asterisk ожидает ввода пользователя 5 секунд
AGI - интерфейс взаимодействия с внешними скриптами
AGI (Asterisk Gateway Interface) - это встроенный в Asterisk метод выполнения внешних скриптов (по аналогии с CGI для http серверов), который может расширить функциональность asterisk при помощи других языков программирования. Таких, как: Perl, PHP, C, Pascal, Bourne Shell - все зависит от Вашего желания и умения.
AGI скрипты: могут управлять вызовом в плане набора, вызываются из файла: extensions.conf
EAGI скрипты: дают приложению возможности доступа и управления звуковыми каналами, в дополнение к управлению вызовами в плане набора.
FastAGI могут быть использованы для выполнения обработки на удаленной машине
deadagi скрипты: имеют доступ к "мертвым" (отключенным) каналам, т.е. могут продолжать работать после окончания вызова.
Порядок выполнения работы
Порядок выполнения работы составлен для выполнения в fedora11.
Установить пакет с дополнительными звуковыми файлами для Asterisk
# yum install asterisk-sounds-core-en-gsm
Придумать структуру голосового меню
Пример абстракной структуры меню:
-
a. приветствие
• добро пожаловать в мое голосове меню
b. основная часть
• для набора абонента user1 нажмите «1»
• для набора абонента user2 нажмите «2»
• для перехода в подменю нажмите «3»
• для завершения звонка нажмите «0»
c. просьба осуществления выбора
• пожалуйста, сделайте свой выбор
Вам необходимо выбрать предметную область для своего варианта и придумать структуру голосового меню для нее.
01 - Аэропорт
02 - Вокзал
03 - Речной порт
04 - Автовокзал
05 - Приемная президента
06 - Ресторан
07 - Деканат
08 - Столовая
09 - Справочное бюро
10 - Сервисный центр
Записать аудиосообщения для голосового меню
В /etc/asterisk/extensions.conf добавляем секцию [other] в конец файла
-
# nano /etc/asterisk/extensions.conf
[other]
Exten => 9205,1,Wait(2)
Exten => 9205,2,Record(/tmp/asterisk-recording:gsm)
Exten => 9205,3,Wait(2)
Exten => 9205,4,Playback(/tmp/asterisk-recording)
Exten => 9205,5,wait(2)
Exten => 9205,6,Hangup
Делаем include для секции [other] в секции [default]
-
[default] ; ; By default we include the demo. In a production
; system, you ; probably don't want to have the demo there. ; include => demo ;
перезапускаем asterisk
-
# /etc/init.d/asterisk restart
осуществляем звонок на номер 9205
После звукового сигнала начнется запись вашего аудиосообщения. Для прекращения записи нажмите #. После этого вы сможете прослушать записанное вами аудиосообщение и будете отсоединены. Ваше аудиосообщение сохранится в файл /tmp/asterisk-recording.gsm, откуда можно его скопировать в папку /usr/share/asterisk/sounds и осмысленно назвать.
Таким образом формируем набор аудиосообщений, необходимых для голосового меню
Настроить голосовое меню
В /etc/asterisk/extensions.conf добавляем секции [my] для основной части и секцию [mysub] для подменю вашего голосового меню в конец файла
[mysub]
exten => s,1,Background(my/submenu) exten => s,2,Background(silence/5) exten => s,3,Background(my/choise) exten => s,4,Background(silence/1) exten => s,5,Goto(mysub,s,1)
exten => i,1,Background(my/invalid) exten => i,2,Background(silence/1) exten => i,3,Goto(mysub,s,1)
exten => 1,1,Wait(2) exten => 1,2,Playtones(!950/330,!1400/330,!1800/330,0) exten => 1,3,Wait(1) exten => 1,4,StopPlaytones exten => 1,5,Wait(1) exten => 1,6,Goto(mysub,s,1)
exten => 2,1,Goto(my,s,2)
exten => 0,1,Playback(my/end) exten => 0,2,Hangup ; [my] exten => s,1,Answer exten => s,2,Playback(beep) exten => s,3,Background(my/main) exten => s,4,Background(my/menu) exten => s,5,Background(silence/5) exten => s,6,Background(my/choise) exten => s,7,Background(silence/1) exten => s,8,Goto(my,s,4)
exten => i,1,Background(my/invalid) exten => i,2,Background(silence/1) exten => i,3,Goto(my,s,4)
exten => 1,1,Dial(SIP/111,10,t) exten => 1,2,Background(silence/1) exten => 1,3,Goto(my,s,2)
exten => 2,1,Dial(SIP/222,10,t) exten => 2,2,Background(silence/1) exten => 2,3,Goto(my,s,2)
exten => 3,1,Goto(mysub,s,1)
exten => 0,1,Playback(my/end) exten => 0,2,Hangup ; |
В /etc/asterisk/extensions.conf задаем номер для нашего голосового меню, описывая его в секции [default]
# nano /etc/asterisk/extensions.conf [default] ; ; By default we include the demo. In a production system, you ; probably don't want to have the demo there. ; include => demo ; include => other ; exten => 789,1,Goto(my,s,1) include => other |
Перезапускаем asterisk
# /etc/init.d/asterisk restart |
Осуществляем звонок на номер 789 и проверяем работу голосового меню
Научиться использовать AGI-скрипты
В папке /usr/share/asterisk/agi-bin создаем два файла-скрипта
# nano /usr/share/asterisk/agi-bin/script1.agi #!/usr/bin/perl use strict; $|=1; # Setup some variables my %AGI; my $tests = 0; my $fail = 0; my $pass = 0; while(<STDIN>) { chomp; last unless length($_); if (/^agi_(\w+)\:\s+(.*)$/) { $AGI{$1} = $2; } } print STDERR "AGI Environment Dump:\n"; foreach my $i (sort keys %AGI) { print STDERR " -- $i = $AGI{$i}\n"; } sub checkresult { my ($res) = @_; my $retval; $tests++; chomp $res; if ($res =~ /^200/) { $res =~ /result=(-?\d+)/; if (!length($1)) { print STDERR "FAIL ($res)\n"; $fail++; } else { print STDERR "PASS ($1)\n"; $pass++; } } else { print STDERR "FAIL (unexpected result '$res')\n"; $fail++; } } print STDERR "Testing 'saynumber'..."; print "SAY NUMBER 12345 \"\"\n"; my $result = <STDIN>; &checkresult($result); |
Вам необходимо разобрать содержание AGI-скрипта и изменить число, которое произносится на произвольно выбранное.
# nano /usr/share/asterisk/agi-bin/script2.agi #!/bin/sh # only with real numerical CLID while read line do if echo $line | grep -q "agi_callerid: "; then CLID=${line##agi_callerid: } if echo ${CLID} | grep -q "^[[:digit:]]*$"; then echo "Good CLID (${CLID})" >&2 else echo "STREAM FILE vm-unknown-caller \"\"\n" echo "Bad CLID (${CLID})" >&2 exit 1 fi else if [ ${#line} -eq 0 ]; then break; fi fi done # say 'enter password' and get max 4-digit password echo "GET DATA vm-password 5000 4\n" read line PASS=${line##200 result=} if [ "_${PASS}_" != "_1234_" ]; then echo "STREAM FILE vm-incorrect \"\"\n" exit 2 else echo "STREAM FILE you-entered \"\"\n" exit 0 fi |
Вам необходимо разобрать содержание AGI-скрипта и изменить число, которое служит паролем на произвольно выбранное.
правим права 755
# chmod 755 /usr/share/asterisk/agi-bin/script1.agi
# chmod 755 /usr/share/asterisk/agi-bin/script2.agi
в секции [other] описываем номера для AGI-скриптов
# nano /etc/asterisk/extensions.conf exten => 5001,1,Answer exten => 5001,2,AGI(script1.agi) exten => 5001,3,Hangup exten => 5002,1,Answer exten => 5002,2,AGI(script2.agi) exten => 5002,3,Hangup |
перезапускаем asterisk
# /etc/init.d/asterisk restart |
осуществляем звонок на номера 5001, 5002 и проверяем работу AGI-скриптов