13 nov 2013

Rasperry PI: Una centrale telefonica VoIP

In questo articolo vedremo passo passo come sia possibile implementare una centrale VoIP utilizzando un “single-board computer”. Il Raspeberry Pi.
Indroduzione.
Anche se cercherò di spiegare le procedure passo passo ed in maniera molto semplice questo tutorial prevede che abbiate un minimo di familiarità con UNIX, SSH e su come modificare i file tramite la shell, sulle reti e una base sulla tecnologia VoIP e Asterisk ma soprattutto che abbiate voglia di imparare e sperimentare.
Raspberry: di cosa si tratta.
Il Raspberry Pi è un computer, basato su chipset  SoC Broadcom BCM 2835, dalle dimensioni di una carta di credito (misure che fanno del sistema uno dei più piccoli PC disponibili e a più basso costo al mondo) che si collega ad un monitor o un televisore e ad una tastiera.
Viene classificato come single-board computer (un calcolatore implementato su una sola scheda elettronica) sviluppato nel Regno Unito dalla Raspberry Pi Foundation. Attualmente, viene venduto in due versioni, al prezzo di 25 e 35 dollari statunitensi. 
Il SoC è un Broadcom BCM2835 che contiene un ARM1176JZFS a 700Mhz,  con virgola mobile e una GPU VideoCore IV. La GPU è in grado di riprodurre la qualità BluRay, utilizzando H.264 a 40MBits / s.  ed ha una veloce core 3D  (1Gpixel/s, 1.5Gtexel/s or 24 GFLOPs) che supporta OpenGL ES2.0 e le libraries OpenVG.
In pratica sarete in grado di eseguire, in scala ridotta,  gran parte delle operazioni riservate a desktop e server tradizionali.

Ecco le caratteristiche tecniche, direi di tutto rispetto.

Broadcom BCM 2835 chipset (ARM1176JZFS chip with a floating point co-processor, running at 700MHz
Videocore IV GPU, capable of BluRay quality playback, using H.264 at 40MBits/s Ships with OpenGL ES2.0 and OpenVG libraries)
HDMI out
Model B: 512MB of memory, two USB ports and a 10/100 BaseT Ethernet port
L’hardware. Per progettare la micro centrale VoIP avete bisogno di un Raspberry Pi Mod. B completo di case e alimentatore, di una memoria SD da almeno 8Gb, tastiera e mouse USB, un Monitor o TV con ingresso HDMI (oppure un adattatore HDMI-VGA) ma anche di un gateway e di un telefono VoIP. Un Cisco della serie SPA o un cordless Siemens Gigaset VoIP (A510IP) andranno benissimo. Dato che il dispositivo è orientato ad un utilizzo residenziale utilizzeremo come gateway un Cisco SPA3102 che, tramite la porta FXO, ci permetterà di attestarci direttamente alla linea analogica. In ogni caso potrete comunque configurare qualsiasi gateway VoIP FXO o ISDN. Nel caso in cui farete una sottoscrizione con un provider VoIP non avrete nemmeno bisogno di un gateway.
Nota: Non avrete a disposizione un Real Time Clock. L'aggiunta di un RTC è sorprendentemente costoso ed avrebbe influito molto sul target price che la fondazione si era prefissata. È comunque previsto un interfacciamento esterno utilizzando i pin GPIO.
sd1
Il Software Per prima cosa andremo a testare se il nostro dispositivo funziona correttamente installando un sistema operativo.  Formattate la vostra SD card tramite il tool scaricabile dal seguente link, avendo cura di settare l’opzione “FORMAT SIZE ADJUSTMENT” su ON 
https://www.sdcard.org/downloads/formatter_4/eula_windows/
Fig. 1


Ora scaricate il sistema operativo da questo link: http://www.raspberrypi.org/downloads. Nel nostro caso partiremo dal NOOBS da cui poi sceglieremo uno degli OS disponibili. Decomprimete lo zip direttamente nella root della SD Card.
Nota: Senza SD configurata correttamente il Raspberry non presenta nessun output video.
Siamo pronti per fare il primo boot.
Fig. 2
Fig2_NOOBS
Nello step successivo configurate la lingua per la tastiera e la password per l’utente “pi”. La password di default è “raspberry” 
Fig. 3 Fig3_raspi-config
Attestato il corretto funzionamento del device e della SD (l’installazione di Raspbian serve anche a questo, se va a buon fine la card funziona bene) è il momento di procurarci l’immagine di Asterisk for Raspberry Pi.
http://www.raspberry-asterisk.org/downloads/   in particolare la versione raspbx-19-01-2013.zip

