Вход/Регистрация
Asterisk™: будущее телефонии Второе издание
вернуться

Меггелен Джим Ван

Шрифт:

• Открыть описатели файла для STDIN, STDOUT и STDERR (в более новых версиях PHP один или более этих описателей файла уже могут быть открыты; в предыдущем фрагменте кода показано, как сделать это красиво для большинства версий PHP).

• Прочитать переменные из STDIN, используя функцию fgets.

• Использовать функцию fwrite для записи данных в STDOUT и STDERR.

• Всегда вызывать функцию fflush после записи в STDOUT или STDERR.

Библиотека AGI для PHP

Для более продвинутого программирования AGI на PHP, вероятно, пригодится проект PHPAGI, который можно найти по адресу http:// phpagi.sourceforge.net. Изначально он был написан Мэттью Ашамом (Matthew Asham) и дорабатывался несколькими членами сообщества разработчиков Asterisk.

Написание сценариев AGI на Python

Сценарий AGI, который мы напишем на Python, называется «Игра в вычитание». Источником идей для его написания стала программа на Perl, созданная Эдом Гаем (Ed Guy) и представленная им на конференции AstriCon в 2004 году. Эд рассказывал, в какой восторг он пришел от мощи и простоты Asterisk, когда обнаружил, что может написать короткий сценарий на Perl, чтобы помочь своей дочери с математикой. Поскольку мы уже написали Perl-программу, использующую AGI и Эд создал свою математическую программу на Perl, мы решили заняться реализацией этой задачи на Python! Итак, разберем наш сценарий на Python: #!/usr/bin/python

Данная строка указывает системе выполнять этот сценарий в интерпретаторе Python. Для небольших сценариев в эту строку можно добавить опцию -u, что обеспечит выполнение Python в режиме без буферизации. Однако это не рекомендуется для больших или часто используемых сценариев AGI, поскольку может сказаться на производительности системы. import sys import re import time import random

Здесь импортируются несколько библиотек, которые будут использоваться в сценарии AGI.

# Читаем и игнорируем среду AGI (читать до пустой строки)

env = {} tests = 0;

while 1:

line = sys.stdin.readline.strip

if line == '': break

key,data = line.split(':') if key[:4] <> 'agi_':

# игнорируем ввод, который начинается не с agi_ sys.stderr.write("Did not work!\n"); sys.stderr.flush continue key = key.strip data = data.strip if key <> '':

env[key] = data

sys.stderr.write("AGI Environment Dump:\n");

sys.stderr.flush

for key in env.keys:

sys.stderr.write(" -- %s = %s\n" % (key, env[key])) sys.stderr.flush

Данный фрагмент кода читает переменные, передаваемые в сценарий из Asterisk, и сохраняет их в словарь env. Затем эти значения записываются в STDERR для целей отладки.

def checkresult (params): params = params.rstrip if re.search('"200',params): result = re.search('result=(\d+)',params) if (not result):

sys.stderr.write("FAIL ('%s')\n" % params) sys.stderr.flush return -1 else:

result = result.group(1)

#debug("Result:%s Params:%s" % (result, params)) sys.stderr.write("PASS (%s)\n" % result) sys.stderr.flush return result

else:

sys.stderr.write("FAIL (unexpected result '%s')\n" % params)

sys.stderr.flush

return -2

Функция checkresult по своему назначению практически идентична подпрограмме checkresult в примере AGI-сценария на Perl, который рассматривался ранее в этой главе. Она читает результат выполнения команды Asterisk, проводит синтаксический разбор результата и сообщает, была команда выполнена успешно или нет. def sayit (params):

sys.stderr.write("STREAM FILE %s \"\"\n" % str(params)) sys.stderr.flush

sys.stdout.write("STREAM FILE %s \"\"\n" % str(params)) sys.stdout.flush

result = sys.stdin.readline.strip checkresult(result)

Функция sayit - это просто оболочка для команды STREAM FILE.

def saynumber (params):

sys.stderr.write("SAY NUMBER %s \"\"\n" % params) sys.stderr.flush

sys.stdout.write("SAY NUMBER %s \"\"\n" % params) sys.stdout.flush

result = sys.stdin.readline.strip checkresult(result)

Функция saynumber - это просто оболочка для команды SAY NUMBER.

def getnumber (prompt, timelimit, digcount):

sys.stderr.write("GET DATA %s %d %d\n" % (prompt, timelimit, digcount)) sys.stderr.flush

sys.stdout.write("GET DATA %s %d %d\n" % (prompt, timelimit, digcount)) sys.stdout.flush

result = sys.stdin.readline.strip result = checkresult(result) sys.stderr.write("digits are %s\n" % result) sys.stderr.flush if result:

return result else:

result = -1

Функция getnumber вызывает команду GET DATA для получения DTMF-вво- да от вызывающего абонента. Она используется в нашей программе для получения ответов абонента на поставленные задачи по вычитанию.

  • Читать дальше
  • 1
  • ...
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: