Tag Archives: scripting

AGI – Asterisk Gateway Interface

asterisk logo TM
Asterisk prevede un’interfaccia di scripting standard, che programmi esterni possono utilizzare per controllare il Dialplan di Asterisk: l’Asterisk Gateway Interface (AGI).

Oggi mi sono sono dovuto cimentare con Asterisk 1.6 e la chiamata a script esterni che ne controllano il dialplan: L’interfaccia AGI.

Normalmente gli script AGI sono utilizzati per sviluppare ambienti di logiche avanzate, interazioni con database relazionali (PostgreSQL o MySQL per esempio) o accessi a risorse esterne.

Come funzionano gli script AGI?

Gli script AGI comunicano con Asterisk tramite canali di comunicazioni standard, ovvero lo STDIN (standard input), lo STDOUT (standard output) e lo STDERR (standard error).

Più in particolare:

  • Lo script AGI leggerà dallo STDIN per avere informazioni da Asterisk
  • Lo script AGI scriverà dati nello STDOUT per inviare informazioni ad Asterisk
  • Lo script AGI scriverà dati nello STDERR per inviare informazioni di debug alla console di Asterisk (Asterisk -r)

Le comunicazione tra AGI e Asterisk

La comunicazione tra AGI e Asterisk avviene seguendo dei pattern predefiniti. Quando uno script AGI viene chiamato, Asterisk invia una serie di variabili con i rispettivi valori. Eccone un esempio:

agi_request: test.py
agi_channel: Zap/1-1
agi_language: en
agi_callerid:
agi_context: default
agi_extension: 123
agi_priority: 2

Dopo aver inviato queste informazioni, Asterisk invia una linea bianca. Questo è il segnale che Asterisk ha inviato tutte le variabili, e che il controllo del dialplan viene affidato allo script AGI.

A questo punto, lo script AGI invia dei comandi al dialplan Asterisk tramite lo STDOUT. Dopodiché, Asterisk invia una risposta che lo script AGI dovrebbe leggere. Queste azioni possono essere ripetute durante tutta la durata dello script.

Come si chiama uno script AGI dal dialplan?
Un esempio di come di può chiamare lo script AGI è questo:

exten => 123,1,Answer()
exten => 123,2,AGI(agi-test.agi)

Tutti gli script AGI normalmente risiedono in /var/lib/asterisk/agi-bin (in Debian li troviamo in /usr/lib/asterisk/agi-bin mi sembra, ma non ne sono sicuro)

AGI(), EAGI(), DeadAGI(), and FastAGI()

Oltre ad AGI, ci sono altre tipologie di interfacce che possono essere utilizzate da Asterisk. Ecco alcune caratteristiche:

  • EAGI o enhanced AGI: è un’applicazione che funziona come AGI, ma da la possiblità allo script di leggere lo stream audio in arrivo dal file-descriptor numero 3.
  • DeadAGI: funziona esattamente come AGI, ma su canali morti (per esempio dopo un hangup). Questo significa che AGI non funziona su canali morti.
  • FastAGI: è un’applicazione che permette la chiamata a script AGI su server remoti.

Alcuni riferimenti

Ecco qui alcuni link a librerie e risorse interessanti e utili:

Librerie

  • Asterisk-perl: librerie Perl per lo sviluppo di script AGI in Perl.
  • PHP-AGI: librerie PHP per lo sviluppo di script AGI in PHP.
  • Pyst: librerie Python per lo sviluppo di script AGI in Python

Servers FastAGI (che ho provato)

  • AGIspeedy: Server AGI in Perl. Funziona molto bene, anche se l’implementazione degli script non è proprio user-friendly
  • FastAGI.php: Non sono riuscito a farlo andare con Asterisk 1.6. È scritto un po’ coi piedi..

Gli altri non li ho provati.

Fonti