Ora non ci resta che scrivere l’immagine sulla SD.
Inseriamo la scheda nel lettore di schede SD e verificando quale lettera di unità è stata assegnata e formattiamola con SDformatter. Scarichiamo il tool Win32DiskImager e scriviamo l’immagine [nomefile].img Fig. 4
Fig4_Win32DiskImager
Raspbx
Ora il Raspberry PI è pronto per eseguire Raspbx.
Nota: Se usate un monitor HDMI e non vedete alcun output premete il tasto 1 al boot.
L’IP viene assegnato dinamicamente, con tutta probabilità il vostro router ADSL assegnerà un IP. Da Windows potete connettervi al device tramite SSH o HTTP semplicemente digitando “raspbx”
La user e la password di default per SSH sono “root” “raspberry”, per l’interfaccia di amministrazione di FreePBX “admin” “admin”.
Per comodità useremo SSH e Putty (Putty.exe) ma è possibile utilizzare un monitor HDMI.
Ora tramite la console oppure in SSH digitate “raspi-config” e settate il layout della tastiera italiana, locale e timezone.
Fig.5
Fig5_ssh
Una volta settate le “Internationalization Options”, se la SD dovesse superare i 4Gb, potete procedere con l’espansione del Filesystem tramite la prima opzione “Expand Filesystem”
Ora potete aggiornare la distribuzione digitando il comando “raspbx-upgrade”.
Nel prossimo passaggio setterete un IP fisso per il micro (solo per dimensioni) pbx. Vi basterà editare il file “/etc/network/interfaces”.
Digitate “nano /etc/network/interfaces” e rimuovete la linea “iface eth0 inet dhcp”. Al suo posto inserite: 

  iface eth0 inet static
  address {ipaddress}
  netmask {netmask}
  gateway {gateway}
  dns-nameservers {dnsserver}
   (tipicamente l’ip del vostro router casalingo)
Salvate e digitate il comando “service networking restart

Primo accesso al PBX
Accedete tramite browser all’IP fisso oppure a “http://raspbx” utilizzando come utente e password “admin” “admin” e cliccando su “FreePBX Adminstration”.
Come prima cosa preparate 2 o tre interni per fare le vostre prove. Usate “Extensions” sotto “Applications”.
Fig. 6
Fig6_ext
Ad ogni modo potete comunque far riferimento alla documentazione ufficiale: http://wiki.freepbx.org/display/F2/Extensions
Ricordo inoltre che tra le innumerevoli funzionalità di un PBX c’è anche il Paging e l’inferfono (intercom) con cui potere chiamare una serie prestabilita di interni contemporaneamente sfruttando i telefoni come vivavoce. Il gruppo di telefoni risponderà automaticamente: http://wiki.freepbx.org/pages/viewpage.action?pageId=4161623. Molto comodo se abitate su 2 o più livelli.
Per fare i test potete utilizzare dei telefoni VoIP software come ad esempio X-lite fornito da CounterPath o 3CX PhoneClient fornito da 3CX (solo versione 6)

Nota: Se usate un cordless misto VoIP/Analogico, come ad esempio i Gigaset Siemens (nel mio caso A510IP), tenete presente che con gli ultimi firmware è possibile passare le chiamate ad un altro interno utilizzando il tasto R (flash hook) che in VoIP verrà configurato in refer sip method. Se volete usare il cordless come interfono disattivate la risposta automatica al sollevamento.
Le funzionalità di una centrale VoIP sono parecchie, per questa ragione ci occuperemo solamente delle principali. Fra le più utili la possibilità di ricevere via email eventuali messaggi vocali.
Passiamo dunque alla configurazione del server di posta al fine di poter inviare i messaggi email dal pbx.
Un server di posta elettronica funziona già nella configurazione di default usando exim4. Per impostazione predefinita Exim4 è configurato per inviare direttamente la posta elettronica agli host MX. Questo metodo però è sconsigliato in quanto quasi tutti i provider classificano le email provenienti da indirizzi IP dinamici come spam. Per evitare questo è necessario impostare uno smarthost (mail server in uscita).
Eseguite dalla console “dpkg-reconfigure exim4-config
Fig. 7
Fig7_mail
Selezionate “mail sent by smarthost” e inserite il nome FQDN del mail server. Come esempio utilizzeremo i  parametri di Gmail

Nota: Impostate come email di root e postmaster la mail associata al server smtp
Digitate in console “nano /etc/email-addresses” e aggiungete alla fine del file:
root: your_email@someisp.com
asterisk: your_email@someisp.com
Ora configurate le credenziali “nano /etc/exim4/passwd.client” aggiungendole alla fine del file attenendovi al formato SMTP_HOSTNAME:USERNAME:PASSWORD
Suggerisco di dare sempre un occhiata ai log “tail -f /var/log/exim4/mainlog” Attivate ora la configurazione con il comando “update-exim4.conf” e testatela con “send_test_email your_email@someisp.com
Alcune versioni di GnuTls soffrono di un problema di lunghezza dei pacchetti TLS “TLS packet with unexpected length was received”. Suggerisco di provare a configurare tutto prima sulla porta 25 facendo comunque riferimento a questo documento: https://wiki.debian.org/GmailAndExim4

Gateway PSTN/VoIP Cisco SPA3102 Ora passiamo alla configurazione del gateway che ci consentirà di attestarci alla linea telefonica analogica (PSTN) e di integrare con tutte le funzionalità che ci offre il nostro PBX.
Useremo l’SPA3102 senza NAT connesso direttamente alla LAN ma attestandoci alla porta “INTERNET” e collegando la linea PTSN su “LINE”.  (LinkSys SPA3102 support page.)

Se si dovesse rendere necessario resettare il device sui valori di fabbrica collegare un comune telefono alla porta “PHONE” e comporre “****” attendere la voce IVR e comporre “73738” seguito da “#” e premere “1” per confermare il reset. Aggiornate il firmware se necessario.
Come prima operazione collegate “temporaneamente” il device alla rete tramite la porta LAN e navigate su questo indirizzo http://192.168.0.1/admin/advanced.
Disattivate il DHCP server poi settate un IP fisso lato WAN avendo cura di selezionare “Enable WAN Server Web” sotto “Remote Management”.
Fig. 8
fig8_3102Scollegate il cavo di rete dalla porta “ETHERNET” e collegatelo alla porta “INTERNET”. Da ora in poi amministrerete il device dall’IP WAN (192.168.1.3).
Configurare syslog sul PBX Syslog è un modo pratico per eseguire il debug.
In caso di problemi potete settare nella pagina di configurazione “Voice” selezionate “System” e inserite l’ip del SYSLOG SERVER in “Syslog Server” e “Debug Server” impostando il livello di debug su 2 o superiore.
Esistono syslog server sia per Windows che per Linux. Per Debian seguite questo tutorial http://massivelydigital.com/setting-up-a-remote-rsyslog-server/.
Se invece volete un debug in tempo reale per Asterisk vi basterà digitare “asterisk –v”
Impostare la linea interno 1 In FreePBX, aggiungere un estensione di test Dall’interfaccia web di FreePBX impostate un interno “100” e settatene la password “line1pass@word1” poi applicate la configurazione.
Su SPA3102 sotto la scheda “VOICE” selezionare la sottoscheda “Line1” 1. Sotto “Proxy and Registration” impostate “Proxy” con l’ip del PBX , “Make Call Without Reg:” su YES e “Ans Call Without Reg:” su YES.
2. Sotto “Subscriber Information” inserite 100 (l’interno) come “User ID” e la relativa password.
3. Impostate il “Dial Plan” a “([* x] x.)”. Questo indirizzerà ogni numero che inizia con '*' o '0 '- '9' al PBX. Per maggiori informazioni sui dial plan si veda qui: http://www.cisco.com/en/US/products/ps10033/products_qanda_item09186a0080a35a44.shtml.
4. Applicate tutte le modifiche.
5. Sempre sotto la scheda “Voice”, selezionate la scheda “Regional”, e cancellare tutte le voci *XX sotto “Vertical Service Activation Codes”.
Verificate se l’interno 100 si è registrato correttamente dal seguente link: 
http://raspbx/admin/config.php?&type=tool&display=asteriskinfo&extdisplay=subscriptions

Configurare la linea PSTN
Il prossimo passo, la parte più difficile: configurare la porta FXO dell’SPA3102.
Configurare le chiamate in uscita 1. In FreePBX sella sezione “Connectivity” “Trunk” impostate il nuovo sip trunk: “Trunk Name” a “pstn” e settate “Maximum Channels” a 1.
2. Sotto “PEER Details” inserire quanto segue:
canreinvite=no
host=192.168.1.3  (l’ip dell’spa3102) 
nat=no
port=5061
user=pstn  
secret=pstnpass2013
type=friend
qualify=yes
dtmfmode=rfc2833

