~sergio
ARTIGOSAsterisk 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!