- 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
Editiamo il file extensions.conf e aggiungiamo al suo interno :
[fromsip]
exten=>_USERVOICEE,1,Dial(INTERNOTELEFONO)
E’ necessario sostituire USERVOICEE e PASSWORD con i dati del nostro account
Pe...