Su SPA3102 sotto la scheda “VOICE” selezionare la sottoscheda “PSTN Line”
1. Sotto “Proxy and Registration” impostate “Proxy” con l’ip del PBX , “Make Call Without Reg:” su YES e “Ans Call Without Reg:” su YES.
2. Sotto “Subscriber Information” inserite “pstn” come “User ID” e la relativa password “
pstnpass2013”.
Ricordate anche di abbassare “PSTN Answer Delay:” a 2 altrimenti gli interni cominceranno a squillare dopo molti secondi. 
Verificate su FreePBX che il PEER sia registrato:
http://raspbx/admin/config.php?&type=tool&display=asteriskinfo&extdisplay=peers
3. Tornate a FreePBX e impostate una nuova rotta di uscita. Sotto “Connectivity” poi “Outbound Routes” 
    Impostate il nome della rotta e il “Dial Patterns” tramite il Wizard (la 7/10)
4. Ora impostate “Trunk Sequence” come SIP/pstnPSTN, “Answer Delay:”  0
5. Applicare tutte le modifiche.
A questo punto potete provare a fare una chiamata all’esterno tramite un interno software oppure un telefono VoIP. Se tutto è stato impostato correttamente sarete in grado di chiamare cellulari e numeri fissi senza problemi.

Configurare le chiamate in arrivo Su SPA3102 sotto la scheda “VOICE” selezionare la sottoscheda “PSTN Line” 1. Scorrete fino alla sezione “PSTN-To-VoIP Gateway Setup”, impostate “PSTN Ring Thru Line 1” a “No” poi impostate “PSTN Caller Default DP” a “2”.
2. Scorrete in alto fino “Dial Plans” e impostate il “Dial Plan 2” a “S0(<:XXXXXXXXXX>)”  in cui XXX è il vostro numero di telefono.
3. Su FreePBX sotto “Applications” selezionate “Ring Groups” ed aggiungete tutti gli interni che volete far squillare all’arrivo di una chiamata esterna. Scorrete fino a “Set Destination” e impostate gli interni sotto “Extension List” infine settate “Destination if no answer:”. Potete decidere se terminare la chiamata in caso di mancata risposta oppure eseguire un IVR che a sua volta vi inoltrerà il messaggio vocale via email. 4. Di nuovo su FreePBX aggiungete una rotta in entrata. Sotto “Connectivity” poi “Inbound Routes” 
Il nome potrebbe essere “PSTN” mentre il “DID Number” dovrebbe essere lo stesso del “Dial Plan 2” (il vostro numero)
Sotto “Set Destination” selezionate “Ring Groups” poi selezionate quello appena creato.

Ora siete pronti per testare le chiamate in ingresso.

Altre configurazioni
Ricordate di settare i toni per l’italia per l’SPA3102

[REGIONAL]
DIAL TONE:425@-12;10(.6/1/1,.2/.2/1) -e il mitico TU TU-
OUTSIDE DIAL TONE:425@-12;10(.6/1/1,.2/.2/1)
BUSY TONE:425@-20;10(.5/.5/1) -tono di occupato-
REORDER TONE: 425@-12;10(.25/.25/1) ->suono che viene prodotto quando va in timeout la digitazione di un numero da chiamare
OFF HOOK WARNING TONE: 425@-12;10(.25/.25/1) ->tono riprodotto quando si ripone male la cornetta (l'ho cambiato e messo uguale a prima perche questo suono viene sempre riprodotto quando il sipura finisce di riprodurre il reorder tone)
RING BACK TONE: 425@-20;*(1/4)
RING1 CADENCE: 90(1/4) -cadenza del trillo-
CWT1 CADENCE:60(.1/3) ->cadenza dell'avviso di chiamata
Ring Waveform:sinusoid
Ring Voltage:70
Ring Frequency:25
CWT Frequency:425@-10
Hook Flash Timer Min: .06
Hook Flash Timer Max: .2
REORDER DELAY: 0 ->numero secondi dopo il quale viene eseguito il reorder dalay tone quando l'altra parte ha riagganciatol

File Audio in italiano Ecco i prompt vocali in italiano:
http://downloads.asterisk.org/pub/telephony/sounds/releases/asterisk-core-sounds-it-alaw-1.4.25.tar.gz
http://www.freepbx.org/forum/general-help/change-audio-language
Cancellazione Eco Se avete qualche problema di eco seguite questo post:
http://blog.liberailvoip.it/2008/02/19/sipura-linksys-eliminiamo-leco-definitivamente/

Conclusioni Abbiamo creato un PBX casalingo di classe enterprise spendendo quanto mangiare una pizza in due. Non mi sembra cosa da poco. Inoltre FreePBX offre una serie di funzionalità davvero interessanti. Vi suggerisco di dare un occhiata alla documentazione ufficiale.

Aggiornamento: L'SPA 3102 soffre di un fastidioso problema di Eco. Recuperatevi un Grandstream HT503 e avrete risolto il problema. Qui trovate la configurazione:
http://andreagx.blogspot.it/2015/03/freepbx-e-grandstream-ht503.html