Il pacchetto truelite-phoneserver¶
Un centralino telefonico VoIP basato su Asterisk. La pacchettizzazione non è stata ancora realizzata.
L'idea è quella di avere un centralino telefonico flessibile e funzionante esclusivamente con software libero, in grado di gestire telefonate sia in ingresso che in uscita sui canali VoIP e PSTN standard.
Per la gestione della normale linea analogica PSTN abbiamo acquistato una scheda PCI TDM400P della Digium con due moduli FXO e due moduli FXS, i primi per gestire i telefoni analogici interni, gli altri per la connessione alla tradizionale rete telefonica.
Il centralino dovrà quindi:
- gestire la numerazione interna (ad ogni telefono voip corrisponderà un interno);
- permettere ai telefoni voip di chiamare quelli analogici e viceversa, su loop locale;
- permettere di creare degli alias con delle numerazioni interne che puntino ad altri numeri (IAX2, SIP, PSTN, cellulari);
- permettere di mettere le chiamate in attesa ed eventualmente girarle ad un altro numero;
- gestire le chiamate in ingresso, facendo suonare i telefoni degli interni desiderati;
- fornire una segreteria telefonica per ogni interno più una segreteria generale;
- gestire le chiamate in uscita utilizzando VoIP o PSTN a seconda della destinazione;
- permettere di creare delle teleconferenze ed eventualmente di registrarle;
- permettere di visualizzare i log per poter valutare i costi telefonici, anche agganciandoci un'applicazione esterna tramite AGI; http://www.snapvine.com/code/ragi
Come condizione di partenza si ipotizzerà una distribuzione debian sarge.
La prima cosa da fare è la compilazione dei moduli del kernel necessari all'utilizzo della scheda Digium; il sistema più comodo per farlo è utilizzando module-assistant che va quindi installato con:
apt-get install module-assistant
Una volta installato va lanciato (da root) con il comando module-assistant.
Le operazioni da eseguire sono, nell'ordine:
1. Update
1. Prepare
1. Select
1. Selezionare il modulo zaptel e confermare.
1. Get
1. Build
1. A questo punto viene chiesto se installare i moduli appena compilati, rispondere di si.
Il modulo da caricare per la scheda TDM400P è wcfxs, il comando è quindi
modprobe wcfxs
La versione di asterisk presente in sarge non è una delle ultime, quindi e' il caso di aggiungere un backport dei pacchetti della 1.2 e va quindi aggiunta al file /etc/apt/sources.list la seguente riga:
deb http://www.backports.org/debian/ sarge-backports main
Le seguenti righe invece vanno aggiunte al file /etc/apt/preferences per evitare che vengano aggiornati tutti i pacchetti presenti nel repository dei backport:
Package: * Pin: release a=sarge-backports Pin-Priority: 200 Package: asterisk Pin: release a=sarge-backports Pin-Priority: 999
A questo punto è possibile installare asterisk:
apt-get install asterisk asterisk-config asterisk-sounds-main
Dopo aver verificato il corretto avvio del server asterisk, è necessario definire quello che sarà il cosiddetto dialplan ed i vari contesti di provenienza e destinazione delle chiamate, in modo da avere un controllo granulare.
Il primo passo è però quello di configurare le varie connessioni disponibili..
Creiamo un contesto chiamato local a cui vanno aggiunti i dati relativi ai telefoni connessi localmente. Per la numerazione interna si e' scelto di utilizzare dei numeri a partire da 3000.
I telefoni VoIP a nostra disposizione utilizzano il protocollo IAX2, quindi i relativi dati vanno aggiunti nel file iax.conf
; File /etc/asterisk/iax.conf ; Imposta il linguaggio per tutti gli account language=it ; Con allow e disallow è possibile scegliere quali codec autorizzare allow=all disallow=g723.1 ;codec proprietari disallow=g729 ;codec proprietari ; I bit del TOS vanno impostati per la minima latenza tos=lowdelay ; A seguire vengono aggiunti gli account per i due telefoni iax2 [alessandro] type=friend ; Il tipo friend permette al telefono di ricevere ed effettuare chiamate host=dynamic ; Questa direttiva permette di utilizzare il telefono senza un ip fisso username=alessandro ; Nome utente per l'autenticazione secret=antani ; Password per l'autenticazione del telefono mailbox=3000 ; La mailbox associata a questo telefono context=default ; Il contesto predefinito per il telefono callerid="Alessandro Gervaso" <3000> ; L'identificazione chiamante in uscita dal telefono. permit=0.0.0.0/0.0.0.0 ; Questa direttiva specifica le reti da cui è autorizzato l'uso del telefono [christian] type=friend host=dynamic secret=antani mailbox=3001 context=default callerid="Christian Surchi" <3001> permit=0.0.0.0/0.0.0.0
La connettività per le telefonate VoIP in uscita utilizza il protocollo SIP. Volendo è anche possibile creare degli account SIP da utilizzare sia con dei softphones che con dei veri telefoni sip; il file da modificare è sip.conf
; File /etc/asterisk/sip.conf [general] ; Con allow e disallow è possibile scegliere quali codec autorizzare allow=all disallow=g723.1 ;codec proprietari disallow=g729 ;codec proprietari context = default musicclass = default ; Con register è possibile registrare un numero telefonico presso un provider esterno per ricevere le chiamate ; e girarle ad un numero locale, in questo caso 1234 ; la sintassi è "nomeutente:password@host/numero_locale" register => 055xxxxxxx:xxxxxxx@voip.eutelia.it/1234 ;externip = 0.0.0.0 ; Nel caso si fosse dietro NAT, va specificato l'ip pubblico ; da utilizzare nei messaggi SIP [eutelia-fi] type=peer ; Il tipo 'peer' ci permette di effettuare delle telefonate in uscita username=055xxxxxxx ; A seguire i dati per l'autenticazione fromuser=055xxxxxxx authname=055xxxxxxx secret=xxxxxxx fromdomain=voip.eutelia.it host=voip.eutelia.it context=incomingeutelia
Per gestire le chiamate in ingresso è comodo utilizzare una coda a cui possiamo aggiungere tutti i telefoni locali.
Il file in cui vengono definite le code è queues.conf
; File /etc/asterisk/queues.conf [truelite] ; Questo è il nome della coda strategy = ringall ; La strategia utilizzata per la gestione. In questo caso fa suonare tutti i telefoni timeout = 15 ; Il tempo di timeout prima che la chiamata venga fatta uscire dalla coda member => IAX2/alessandro ; A seguire vanno aggiunti i membri della coda, in questo caso i due telefoni [[VoIP]] member => IAX2/christian
Le caselle per la segreteria telefonica vanno definite nel file voicemail.conf.
Il numero assegnato ad ogni casella deve essere quello specificato negli account SIP o IAX2 ed il contesto deve essere lo stesso
; File /etc/asterisk/voicemail.conf [general] ; Formato per i file audio registrati in segreteria format=wav49|gsm|wav ; indirizzo email dal quale arriveranno le notifiche di presenza di messaggi in segreteria serveremail=asterisk@truelite.it ; Se impostata a yes, manda in allegato i messaggi presenti in segreteria. attach=yes ; Massima durata di un messaggio in secondi ;maxmessage=180 ; Durata minima in secondi di un messaggio per essere memorizzato ; Di default non c'è un valoro minimo. ;minmessage=3 ; Numero di secondi di silenzio dopo i quali viene interrotta la registrazione maxsilence=10 ; Silence threshold (what we consider silence, the lower, the more sensitive) silencethreshold=128 ; Massimo numero di tentativi di login errati maxlogins=3 ; Modifica il campo 'From' dell'email fromstring= Segreteria telefonica Truelite ; Permit finding entries for forward/compose from the directory ;usedirectory=yes ; ; Change the from, body and/or subject, variables: ; VM_NAME, VM_DUR, VM_MSGNUM, VM_MAILBOX, VM_CALLERID, VM_CIDNUM, ; VM_CIDNAME, VM_DATE ; ; Note: The emailbody config row can only be up to 512 characters due to a ; limitation in the Asterisk configuration subsystem. ;emailsubject=[PBX]: New message ${VM_MSGNUM} in mailbox ${VM_MAILBOX} ; The following definition is very close to the default, but the default shows ; just the CIDNAME, if it is not null, otherise just the CIDNUM, or "an unknown ; caller", if they are both null. ;emailbody=Dear ${VM_NAME}:\n\n\tjust wanted to let you know you were just left a ${VM_DUR} long message (number ${VM_MSGNUM})\nin mailbox ${VM_MAILBOX} from ${VM_CALLERID}, on ${VM_DATE}, so you might\nwant to check it when you get a chance. Thanks!\n\n\t\t\t\t--Asterisk\n ; ; You can also change the Pager From: string, the pager body and/or subject. ; The above defined variables also can be used here ;pagerfromstring=The Asterisk PBX ;pagersubject=New VM ;pagerbody=New ${VM_DUR} long msg in box ${VM_MAILBOX}\nfrom ${VM_CALLERID}, on ${VM_DATE} ; ; Set the date format on outgoing mails. Valid arguments can be found on the ; strftime(3) man page ; ; Default emaildateformat=%A, %B %d, %Y at %r ; 24h date format ;emaildateformat=%A, %d %B %Y at %H:%M:%S ; ; You can override the default program to send e-mail if you wish, too ; ;mailcmd=/usr/sbin/sendmail -t [default] ; contesto nel quale sono attive le mailbox definite a seguire 3000 => 1234,Alessandro Gervaso,alessandro@truelite.it ; La sintassi è la seguente: 3001 => 1234,Christian Surchi,christian@truelite.it ; casella => password,Nome e Cognome,indirizzo_email 1234 => 4242,Truelite Srl,info@truelite.it
Ovviamente è possibile personalizzare il messaggio email inviato dalla segreteria telefonica, ad esempio localizzandolo in italiano.
La configurazione della scheda DIGIUM tdm400p va fatta attraferso il file /etc/zaptel.conf
La nostra scheda ha 2 moduli FXS e due moduli FSO. Importante notare il fatto che il tipo di signalling da assegnare a ciascun modulo è esattamente il suo opposto: un modulo FXO dovrà avere signalling FXS.
# Questi parametri rispecchiano i moduli installati nella scheda: 1,2 FXS e 3,4 FXO fxoks=1-2 fxsks=3-4 # È poi possibile pre-caricare le impostazioni per una zona (it in questo caso) ed impostarla come default loadzone = it defaultzone = it
Va poi configurato il modulo Zapata per asterisk nel file /etc/asterisk/zapata.conf
[channels] signalling=fxo_ks echocancel=yes ; You can set this to 32, 64, or 128, tweak to your needs. echocancelwhenbridged=yes echotraining=400 ; Asterisk trains to the beginning of the call, number is in milliseconds callerid=asreceived group=1 context=default ; Points to the default context of your extensions.conf channel => 1-2 signalling=fxs_ks group=2 context=incoming-pstn channel=> 3-4 ;
Ora dobbiamo creare un database, in questo caso utilizzando mysql, per memorizzare i dati relativi alle chiamate effettuate e ricevute.
Successivamente va creato un database per asterisk e va popolato la tabella _cdr_. <pre> CREATE DATABASE asterisk; GRANT INSERT ON asterisk.* TO asterisk@localhost IDENTIFIED BY 'yourpassword'; USE asterisk; CREATE TABLE @cdr@ ( @uniqueid@ varchar(32) NOT NULL default _, @userfield@ varchar(255) NOT NULL default _, @accountcode@ varchar(20) NOT NULL default _, @lastdata@ varchar(80) NOT NULL default _, @calldate@ datetime NOT NULL default '0000-00-00 00:00:00', @amaflags@ int(11) NOT NULL default '0', @enddate@ datetime NOT NULL default '0000-00-00 00:00:00', @callerid@ varchar(80) NOT NULL default _, @callednumber@ varchar(80) NOT NULL default _, @ani@ varchar(80) NOT NULL default _, @calledcontext@ varchar(80) NOT NULL default _, @sourcechannel@ varchar(80) NOT NULL default _, @destinationchannel@ varchar(80) NOT NULL default _, @lastapplication@ varchar(80) NOT NULL default _, @callduration@ int(11) default NULL, @billableduration@ int(11) default NULL, @calldisposition@ varchar(80) NOT NULL default _, @destinationDescription@ varchar(80) NOT NULL default _, @callcost@ int(11) default NULL, @handlingsystem@ varchar(80) NOT NULL default _ ) ; </pre> Il passo successivo è quello di configurare asterisk per usare il database, fornendogli la posizione di questo ed le credenziali per l'accesso al database. <pre> [global] hostname=localhost dbname=asteriskcdrdb password=password ;poort=3306 ;sock=/tmp/mysql.sock </pre> Creare delle conference room usando [[MeetMe]] è molto semplice. Il file di configurazione è _/etc/asterisk/meetme.conf_ <pre> ; Configuration file for [[MeetMe]] simple conference rooms ; for Asterisk of course. ; [rooms] ; ; Usage is conf => confno,pincode,adminpin ; conf => 9000 conf => 9001,123456 conf => 9001,123456,654321 ; dal dialplan è poi sufficente assegnare la stanza ad un'estensione, ad esempio ; exten => 500,1,MeetMe(9001||123456) ; fa entrare l'utente che chiama l'estensione 500 nella stanza 9001 usando la password 123456 </pre> Il cuore di tutta la configurazione è il file _extensions.conf_ all'interno del quale viene definito il cosiddetto _dial plan_. Qui verranno configurati tutti i numeri degli interni e le eventuali azioni da eseguire a seguito di diverse chiamate, in base al destinatario, al mittente e ad altre variabili come il giorno della settimana e l'orario. <pre> CONFIGURAZIONE PROVVISORIA Il dialplan va ancora definito con precisione. A seguire ci sono una serie di estensioni utili per gestire le chiamate interne, quelle in arrivo dal voip e quelle in arrivo da pstn [general] static=yes ; These two lines prevent the command-line interface writeprotect=yes ; from overwriting the config file. Leave them here. [local] exten => 3000,1,Dial(IAX2/alessandro,20,tT) exten => 3000,2,VoiceMail(u3000) exten => 3000,102,Voicemail(b3000) exten => 3000,103,Hangup exten => 3001,1,Dial(IAX2/christian,20,Tt) exten => 3001,2,Voicemail(u3001) exten => 3001,102,Voicemail(b3001) exten => 3001,103,Hangup exten => 1000,1,Dial,Zap/1|20 ; Exten 1000 dials Zap channel 1 with a ring time option of 20 secs, which is the analog telephone plugged into the first port of the TDM400P. exten => 1000,2,Voicemail,u1000 exten => 1000,3,Hangup exten => 1000,102,Voicemail,b1000 exten => 1000,103,Hangup exten => 2000,1,Dial,Zap/2|20 exten => 2000,2,Voicemail,u2000 exten => 2000,3,Hangup exten => 2000,102,Voicemail,b2000 exten => 2000,103,Hangup [incoming-pstn] exten => s,1,Wait(1) exten => s,2,Dial(Zap/g1|20,t) ; Calls the first available channel in group 1 exten => s,3,Voicemail,u1234 ; Directs caller to unavailable voicemailbox 1234 exten => s,4,Hangup exten => s,103,Voicemail,b1234 ; Directs caller to busy voicemailbox 1234 exten => s,104,Hangup [incomingeutelia] ; chiamate provenienti dal gateway eutelia per il numero di firenze exten => 1234,1,Ringing exten => 1234,2,Queue(truelite|t|||15) ;la chiamata viene mandata alla coda "truelite" exten => 1234,3,Voicemail(u1234) exten => 1234,102,VoiceMail(b1234) exten => 1234,103,Hangup [daytime] include => local [nighttime] exten => s,1,Playback(after-hours-msg) ; qui va creato un IVR per la segreteria telefonica ; dare un'occhiata a questo: http://scottstuff.net/blog/articles/2004/06/17/asterisk-config-example ; ed a questo: http://users.pandora.be/Asterisk-PBX/IVR.htm [default] include => newyears||||1|jan include => daytime|8:55-19:00|mon-fri ;i numeri locali vengono "attivati" solamente durante l'orario lavorativo include => nighttime ;Qui vanno definite con precisione le numerazioni da chiamare, in base alla convenienza economica. exten => _9.,1,Dial(SIP/${EXTEN:1}@eutelia-out,30,rT) ;un 9 preposto al numero da chiamare usa il gateway voip di eutelia ;exten => _NXXXXXX,1,Dial(Zap/g2/${EXTEN}|20,t) ; Any 7-digit extension that doesnt start with one dials out using the first available channel in group 2 </pre> Una semplice segreteria telefonica che permette di lasciare messaggi a diverse caselle <pre> Exten => 4000,1,Answer Exten => 4000,2,SetMusicOnHold(default) Exten => 4000,3,DigitTimeout,5 Exten => 4000,4,ResponseTimeout,10 Exten => 4000,5,Background(greeting) ; questo messaggio deve spiegare a che caselle corrispondono i vari tasti Exten => 1,1,Playback(secr) ; premendo il tasto 1 viene riprodotto il file secr.gsm e poi viene chiamata l'estensione 4001 Exten => 1,2,Dial(4001/20) Exten => 2,1,Playback(marketing) Exten => 2,2,Dial(4002/20) Exten => 3,1,Playback(support) Exten => 3,2,Dial(4003/20) Exten => 4,1,Playback(operator) Exten => 4,2,Dial(4004/20) ; è inoltre possibile creare un'estensione che permetta di registrare dei messaggi ; il messaggio viene registrato dopo il segnale acustico e la registrazione termina alla pressione del tasto "#" Exten => 9205,1,Wait(2) Exten => 9205,2,Record(/tmp/asterisk-recording:gsm) Exten => 9205,3,Wait(2) Exten => 9205,4,Playback (/tmp/asterisk-recording) Exten => 9205,5,wait(2) Exten => 9205,6,Hangup </pre>
Updated by Amministratore Truelite over 16 years ago · 2 revisions