- 94 KB

Transcript

- 94 KB
“ASTERISK CONTEGGI E GESTIONE DELLE
CHIAMATE”
PROGETTO V.O.C.I.
HOWTO
“CONTEGGIO E GESTIONE DELLE CHIAMATE ATTIVE”
N O M E
D A T A
F I L E
:
A T T I V I T À
U R L
Asterisk_Conteggi_e_Gestione_Chiamate.doc
15/09/2009
:
S T A T O
:
:
:
A U T O R E
/
I
:
Gruppo VoIP
ABSTRACT:
Il presente documento contiene l’howto per l’implementazione di meccanismi di conteggio delle chiamate
basati su gruppi, la gestione di soglie sul numero di chiamate attive e la rilevazione del numero di chiamate
attive tramite script esterni.
ASTERISK_CONTEGGI_E_GESTIONE_CHIAMATE.DOC
1/8
“ASTERISK CONTEGGI E GESTIONE DELLE
CHIAMATE”
INDICE
INTRODUZIONE............................................................................................................................... 3
1. CONTEGGIO DELLE CHIAMATE ATTIVE E POLITICHE DI ACCETTAZIONE ............................................ 4
2. RILEVAZIONE DA SCRIPT ESTERNI DEL NUMERO DI CHIAMATE ATTIVE ............................................. 5
ASTERISK_CONTEGGI_E_GESTIONE_CHIAMATE.DOC
2/8
“ASTERISK CONTEGGI E GESTIONE DELLE
CHIAMATE”
INTRODUZIONE
Il documento contiene l’howto per l’implementazione di meccanismi di conteggio delle chiamate basati su
gruppi, la gestione di soglie sul numero di chiamate attive e la rilevazione del numero di chiamate attive
tramite script esterni. In Asterisk è possibile rilevare il numero di chiamate attive per una certa tipologia di
canale del chiamante, del chiamato o per la combinazione di questi direttamente da script esterni tramite
AMI (Asterisk Manager Interface). In Figura 1 è mostrato uno schema delle API (Application Programming
Interface) disponibili in Asterisk.
Figura 1 Schema delle interazioni tra script esterni e server Asterisk tramite AMI e AGI
Le AMI (Asterisk Manager Interface) consentono a script esterni di inviare comandi all’IP-PBX Asterisk; le
AMI (Asterisk Manager Interface) consentono ad Asterisk di eseguire script esterni direttamente dal dialplan
eventualmente fornendo degli argomenti. Una alternativa alla implementazione descritta nell’howto sarebbe
la esecuzione di “select” dalla tabella CDR (Call Detail Recording) ma con la possibilità di avere risultati
non coincidenti dato che Asterisk esegue le operazioni di accounting al termine di ciascuna chiamata. Le
configurazioni allegate possono essere applicate alle release Asterisk “1.2.X, 1.4.X, 1.6.X”.
ASTERISK_CONTEGGI_E_GESTIONE_CHIAMATE.DOC
3/8
“ASTERISK CONTEGGI E GESTIONE DELLE
CHIAMATE”
1. CONTEGGIO DELLE
ACCETTAZIONE
CHIAMATE
ATTIVE
E
POLITICHE
DI
La realizzazione di policy di accettazione delle chiamate può essere eseguita in varie forme. Nell’howto sarà
commentata quella basata sui gruppi. La possibilità di definire una “etichetta” che associa a ciascuna
chiamata attiva un “group-ID” consente di eseguire delle operazioni di gestione sulle chiamate in corso. La
funzione “Set(GROUP=group_id)” permette di associare la chiamata al gruppo con identificatore
“group_id”. In Asterisk é disponibile una funzione per calcolare il numero di chiamate che condividono lo
stesso “group_id”: ”Group_Count”. Essa “ritorna” il numero di chiamate attive appartenenti al gruppo
indicato tra parentesi. Dalla rilevazione del numero di connessioni attualmente afferenti al gruppo etichettato
“gr”, é possibile accettare/rifiutare nuovi ingressi implementando una semplice policy di controllo basata sul
confronto con una soglia predefinita. In è allegato l’estratto di dialplan relativo al controllo del numero di
chiamate per la estensione “my_exten” appartenente al contesto “my_context”.
[my_context]
exten => my_exten,n,Set(GROUP()=gr)
exten => my_exten,n,
GotoIf($[${GROUP_COUNT(gr)} > 3 ]?nonconsentito)
….
exten => my_exten,n,Dial(SIP/${EXTEN}@server,10)
exten => my_exten,n,Hangup()
exten => my_exten,n(nonconsentito),Background(/root/suoniAst/gr_rifiuta)
exten => my_exten,n,Hangup()
Tabella 1 Estratto del file “extensions.conf”
In Tabella 1 è riportato l’esempio di tre chiamate simultanee e l’istruzione di “salto condizionale” consente
di eseguire la funzione “Background” al raggiungimento della soglia (nel caso rappresentato pari a 3). In essa
è specificato il path di un file audio (/root/suoniAst/gr_rifiuta) da riprodurre prima di terminare la chiamata.
Il file va registrato appositamente in quanto non presente nella directory ”/var/spool/asterisk/sounds”.
ASTERISK_CONTEGGI_E_GESTIONE_CHIAMATE.DOC
4/8
“ASTERISK CONTEGGI E GESTIONE DELLE
CHIAMATE”
2. RILEVAZIONE DA SCRIPT ESTERNI DEL NUMERO DI CHIAMATE
ATTIVE
L’howto prevede l’interazione tra uno script esterno e l’IP-PBX tramite “astdb1”. L'estratto di codice allegato
in Tabella 3 é relativo alla definizione su DB interno, di una “family, key, value” riservata alla registrazione
del numero di connessioni attive nel gruppo “gr”. L’aspetto che si evidenzia nell’howto consiste nella
associazione della etichetta “gr” ad ogni chiamata che appartiene ad una data tipologia (ad esempio le
chiamate entranti da esterni VoIP). La stessa etichetta è associata ad un’estensione di servizio “from_script”
impiegata dallo script esterno per calcolare in numero di chiamate attive nell’IP-PBX ed appartenenti al
gruppo “gr”. La Tabella 2 contiene una possibile implementazione per l’estensione “from_script”. La
chiamata di questa estensione provoca l’associazione della telefonata in corso, al gruppo “gr” tramite
l’istruzione presente alla priorità “1”. In questo modo la funzione “GROUP_COUNT” presente alla priorità
“2” potrà “ritornare” il numero di chiamate attive nel gruppo “gr”. La sottrazione di “uno” dal valore
ottenuto è necessaria al fine di escludere dal conteggio la chiamata generata dallo script esterno. Il risultato è
registrato nell’astdb in corrispondenza della family “conteggi”, associandolo alla chiave “tipologia1”. La
lettura del numero di chiamate attive richiede quindi di generare una telefonata all’estensione “from_script”
al fine di aggiornare il valore presente nell’astdb con il valore attuale. Una possibile implementazione dello
script esterno è allegata in Tabella 3.
[monitoring]
exten => from_script,1,Set(GROUP()=gr)
exten => from_script,n,Set(DB(conteggi/tipologia1)=[{GROUP_COUNT(gr)}-1])
; il -1 sottrae la chiamata di monitoring dal computo del numero di membri del gruppo “gr”
exten => from_script,n,Hangup()
exten => monitoring,1,Answer()
exten => monitoring,n,Wait(10)
exten => monitoring,n,Hangup()
Tabella 2 Estratto del file “extensions.conf”
Lo script di Tabella 3 è composto da tre sezioni dedicate a:
1. aggiornare l’astdb con il valore nel numero di chiamate attive appartenenti al gruppo “gr”,
2. leggere il valore del numero di chiamate attive dall’astdb,
3. elaborare il valore letto.
<?php
#sezione 1: aggiornamento del valore presente nell’astdb
echo`expect /path/to/my/expect/script/to/read/from/astdb/value.exp`;
#sezione 2: lettura del valore presente nell’astdb
ob_start();
echo `/usr/sbin/asterisk -rx "database get family key value`;
$comm=ob_get_contents();
1
L’astdb é composto da terne: “family key value”. Le coppie “key - value” sono raggruppate in insiemi
denominati “family”.
ASTERISK_CONTEGGI_E_GESTIONE_CHIAMATE.DOC
5/8
“ASTERISK CONTEGGI E GESTIONE DELLE
CHIAMATE”
list($pre,$post)=split('Value: ',$comm);
ob_end_clean();
#sezione 3
#in questa sezione va implementata la gestione del valore letto dall’astdb
?>
Tabella 3 Estratto di uno script di post-processamento
La lettura da “astdb” può essere eseguita, come indicato nella prima sezione dell’estratto di Tabella 3, da uno
script “expect”. Una possibile implementazione di questo è allegata in Tabella 4.
#!/usr/bin/expect
############################SCRIPT
VALUE.EXP#######################
# The user account from manager.conf:
set username "asterisk_pri1"
set secret "my_secret"
set host "ip_address_”
set port "5038"
expect_before eof {
send_user "Failed to connect.\n"
exit 1
}
# Wait for the text "Manager"; once received, send a login packet:
#
expect "Manager" {
send_user "Connected.\n"
send "Action: Login\nUsername: $username\nSecret: $secret\n\n"
# Please note that telnet automatically converts line feeds
# (\n) to CR LF (\r\n) - so you must not write \r\n here.
}
# Login successful?:
#
expect {
-re "Response:\\s*Error" {
send_user "Login failed.\n"
exit 1
}
-re "Response:\\s*Success" {
send_user "Logged in.\n"
}
}
expect "accepted" {
send "Action: originate\nChannel: Local/conteggi@monitoring\nContext: monitoring\nExten: fromscript\nPriority: 1\nCallerid: Conteggio chiamate del gruppo gr\n ActionID:3\n\n"
}
expect {
-re "Response:\\s*Error" {
send_user "Login failed.\n"
ASTERISK_CONTEGGI_E_GESTIONE_CHIAMATE.DOC
6/8
“ASTERISK CONTEGGI E GESTIONE DELLE
CHIAMATE”
exit 1
}
-re "Response:\\s*Success" {
send_user "OK.\n"
}
}
# Log out -- not strictly necessary, but cleaner:
send "Action: Logoff\n\n"
Tabella 4 Estratto di uno script “expect” per la lettura da “astdb”
Lo script di Tabella 4 genera una chiamata verso l’estensione “from_script” per aggiornare il valore del
contatore del numero di chiamate appartenenti al gruppo “gr”. A questo punto è sufficiente leggere dall’astdb
il valore aggiornato del contatore ed eseguirne il processamento. Un esempio d’applicazione delle
configurazioni commentate è allegato in Tabella 5 per il conteggio delle chiamate entranti da esterni VoIP e
la generazione di una e-mail contenente il valore letto.
#estratto del file /etc/asterisk/sip.conf
[general]
context=from_voip_external
# estratto del file /etc/asterisk/extensions.conf
[from_voip_external]
Exten => _[a-zA-Z0-9].,1, Set(GROUP()=chiamate_da_voip_esterni)
Exten => _[a-zA-Z0-9],n,Goto(internal_user,${EXTEN},1)
[monitoring]
exten => from_script,1,Set(GROUP()=chiamate_da_voip_esterni)
exten =>
from_script,n,Set(DB(conteggi/DaVoIPEsterni)=[{GROUP_COUNT(chiamate_da_voip_esterni)}-1])
; il -1 sottrae la chiamata di monitoring dal computo del numero di membri del gruppo “gr”
exten => from_script,n,Hangup()
exten => monitoring,1,Answer()
exten => monitoring,n,Wait(10)
exten => monitoring,n,Hangup()
Tabella 5 Estratti dei file “/etc/asterisk/sip.conf” ed “/etc/asterisk/extensions.conf”
Lo script di gestione del numero di chiamate è allegato in Tabella 6.
<?php
#sezione 1: aggiornamento del valore presente nell’astdb
echo`expect /path/to/my/expect/script/to/read/from/astdb/value.exp`;
#sezione 2: lettura del valore presente nell’astdb
ob_start();
echo `/usr/sbin/asterisk -rx "database get conteggi DaVoIPEsterni"`;
$comm=ob_get_contents();
ASTERISK_CONTEGGI_E_GESTIONE_CHIAMATE.DOC
7/8
“ASTERISK CONTEGGI E GESTIONE DELLE
CHIAMATE”
list($pre,$post)=split('Value: ',$comm);
ob_end_clean();
#sezione 3
#invio della email
$to = "username@email_domain";
$subject = "Asterisk monitoring@ Asterisk";
$body=”Nell’IP-PBX Asterisk sono state rilevate ”. $comm.”telefonate entranti da esterni VoIP”;
if (mail($to, $subject, $body)) {
echo("<p>Message successfully sent!</p>");
} else {
echo("<p>Message delivery failed...</p>");
}?>
Tabella 6 Estratto di uno script di gestione del numero di chiamate da esterni VoIP
ASTERISK_CONTEGGI_E_GESTIONE_CHIAMATE.DOC
8/8

Documenti analoghi

Asterisk - Voicee.net

Asterisk - Voicee.net Editiamo il file extensions.conf e aggiungiamo al suo interno : [from­sip] exten=>_USERVOICEE,1,Dial(INTERNOTELEFONO) E’ necessario sostituire USERVOICEE e PASSWORD con i dati del nostro account Pe...

Dettagli

- 222 KB

- 222 KB presentare al chiamante gli interni “fisso”,“VoIP” associati al cognome desiderato invitando alla selezione di quello desiderato. A questo punto la chiamata prosegue secondo la selezione fornita. L...

Dettagli