Project

General

Profile

Actions

Truelite Phone Server

Avvertenze

Questo è un pacchetto fittizio, non esiste una pacchettizazione di Asterisk, restano associate a questa voce solo della documentazione tecnica relativa ad Asterisk.

Introduzione

Documentazione tecnica che descrive la realizzazione dell'attuale centralino VoIP presente in sede truelite a Firenze.

Risorse Utilizzate

Configurazione Hardware

  • Server Dell
  • Scheda Digium TM400P per connessione con la telefonia analogica.
  • Telefoni IP basati su chip PA168S con firmware v 1.53 "h3. Configurazione Software
  • Debian GNU/Linux 3.1 (Sarge)
  • Kernel 2.6.8-3-686-smp
  • Asterisk 1.2.10-BRIstuffed-0.3.0-PRE-1q

Requisiti Individuati (analisi macroscopica)

1. Realizzazione del traffico voce interno.
1. Realizzazione del servizio di vocemail personale e azienndale.
1. Realizzazione di un menu IVR per lo smistamento delle chiamate
1. Integrazione con il servizio di telefonia [[VoIP]] di eutelia.
1. Integrazione con il servizio di telefonia PSTN di telecom italia.
1. Integrazione con i telefoni analogici esistenti.
1. Integrazione con i directory services aziendali (rubrica LDAP).

Configurazioni del sistema operativo

zaptel.conf

Configurazione di zaptel per la gestione della scheda Digium TM400P.

# Questi parametri rispecchiano i moduli installati nella scheda:
# 1,2 FXS e 3,4 FXO. Viene specificato il tipo di signalling 
# per ogni tipologia di porta.

fxsks=1-2
fxoks=3-4

# E@poi possibile pre-caricare le impostazioni per una zona 
#(it in questo caso) ed impostarla come default

loadzone = it
defaultzone = it

...*aggiungere note di Christopher sul kernel*...

Configurazioni di Asterisk

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

zapata.conf

Questo file di configurazione contiene i parametri per utilizzare chan_zap, il canale di asterisk dedicato a zaptel. In questo file vengono specificate le opzioni relative la scheda Digium TM400P.
Questa scheda gestisce il collegamento con la borchia ISDN (in modalità analogica) e il collegamento con i telefoni analogici cordless. Bisogna quindi configurare il contesto channels in cui si impostano i parametri relativi ai vari canali della scheda Digium.

[channels]

;; specifico la lingua di default
language=it

;; configuro i canali con signaling FXO
;; associati alle porte cui attacchiamo i telefoni
signalling=fxo_ks

;; abilito la cancellazione dell'eco
echocancel=yes
echocancelwhenbridged=yes

;; specifico il numero di millisecondi (400)
;; utilizzati da asterisk per correggere l'eco
echotraining=400 

;; definisco un gruppo di canali
group=1

;; specifico a che context (vedi extensions.conf) 
;; vengono redirette le chiamate provenienti da questi canali
context=truelite-firenze

;; definisco un callerid unico per tutte le chiamate
;; provenienti da questi canali
callerid=<101>

;; definisco la casella vocale predefinita per questi canali
mailbox = 101

;; definisco i canali zaptel appartenenti al gruppo
;; solo uno nel nostro caso.
channel => 4

;; configuro i canali con signaling FXS
;; associati alle porte cui attacchiamo la borchia ISDN
signalling=fxs_ks

;; imposto una sensibilita@ minore ai DTMF
;; per farli riconoscere meglio
relaxdtmf=yes

;; abilito la cancellazione dell'eco
echocancel=yes
echocancelwhenbridged=yes

;; definisco un gruppo di canali
group=2

;; definisco il volume sul segnale in ricezione
rxgain=6.0

;; specifico a che context (vedi extensions.conf)
;; vengono inoltrate le chiamate provenienti da questi canali
context=incoming-pstn

;; abilito il monitoring della chiamata
;; da parte di asterisk
callprogress=yes

;; questo aiuta a capire se la telefonata
;; e@ finita e libera il canale
busydetect=yes

;; tento di mantenere il callerid esterno
callerid=asreceived
usecallerid=yes
hidecallerid=no

;; abilito la chiamata a 3
threewaycalling=yes

;; abilito il trasferimento di chiamata
transfer=yes

;; specifico i canali membri del gruppo
;; due in questo caso
channel => 1-2 


iax.conf

Questo file contiene le configurazioni di IAX, il protocollo per le comunicazioni Inter Asterisk.

Per ora non abbiamo trovato un modo per integrare l'autenticazione con LDAP, quindi anche gli utenti sono stati creati qui. Di conseguenza i telefoni IP dovranno utilizzare un firmware capace di supportare il protocollo IAX.

[general]
; Imposta il linguaggio per tutti gli account
language=it

; Con allow e disallow e@ 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 telefoni iax2

[cgabriel]

; Il tipo friend permette al telefono di ricevere 
; ed effettuare chiamate
type=friend

; Questa direttiva permette di utilizzare il telefono 
; senza un ip fisso
host=dynamic

; Nome utente per l'autenticazione
username=cgabriel

; Password per l'autenticazione del telefono
secret=antani

; La mailbox associata a questo telefono
mailbox=102

; Il contesto predefinito per il telefono
context=truelite-firenze

; Questa direttiva specifica le reti da cui e@ autorizzato
; l'uso del telefono
permit=0.0.0.0/0.0.0.0                  

[csurchi]
type=friend                             
host=dynamic                            
username=csurchi                       
secret=antani                           
mailbox=103                             
context=truelite-firenze                
permit=0.0.0.0/0.0.0.0                  

[piccardi]
type=friend                             
host=dynamic                            
username=piccardi
secret=antani
mailbox=104
context=truelite-firenze
permit=0.0.0.0/0.0.0.0

[chiara]
type=friend                             
host=dynamic                           
username=chiara
secret=antani 
mailbox=105                       
context=truelite-firenze  
permit=0.0.0.0/0.0.0.0                  

sip.conf

Questo file contiene le configurazioni del protocollo SIP. In particolare esso viene utilizzato per la sottoscrizione di account con eutelia. Il gestore telefonico infatti fornisce numerazioni nazionali gratuite gestibili tramite VoIP dal nostro PBX.

Inoltre sip.conf contiene le definizioni degli account sip interni utilizzabili dai client in maniera del tutto analoga a quanto avviene per il protocollo IAX.

[general]
; Con allow e disallow e' possibile scegliere quali codec autorizzare
allow=all
disallow=g723.1 ;codec proprietari
disallow=g729   ;codec proprietari

; facciamoci riconoscere
useragent=Truelite Phone Server

defaultexpiry=300
maxexpiry=300

;; il nostro context di default
context = incoming-eutelia
;musicclass = default

;; configurazioni della rete.
port = 5060
bindaddr=192.168.1.2
nat=1
externip = 217.133.96.194

localnet=192.168.0.0/255.255.0.0; All RFC 1918 addresses are local networks
localnet=10.0.0.0/255.0.0.0    ; Also RFC1918
localnet=172.16.0.0/12         ; Another RFC1918 with CIDR notation
localnet=169.254.0.0/255.255.0.0 ;Zero conf local network

;; qui definiamo le sottoscrizioni con eutelia.

; christopher privato
register => 0553986920:xxxxx@voip.eutelia.it/3000

; truelite su bolzano
register => 04711885142:xxxxx@voip.eutelia.it/4000

; truelite su firenze
register => 0555357742:xxxxx@voip.eutelia.it/5000

; christopher privato parma
register => 05211856113:xxxxx@voip.eutelia.it/6000

[csurchi]
type=friend
mailbox=103
username=csurchi
secret=antani
host=dynamic
context=truelite-firenze

