Asterisk™: будущее телефонии Второе издание
Шрифт:
t = time.time - starttime Это сердце сценария AGI. При циклическом выполнении данного фрагмента кода абоненту в течение 180 с предлагаются задачи на вычитание. В начале цикла берутся два случайных числа и вычисляется их разность. Затем абоненту предлагается решить эту задачу. Читается ответ абонента. Если ответ неверен, дается правильный ответ. pct = float(score)/float(count)*100; sys.stderr.write("Percentage correct is %d\n" % pct) sys.stderr.flush sayit("subtraction-game-timesup") saynumber(score) sayit("subtraction-game-right") saynumber(count) sayit("subtraction-game-pct") saynumber(pct)
После того как абонент закончил решение примеров, ему сообщается, сколько баллов он набрал.
Как видите,
• Выходной буфер должен очищаться после каждой записи. Это гарантирует, что AGI-программа не зависнет из-за того, что Asterisk будет ожидать освобождения буфера для записи, а Python - ответа от Asterisk.
• Чтение данных из Asterisk осуществляется с помощью команды sys.stdin.readline.
• Запись команд в Asterisk выполняется с помощью команды sys. stdout.write. После записи не забывайте вызывать sys.stdout.flush.
Библиотека AGI для Python
Если вы планируете много работать с Python для AGI, вероятно, вам пригодится модуль Python Pyst, созданный Карлом Патлэндом (Karl Putland). Его можно найти по адресуhttp://sourceforge.net/projects/pyst.
Отладка в AGI
Отладка программ AGI, как и любых других программ, может приводить в уныние. К счастью, при отладке сценариев AGI есть два преимущества. Во-первых, поскольку весь обмен информацией между Asterisk и программой AGI происходит через STDIN и STDOUT (и конечно, STDERR), у вас должно получиться выполнять сценарий AGI непосредственно из операционной системы. Во-вторых, в Asterisk есть удобная команда для отображения всех взаимодействий между ним и сценарием AGI - agi debug.
Отладка из операционной системы
Как упоминалось выше, у вас должно получиться запустить свою программу прямо из операционной системы, чтобы проверить ее поведение. Хитрость здесь в том, чтобы действовать подобно Asterisk, предоставляя сценарию следующее:
• Список переменных и их значений, таких как agi_test:1.
• Символы перевода строки (\n), указывающие на то, что передача переменных завершена.
• Ответы на каждую из команд AGI, поступающую из вашего сценария AGI. Обычно достаточно ввести 200 response=1.
При тестировании программы непосредственно из операционной системы, возможно, проще замечать ошибки в ней.
Использование команды Asterisk agi debug
В интерфейсе командной строки Asterisk есть очень полезная команда для отладки сценариев AGI, которая называется (вполне уместно) agi debug. Если ввести в консоли Asterisk agi debug и затем запустить AGI- сценарий, вы увидите нечто подобное:
– - Executing AGI("Zap/1-1", "temperature.php") in new stack
– - Launched AGI Script /var/lib/asterisk/agi-bin/temperature.php AGI Tx >> agi_request: temperature.php AGI Tx >> agi_channel: Zap/1-1 AGI Tx >> agi_language: en AGI Tx >> agi_type: Zap AGI Tx >> agi_uniqueid: 1116732890.8 AGI Tx >> agi_callerid: 101 AGI Tx >> agi_calleridname: Tom Jones
AGI Tx >> agi_callingpres: 00 |
AGI Tx >> agi_callingani2: 0 |
AGI Tx >> agi_callington: 0 |
AGI Tx >> agi_callingtns: 0 |
AGI Tx >> agi_dnid: unknown |
AGI Tx >> agi_rdnis: unknown |
AGI Tx >> agi_context: incoming |
AGI Tx >> agi_extension: 141 |
AGI Tx >> agi_priority: 2 |
AGI Tx >> agi_enhanced: 0.0 |
AGI Tx >> agi_accountcode: |
AGI Tx >> |
AGI Rx << STREAM FILE temperature |
AGI Tx >> 200 result=0 endpos=6400 |
AGI Rx << STREAM FILE is "" |
AGI Tx >> 200 result=0 endpos=5440 |
AGI Rx << SAY NUMBER 67 "" |
– - Playing 'digits/60' (language 'en')
– - Playing 'digits/7' (language 'en')
AGI Tx >> 200 result=0
AGI Rx << STREAM FILE degrees ""
AGI Tx >> 200 result=0 endpos=6720
AGI Rx << STREAM FILE fahrenheit ""
AGI Tx >> 200 result=0 endpos=8000
– - AGI Script temperature.php completed, returning 0
Во
Чтобы отключить отладку AGI после запуска, просто введите в консоли Asterisk agi no debug.
Используя команду agi debug, можно увидеть взаимодействие между Asterisk и своей программой, что может быть очень полезным при отладке. Надеемся, эти два совета помогут вам создавать и отлаживать мощные AGI-программы.
Заключение
AGI для разработчика - это один из наиболее революционных и веских аргументов в пользу Asterisk, а не закрытой узкоспециализированной офисной АТС. Но AGI - это только часть картины. В главе 10 будет рассмотрен другой мощный интерфейс программирования, известный как Asterisk Manager Interface.10
Интерфейс Asterisk Manager (AMI) и Adhearsion
Лучше позаботьтесь о том, чтобы все слова ваши были понятны, пристойны и правильно расположены, чтобы каждое предложение и каждый ваш период, затейливый и полнозвучный, с наивозможною и доступною вам простотою и живостью передавали то, что вы хотите сказать; выражайтесь яснее, не запутывая и не затемняя смысла. – Мигель де Сервантес, предисловие к книге «Дон Кихот»
Интерфейс Manager
Asterisk Manager Interface (AMI) - мощный программный интерфейс. Он позволяет внешним программам как управлять, так и контролировать систему Asterisk1. Этот интерфейс часто используется для интеграции Asterisk с существующими бизнес-процессами и системами, программным обеспечением CRM (Customer Relationship Management - управление взаимоотношениями с клиентами). Он также может применяться для разнообразных приложений, таких как программы автоматического набора номера и системы click-to-call (звонок-по-щелчку). Интерфейс Asterisk Manager слушает соединения, устанавливаемые по сетевому порту. Клиентская программа может соединяться с интерфейсом Asterisk Manager через этот порт, аутентифицироваться и передавать команды в Asterisk. После этого Asterisk будет отвечать на запрос, а также обновлять в клиентской программе информацию о статусе системы.