Шрифт:
limit=20
digitcount=2
score=0
count=0
ttanswer=5000
Здесь выполняется задание исходных значений нескольким переменным, которые будут использоваться в программе.
starttime = time.time t = time.time - starttime
В этих строках переменной starttime задается текущее время, а переменной t - начальное значение 0. Переменная t будет использоваться для отсчета времени с момента запуска сценария AGI в секундах.
sayit("subtraction-game-welcome")
Далее, мы рады приветствовать абонента в нашей игре на вычитание.
while ( t < 180 ):
big = random.randint(0,limit+1) big += 10
subt= random.randint(0,big) ans = big - subt count += 1
#постановка задачи:
sayit("subtraction-game-next");
saynumber(big);
sayit("minus");
saynumber(subt);
res = getnumber("equals",ttanswer,digitcount);
if (int(res) == ans) : score+=1
sayit("subtraction-game-good"); else :
sayit("subtraction-game-wrong"); saynumber(ans);
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 на Python следует помнить такие основные моменты:
• Выходной буфер должен очищаться после каждой записи. Это гарантирует, что 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 "" |