Asterisk™: будущее телефонии Второе издание
Asterisk™: будущее телефонии Второе издание читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
После передачи команды STREAM FILE этот тест читает результат из STDIN и вызывает подпрограмму checkresult, чтобы выяснить, смогла ли Asterisk воспроизвести файл. Команда STREAM FILE принимает три аргумента, два из которых являются обязательными:
• Имя звукового файла для воспроизведения.
• Коды, которые могут прерывать воспроизведение.
• Место начала воспроизведения звукового файла, заданное номером музыкального фрагмента (необязательный).
Одним словом, этот тест указал Asterisk воспроизвести файл beep.gsm и затем проверил результат, чтобы убедиться, что Asterisk успешно выполнила команду.
print STDERR "2. Testing 'sendtext'..."; print "SEND TEXT "hello world"n"; my $result = <STDIN>; &checkresult($result);
Этот тест демонстрирует, как вызывать команду SEND TEXT, которая является аналогом приложения SendText(). Эта команда будет посылать заданный текст вызывающему абоненту, если используемый им тип канала поддерживает передачу текста.
Команда SEND TEXT принимает один аргумент: текст, который должен быть отправлен в канал. Если текст содержит пробелы (как в предыдущем фрагменте кода), аргумент должен быть заключен в кавычки, чтобы Asterisk понимала, что вся строка является одним аргументом команды. Опять же, обратите внимание, что кавычки экранированы, поскольку они должны быть переданы в Asterisk, а не использоваться для ограничения строки в Perl.
print STDERR "3. Testing 'sendimage'..."; print "SEND IMAGE asterisk-imagen"; my $result = <STDIN>; &checkresult($result);
Этот тест вызывает команду SEND IMAGE, которая является аналогом приложения SendImage(). Ее единственный аргумент - имя файла изображения, который будет отправляться вызывающему абоненту. Как и команда SEND TEXT, данная команда работает, только если вызывающий канал поддерживает прием изображений. print STDERR "4. Testing 'saynumber'..."; print "SAY NUMBER 192837465 ""n"; my $result = <STDIN>; &checkresult($result);
Этот тест посылает Asterisk команду SAY NUMBER. Она ведет себя аналогично приложению диалплана SayNumber() и принимает два аргумента:
• Число, которое должно быть воспроизведено.
• Коды, которые могут прервать выполнение команды.
Опять же, поскольку второй аргумент опущен, необходимо передать пустую пару кавычек.
print STDERR "5. Testing 'waitdtmf'..."; print "WAIT FOR DIGIT 1000n"; my $result = <STDIN>; &checkresult($result);
Этот тест демонстрирует применение команды WAIT FOR DIGIT. Эта команда обеспечивает ожидание ввода DTMF-кода вызывающим абонентом заданное количество миллисекунд. Если требуется реализовать бесконечное ожидание ввода цифры, в качестве времени ожидания задается -1. Это приложение возвращает десятичное значение ASCII нажатой цифры.
print STDERR "6. Testing 'record'..."; print "RECORD FILE testagi gsm 1234 3000n"; my $result = <STDIN>; &checkresult($result);
Этот фрагмент кода демонстрирует команду RECORD FILE. Она используется для записи разговора, аналогично приложению диалплана Record(). RECORD FILE принимает семь аргументов, из которых три последних являются необязательными:
• Имя записываемого файла.
• Формат, в котором выполняется запись.
• Коды, которые могут прервать запись.
• Время ожидания (максимальное время записи) в миллисекундах или -1, если время ожидания бесконечно.
• Число музыкальных фрагментов, которые необходимо пропустить перед началом записи (необязательный).
• Слово BEEP, если требуется, чтобы Asterisk подавала звуковой сигнал перед началом записи (необязательный).
• Количество секунд, которое должно пройти, прежде чем Asterisk решит, что пользователь закончил запись, и продолжит выполнение даже несмотря на то, что время ожидания еще не истекло и DTMF-коды не были введены (необязательный). Этот аргумент должен следовать за s=.
В данном конкретном случае записывается файл testagi (в формате GSM), любой DTMF-код от 1 до 4 может прервать запись и максимальное время записи - 3000 мс.
print STDERR "6a. Testing 'record' playback..."; print "STREAM FILE testagi ""n"; my $result = <STDIN>; &checkresult($result);
Вторая часть этого теста воспроизводит записанный ранее аудиофайл, используя команду STREAM FILE. Команда STREAM FILE уже рассматривалась, поэтому данный фрагмент кода не требует дополнительных пояснений.
print STDERR "================== Complete ======================n";
print STDERR "$tests tests completed, $pass passed, $fail failedn"; print STDERR "==================================================n";
В конце сценария AGI результаты тестирования записываются в STDERR, который должен быть выведен в консоли Asterisk.
Итак, при написании AGI-программ на Perl необходимо помнить следующее:
• Должен быть активирован строгий контроль выполнения правил языка программирования с помощью команды use strict [102].
• Должна быть отключена буферизация вывода через задание $|=1.
• Данные, поступающие от Asterisk, принимаются с помощью цикла
while(<STDIN>).
• Значения записываются командой print.
• Для записи отладочной информации в консоль Asterisk используется команда print STDERR.
Библиотека AGI для Perl
Тем, кто собирается создавать собственные сценарии AGI на языке Perl, вероятно, будет интересен модуль на Perl - Asterisk::AGI, написанный Джеймсом Головичем (James Golovich), который можно найти по адресу http://asterisk.gnuinter.net. Модуль Asterisk::AGI еще больше упрощает написание сценариев AGI на Perl.
Создание сценариев AGI на PHP
Мы обещали обсудить несколько языков программирования, поэтому пойдем дальше и рассмотрим, как выглядит сценарий AGI на PHP. Основные правила программирования AGI те же, изменился только язык программирования. В данном примере мы напишем сценарий AGI для загрузки из Интернета сводки погоды и предоставления вызывающему абоненту информации о температуре, направлении и скорости ветра.
#!/usr/bin/php -q
<?php
Первая строка указывает системе использовать для выполнения сценария интерпретатор PHP. Опция -q отключает HTML-сообщения об ошибках. Необходимо убедиться в отсутствии дополнительных строк между первой строкой и открывающим тегом PHP, поскольку это собьет Asterisk с толку.
# внесите соответствующие изменения для получения
# данных по интересующему вас городу
# полный список городов США можно найти по адресу
# http://www.nws.noaa.gov/data/current_obs/
$weatherURL=" http://www.nws.noaa.gov/data/current_obs/KMDQ.xml"; Тем самым вы указываете сценарию AGI, где можно получить информацию о текущих погодных условиях. В данном примере предоставляются данные для Хантсвилла, штат Алабама. Вы можете свободно посетить указанный сайт, на котором найдете полный список станций по всем Соединенным Штатам Америки1.
# не допускайте, чтобы этот сценарий выполнялся дольше 60 с set_time_limit(60);
Здесь мы указываем PHP, что данная программа не должна выполняться более 60 с. Таким образом, сценарий будет гарантированно завершен, если по какой-то причине время его выполнения превысит 60 с.
# отключить буферизацию вывода ob_implicit_flush(false);
Эта команда отключает буферизацию вывода, то есть все данные будут отправляться в интерфейс AGI немедленно и не станут накапливаться в буфере.
# отключите сообщения об ошибках, поскольку, скорее всего,
# они будут пересекаться с сообщениями интерфейса AGI error_reporting(0);