Project

General

Profile

Actions

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