~sergio

ARTIGOS

Asterisk Gateway Interface - Programación e probas

26-10-2023

AGI é o Asterisk Gateway Interface, que nos permite executar aplicaciós propias desde o Asterisk. Básicamente «forqueando» a execución da nosa aplicación e comunicandose con ela a través da entrada e saída estándar.

Xa hai moita documentación do qué e do cómo na internet, por exemplo:

Pero non atopei en ningún sitio que me explicara como programar esas aplicaciós. No sentido de que, para facer as probas, non ter que estar lanzando chamadas, sinon executándoas directamente e así poder ver os erros que suceden durante o proceso de programación. De ahí este pequeno artigo que me sirve a min tamén de recordatorio.

Facendo nós do Asterisk

A historia é que si executamos directamente nós o script que estamos programando (uso python normalmente para esto, coa biblioteca pyst) teremos que facer nós o rol do Asterisk, comunicándonos co script e enviando os comandos e repostas apropiadas.

Enviando

O máis básico é o seguinte, o paso de parámetros. Si temos o seguinte no dialplan:

  same => n,AGI(proba.py,foo,bar)

Estaremos executando o AGI proba.py pasándolle «foo» como primeiro parámetro e «bar» como segundo. Estos parámetros podémolos capturar (usando pyst) así, no noso script proba.py:

from asterisk.agi import *
miAGI = AGI()

orixen  = miAGI.env["agi_arg_1"]  # sendo orixen = foo
destino = miAGI.env["agi_arg_2"]  # sendo destino = bar

Pero claro, si non queremos meter unha chamada e executar o dialplan, executaremos directamente «proba.py» e quedaráse esperando a recibir algo pola súa entrada estándar. Así, si lle pegamos o seguinte sería o mesmo que lle enviaría o Asterisk:

agi_arg_1:foo
agi_arg_2:bar

E despóis de pegar eso veremos que o script progresa, axilizando moito o tempo de programación ó non ter que estar con un teléfono na orella facendo chamadas.

Respostando

Tamén teremos que responder como si fósemos o Asterisk cando o script en cuestión envíe algún comando que execute algo no Asterisk.

Un exemplo común é un «verbose» para mostrar algo no CLI do Asterisk durante a execución do AGI. Así, ó executar o script e pasarlle os «args» como vimos no punto anterior ahora chéganos, seguindo o exemplo, o seguinte comando:

VERBOSE "*** Chamada entrante!"

E o script quedaráse esperando, xa que necesita a resposta do Asterisk conforme se executou, así que lle pegaremos o seguinte:

200 result=1

Indicando que todo foi ben. En realidade «result» varía pero según a documentación (ver enlace arriba «AGI Commands») o comando «VERBOSE» sempre espera un «result=1».

Como podes comprobar na documentación dos comandos AGI, cada comando espera unha resposta axeitada. Por exemplo para «SAY TIME», cito: «Returns '0' if playback completes without a digit being pressed, or the ASCII numerical value of the digit if one was pressed or '-1' on error/hangup.»

Así unha resposta a:

SAY TIME 1698313734 12345

Sería:

200 result=0

Si se executou a locución sin que o usuario pulsase ningún dos dixitos de escape (1,2,3,4 ou 5) e si, digamos, pulsou o 3, sería:

200 result=3

Outro moi típico é o «get variable», así si nos chega:

GET VARIABLE foo

Podemos responderlle con:

200 result=1 (9999)

Conclusiós

Así, tendo en conta o anterior e coa documentación á man para ver as respostas posibles a cada comando, podemos programar un script para AGI executándoo directamente e «falando» con él como si nós fósemos o Asterisk. O que, na miña opinión, resulta bastante máis cómodo que ter que facer unha chamada para cada proba que queiramos facer.

Sin máis, larga e próspera vida!