[iacopo]
type=friend
mailbox=106
username=iacopo
secret=antani
host=dynamic
context=truelite-firenze

ldap.conf

Questo file di configurazione contiene le direttive per il supporto di LDAP. In particolare specifica l'effetto delle chiamate LDAPget() presenti in extensions.conf. LDAP viene utilizzato per cercare il mittente della chiamata tra i contatti in rubrica. Sono stati specificati qui due contesti diversi corrispondenti a query LDAP diverse, una per le chiamate interne, uno per quelle esterne.

[interno]
host = localhost
version = 3
user = 
pass = 
base = ou=Contacts,dc=truelite,dc=it
filter = (&(objectClass=person)(companyPhone=%s))
attribute = cn
convert = UTF-8, ISO-8859-1

[esterno]
host = localhost
version = 3
user = 
pass = 
base = ou=Contacts,dc=truelite,dc=it
filter = (&(objectClass=person)(|(telephoneNumber=*%s)(mobile=*%s)(fax=*%s)))
attribute = cn
convert = UTF-8, ISO-8859-1

indications.conf

Questo file specifica il tipo di toni di controllo da utilizzare. Essi variano di nazione in nazione. Essendo presenti le configurazoni per tutti i paesi supportati da asterisk basta specificare country=it nel conesto [general] e verra` attivata la lista di toni per l'Italia.


musiconhold.conf

Il musiconhold contiene le direttive per la gestione della musica d'attesa. La musica parte in qualsiasi situazione ci sia attesa, quindi per il trasferimento, per l'attesa in una "coda" o per un semplice "hold" della chiamata. Si specifica qui la directory dove sono contenuti i files da riprodurre in ordine casuale.

[default]
mode=files
directory=/usr/share/asterisk/moh-native
random=yes

queues.conf

Queues.conf contiene le direttive relative le code. Esse sono liste di chiamate la cui priorita@ si basa sull'ordine di arrivo. Le chiamate sono prelevate dalle code da uno qualsiasi degli account membri liberi.

[general]

;; i membri non cambiano
persistentmembers = yes

;; nome della coda
[tutti]
;; fa suonare tutti gli account membri
strategy = ringall
;; timeout in secondi
timeout = 15
;; elenco degli account membri che possono prelevare
;; chiamate dalla coda
member = IAX2/cgabriel
member = IAX2/csurchi
member = IAX2/piccardi
member = IAX2/chiara
member = Zap/4

[centralino]
strategy = ringall
timeout = 15
member = IAX2/cgabriel
member = IAX2/csurchi
member = IAX2/piccardi
member = IAX2/chiara
member = Zap/4

[sistemi]
strategy = ringall
timeout = 15
member = IAX2/piccardi

[amministrazione]
strategy = ringall
timeout = 15
member = IAX2/chiara

[commerciale]
strategy = ringall
timeout = 15
member = IAX2/csurchi

extensions.conf

Il file di extensions va considerato il piu' importante nella configurazione di asterisk. Esso implementa l'organizzazione delle chiamate. Qui sono state definite delle direttive di base per fornire il servizio di fonia interna e sono state poi implementate delle funzioni (macro in gergo asterisk) utili per riutilizzare porzioni di configurazione. Potremmo dire che il file di extensions descrive come deve avvenire il routing delle chiamate.

La forma delle direttive è la seguente:

exten => numero, step di esecuzione, azione

Con numero intendiamo quello che viene richiesto da un membro di quel contesto. Step di esecuzione è un intero che ordina l'esecuzione delle direttive con numero uguale. Azione è la funzione standard di asterisk o la marco definita dall'utente che vogliamo sia invocata selezionando quel numero. In altre parole, se un client SIP o IAX digita sulla sua tastiera il numero 666 e appartiene al contesto pippo, la direttiva in [pippo] della forma:

exten => 666,1,Dial(SIP/pluto)

definisce l'azione da intraprendere se viene selezionato il numero 666 (in questo caso chiamare l'account sip con nome utente pluto). Se poi successivamente viene inserita una direttiva:

exten => 666,2,Hangup()

allora quando la funzione Dial() dello step 1 ritorna, verrà eseguita la funzione Hangup(). Per evitare noiosi riordinamenti delle direttive, soprattutto nel caso dei configurazioni piu' complesse, è disponibile lo step wildcard 'n' utilizzabile dal secondo in poi (cioè dev'esserci sempre uno step 1 iniziale).

Caso specifico è costituito dalle macro. Esse sono invocate come normali funzioni con la seguente sintassi:

Macro(nomemacro,parametro1,parametro2,...)

con un numero a piacere di parametri.

Quando la macro viene definita, deve gestire i parametri formali che le vengono passati. La sua definizione, che avviene con una direttiva di contesto, ha questa sintassi:

[macro-nomemacro]
exten => .....
exten => .....

Bisogna citare infine le direttive di inclusione. Esse permettono di dare visibilità al namespace degli altri contesti. Cioè permettono ai client membri di utilizzare direttive configurate altrove. L'inclusione di truelite-padova in truelite-firenze, per esempio, permette a chi utilizza come contesto di default truelite-firenze, di raggiungere le direttive configurate in truelite-padova.

;; come ogni file di configurazione di asterisk, anche
;; extensions.conf e@ organizzato per contesti.
;; general contiene le direttive globali.

[general]

static=yes       ; These two lines prevent the command-line interface
writeprotect=yes ; from overwriting the config file. Leave them here.

;; iniziamo con il configurare i contesti relativi agli account voip
;; sottoscritti con eutelia (skypho). 
;; In sip.conf sono state rimappate tutte le chiamate ai numeri eutelia
;; a specifici numeri interni, cosi@ da poter essere gestiti da asterisk.

;;;;;;;;;;;;;;;;;;;;;;;;;
; INGRESSO VOIP EUTELIA ;
;;;;;;;;;;;;;;;;;;;;;;;;;

[incoming-eutelia]

; account eutelia personale di Christopher su firenze
exten => 3000,1,Macro(rubrica-esterna,102,IAX2/cgabriel)
exten => 3000,n,Hangup()

; account eutelia Truelite di Bolzano
;exten => 4000,1,Macro(squilla-tutti,101,centralino)
exten => 4000,1,Answer()
exten => 4000,2,Ringing
exten => 4000,3,wait(2)
exten => 4000,4,Goto(mainmenu,s,1)
exten => 4000,n,Hangup()

; account eutelia Truelite di Firenze
;exten => 5000,1,Macro(squilla-tutti,101,centralino)
exten => 5000,1,Answer()
exten => 5000,2,Ringing
exten => 5000,3,wait(2)
exten => 5000,4,Goto(mainmenu,s,1)
exten => 5000,n,Hangup()

; account eutelia personale di Christopher su parma
exten => 6000,1,Macro(rubrica-esterna,102,IAX2/cgabriel)
exten => 6000,n,Hangup()

;; nel context successivo sono configurate le direttive per 
;; ricevere le telefonate provenienti dalla linea analogica.
;; questo context riceve richieste direttamente e solamente
;; dal modulo zaptel, utilizzato dalla scheda Digium.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; INGRESSO PSTN BORCHIA TELECOM ;
; (055-7879597)                 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

[incoming-pstn]

; redirige tutte le chiamate al menu IVR (interactive voice response)

;exten => s,1,Macro(squilla-tutti,101,centralino)
exten => s,1,Goto(mainmenu,s,1)
exten => s,2,Hangup()

;; qui vengono configurati gli interni dell'ufficio di firenze.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; CONTEXT DEGLI INTERNI FIRENZE ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

[truelite-firenze]

; inclusione del context implicito per le 
; chiamate in park (vedi features.conf)

include => parkedcalls
include => truelite-padova

;mapping degli interni e degli account

exten => 101,1,Macro(rubrica-interna,101,Zap/4|20,t)    ; cordless
exten => 102,1,Macro(rubrica-interna,102,IAX2/cgabriel) ; phone-01
exten => 103,1,Macro(rubrica-interna,103,SIP/csurchi)  ; phone-02
exten => 104,1,Macro(rubrica-interna,104,IAX2/piccardi) ; phone-03
exten => 105,1,Macro(rubrica-interna,105,IAX2/chiara)   ; phone-04
exten => 106,1,Macro(rubrica-interna,106,SIP/iacopo) ; Iacopo softphone
exten => 107,1,Macro(rubrica-interna,106,SIP/cgabriel2) ; Cgabriel softphone

; Accesso alle caselle di voicemail

exten => 000,1,VoiceMailMain(@default)

; Accesso al registratore

exten => 001,1,Goto(registratore,s,1)
exten => 002,1,Goto(mainmenu,s,1)

; Accesso alla linea esterna VOIP di eutelia con il prepend del numero 9

;exten => _9.,1,ChanIsAvail(SIP/0555357742:@voip.eutelia.it)
;exten => _9.,2,Dial(SIP/${EXTEN:1}@eutelia-fi-out,20,tTr)
;exten => _9.,102,Playback(/usr/share/asterisk/sounds/custom/busy-lines)
;exten => _9.,103,Hangup

; Accesso alla linea esterna PSTN di telecom con il prepend del numero 0

exten => _0.,1,ChanIsAvail(Zap/1)
exten => _0.,2,Dial(Zap/1/${EXTEN:1}|20,t) ;uno 0 preposto al numero da chiamare usa il gateway PSTN

exten => _0.,102,Playback(/usr/share/asterisk/sounds/custom/busy-lines)
exten => _0.,103,Hangup

; In caso di timeout riaggancia

exten => t,1,Hangup()

[truelite-padova]

;inclusione del context implicito per le chiamate in park (vedi features.conf)

include => parkedcalls
;include => truelite-firenze

;mapping degli interni e degli account

;exten => 201,1,Macro(rubrica-interna,201,SIP/0497967279@eutelia-fi-out)        ; dido
;exten => 202,1,Macro(rubrica-interna,202,SIP/0498592021@eutelia-fi-out)        ; luba

Essendo che il file di configurazione delle extensions è molto lungo e sarebbe inutile riportarlo qui per intero, dato che in varie parti ripete concetti già' esperessi, riporterò ora la configurazione del menu IVR.

;; definisce il blcco di configurazione del menu
[mainmenu]

;; 's' indica che questi step vanno eseguiti subito 
;; per ogni extension richiesta. diciamo che quello 
;; che viene specificato con 's' accade per ogni chiamata 
;; che arriva a mainmenu.

;; risponde alla chiamata
exten => s,1,Answer

;; definisce variabili locali: il timeout tra le cifre dei toni
;; e il timeout di attesa di una scelta.
exten => s,2,Set(TIMEOUT(digit)=5)
exten => s,3,Set(TIMEOUT(response)=5)

;; riproduce dei messaggi registrati in background
;; mantenendo possibile effettuare una scelta durante l'ascolto
exten => s,4,Background(/usr/share/asterisk/sounds/custom/menu-welcome)
exten => s,5,Background(/usr/share/asterisk/sounds/custom/menu-choose)

;; gestisce la scelta di menu (1 2 o 3)
exten => 1,1,Macro(scelta-menu,1001,commerciale)
exten => 2,1,Macro(scelta-menu,1002,sistemi)
exten => 3,1,Macro(scelta-menu,1003,amministrazione)

;; cazzate giusto per divertirsi
exten => 42,1,PlayBack(/usr/share/asterisk/sounds/custom/menu-haicapitotutto)
exten => 69,1,PlayBack(/usr/share/asterisk/sounds/custom/i-want-a-new-drug)

;; se invece di una scelta di menu, conosciamo l'interno desiderato
;; instrada la chiamata all'interno richiesto.
exten => 101,1,Macro(rubrica-esterna,101,Zap/4)
exten => 102,1,Macro(rubrica-esterna,102,IAX2/cgabriel)
exten => 103,1,Macro(rubrica-esterna,103,SIP/csurchi)
exten => 104,1,Macro(rubrica-esterna,104,IAX2/piccardi)
exten => 105,1,Macro(rubrica-esterna,105,IAX2/chiara)
exten => 106,1,Macro(rubrica-esterna,106,SIP/iacopo)
exten => 107,1,Macro(rubrica-esterna,106,SIP/cgabriel2)

;; con 't' si configura l'azione da intraprendere
;; in caso di timeout. Se non scegli, passa a ringall
exten => t,1,Macro(squilla-tutti,101,tutti)
exten => t,2,Hangup

;; con 'i' si configura l'azione da intraprendere in caso
;; di errore.
exten => i,1,Playback(/usr/share/asterisk/sounds/custom/menu-invalid)
exten => i,2,Goto(s,5)  ; "That's not valid, try again" 

Concludo riportando le configurazioni delle macro principali. Esse sono una buona pratica, in quanto permettono una facile organizzazione delle configurazioni e il riuso del codice. Scrivere esplicitamente tutte le direttive supportete dalle macro comporterebbe la redazione di un extensions.conf di qualche megabyte.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; MACRO CHIAMATA CON RUBRICA ESTERNA ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; nome della macro
[macro-rubrica-esterna]

;; ricerca il numero del chiamante in ldap.
exten => s,1,LDAPget(CIDNAME=esterno/${CALLERIDNUM},${CALLERIDNUM},${CALLERIDNUM}) 

;; utilizza il risultato trovato nella variabile
exten => s,2,Set(CALLERID(name)=${CIDNAME})

;; effettua la chiamata.
exten => s,3,Macro(chiamata-standard,${ARG1},${ARG2})

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; MACRO CHE GESTISCE LA SELEZIONE DEL MENU ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; nome della macro
[macro-scelta-menu]

;; cerca il numero del chiamante in rubrica
exten => s,1,LDAPget(CIDNAME=esterno/${CALLERIDNUM},${CALLERIDNUM},${CALLERIDNUM}) 
exten => s,2,Set(CALLERID(name)=${CIDNAME})

;; chiama la coda scelta dal menu (secondo parametro passato)
exten => s,3,Queue(${ARG2}|t|||30)

;; se non risponde nessuno inoltra a un'altra coda
exten => s,4,Queue(tutti|t|||30)

;; se non risponde nessuno manda la chiamata in segreteria
;; alla casella specificata dal primo parametro passato.
exten => s,5,Macro(segreteria,${ARG1})

;; se va in timeout, riaggancia.
exten => t,1,Hangup()

;;;;;;;;;;;;;;;;;;;;;;;;;;;
; MACRO CHIAMATA STANDARD ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; nome della macro
[macro-chiamata-standard]

;; inoltra la chiamata all'account specificato
;; nel secondo parametro passato
exten => s,1,Dial(${ARG2},20,tT)

;; se non risponde nessuno passa alla segreteria
;; specificata nel primo parametro passato
exten => s,2,Macro(segreteria,${ARG1})

;; se va in timeout, riaggancia
exten => t,1,Hangup()

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; MACRO SEGRETERIA TELEFONICA ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; nome della macro
[macro-segreteria]

;; in base allo stato della chiamata,
;; vai al punto corretto.
;; (NOANSWER,BUSY,CHANUNAVAIL,CONGESTION,ANSWER)
exten => s,1,Goto(s-${DIALSTATUS},1) ;
exten 
...

Updated by Simone Piccardi almost 12 years ago · 31 revisions