Tag Archives: Asterisk

Trunk SIP multipli con FeePBX e HANGUPCAUSE = 21

Piccolo suggerimento che spiega come attivare due trunk SIP su FreePBX senza ricevere l’errore HANGUPCAUSE = 21.

Nel mio scenario i trunk erano tre e tutti provenienti dallo stesso provider, ogni provider aveva il suo prefisso di teleselezione.
Ho notato che i primi due non funzionavano, mentre il terzo sì. Provandoli singolarmente con un telefono VoIP funzionavano tutti senza problemi.
L’errore che riscontravo era “Dial failed for some reason with DIALSTATUS = CONGESTION and HANGUPCAUSE = 21”. Il SIP phone falliva la chiamata in uscita dando come errore “forbidden”.
Attivando il debug sulla shell di Asterisk.

sip set debug on

ho notato che ricevevo dal provider degli “access denied” o “login failed”. Ho controllato le credenziali ed ovviamente era tutto giusto.
Guardando su internet ho poi scoperto che con FreePBX (ma mi immagino anche con asterisk o altre soluzioni), in caso di trunk multipli, dobbiamo specificare anche l’utente da utilizzare. Andremo quindi nella sezione “Trunk”, selezioneremo il trunk desiderato e aggiungeremo l’opzione fromuser= nel form PEER details.
Questo è il mio box PEER details:

username=XXXXX
type=peer
secret=supersegreta
host=sip.myprovidervoip.com
insecure=very
dtmfmode=rfc2833
canreinvite=no
context=from-pstn
fromuser=XXXXX

Aggiungendo fromuser= ad ogni trunk, tutte e tre le linee telefoniche hanno iniziato a funzionare correttamente.

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