Posts tagged voip

callme

Una semplice casella vocale con Asterisk

0

Per motivi strettamente “politici” mi sono trovato a dover realizzare una veloce e semplice casella vocale dove le persone, chiamando un certo numero di telefono (CloudItalia Orchestra – ex EuteliaVoip), possono lasciare il loro messaggio.

Contemporaneamente alla registrazione del messaggio, viene inviata una mail ad un certo indirizzo di posta elettronica contenente il file wav della registrazione, grazie ad un semplice script Perl.

Entriamo adesso nel dettaglio della programmazione.

Dopo aver installato Asterisk ed essendosi assicurati che funzioni correttamente, ecco il dialplan relativo alla voicebox:

VBOX_PATH=[directory dove registrare i messaggi]
VBOX_DEST=[indirizzo e-mail dove inviare la notifica]

[voicebox]
exten => _X.,1,Answer
exten => _X.,2,Wait(2)
exten => _X.,1,Playback(welcome)
exten => _X.,n,Playback(beep)
exten => _X.,n,Set(VBOX_FILE=${VBOX_PATH}/rec-${CALLERID(num)}-${STRFTIME(${EPOCH},,%d%m%Y-%H%M%S)}.wav)
exten => _X.,n,Record(${VBOX_FILE}|10|600)
exten => _X.,n,Noop(Sending mail notice for ${VBOXFILE})
exten => _X.,n,System(/var/lib/asterisk/cb-voicebox.pl ${CALLERID(NUM)} ${EXTEN} ${VBOX_FILE} ${VBOX_DEST})
exten => _X.,n,Wait(1)
exten => _X.,n,Playback(thanks)
exten => _X.,n,Wait(2)
exten => _X.,n,Hangup

lo script Perl cb-voicebox.pl ha 4 argomenti: il numero del chiamante, il numero chiamato, il path al file .wav registrato e l’indirizzo e-mail dove spedire la notifica:

#!/usr/bin/perl
use MIME::Lite;
use Net::SMTP;

$caller = $ARGV[0];
$vbox = $ARGV[1];
$vboxfile = $ARGV[2];
$to_address = $ARGV[3];
$vboxtime = localtime;

### Mittente e server SMTP
my $from_address = 'vbox@[dominio]';
my $mail_host = 'localhost';

### Oggetto e corpo della mail
my $subject = "Nuovo messaggio vocale da $caller nella VBOX $vbox";
my $message_body = "Salve, questo messaggio automatico per segnalare che nella casella vocale del numero $vbox e stato lasciato un messaggio da $caller in data $vboxtime. In allegato il file audio.";

$msg = MIME::Lite->new(
 From => $from_address, 
 To => $to_address,
 Subject => $subject,
 Type =>'multipart/mixed'
) or die "Error creating multipart container: $!\n";

### Aggiungi il testo del messaggio
$msg->attach (
 Type => 'TEXT',
 Data => $message_body
) or die "Error adding the text message part: $!\n";

### Allega il file audio, con il corretto MIME Type (audio/wav)
$msg->attach (
 Type => 'audio/wav',
 Path => $vboxfile,
 Filename => 'messaggio.wav',
 Disposition => 'attachment'
) or die "Error adding $vboxfile: $!\n";

### Invia la mail
MIME::Lite->send('smtp', $mail_host, Timeout=>60);
$msg->send;

Semplice ed efficace !

About Michele Pinassi

Nato a Siena nel 1978, dopo aver conseguito il diploma in "Elettronica e Telecomunicazioni" e la laurea in "Storia, Tradizione e Innovazione", attualmente è Responsabile del Sistema telefonico di Ateneo presso l'Università degli Studi di Siena. Utilizza quasi esclusivamente software libero. Dal 2006 si occupa di politica locale come attivista nel Movimento Siena 5 Stelle.

2012-10-17 09.50.31

Snom 710

0

Ho ricevuto oggi il pacco con i tre nuovi modelli di telefoni VoIP della Snom: 710, 720 e 760. Ho deciso di provarli uno per uno e separare, pertanto, le tre recensioni.

Inizio dal “piccolo“, il 710, che comunque offre tutta una ampia gamma di interessanti funzioni che approfondirò in questo articolo.

Nella scatola, oltre al telefono, alla base e alla cornetta, troviamo un cavo di rete e un breve manualetto cartaceo “Quick Start” in 5 lingue, tra cui l’italiano, per poter iniziare con l’installazione dell’apparecchio. Gli alimentatori a rete 220V (per chi non ha il POE) sono forniti separatamente.

Ho impiegato qualche secondo a trovare i connettori RJ45 per la rete (anche questo telefono funziona come uno “switch”) e per il PC, che si trovano incassati nel retro del telefono.

Accendiamo il telefono. Immediatamente si accendono tutti i led -rossi e verdi- dei tasti e la retroilluminazione dell’ampio display lcd a matrice, comparendo il logo SNOM a tutto schermo: bel display per un telefono di fascia economica ! L’aspetto estetico è gradevole e robusto, funzionale anche “keypad” di navigazione, anche se avrei invertito i tasti OK e NO (ovvero OK a destra e NO a sinistra, mentre è il contrario…).

 Subito dopo il boot, il telefono chiede al DHCP l’IP e, dopo averlo recuperato, inizia con la procedura di provisioning per auto-configurarsi. Sul display vengono visualizzate tutte le fasi, rendendo piuttosto semplice anche la diagnostica sugli apparati.

CARATTERISTICHE TECNICHE

Direttamente dal sito web della Snom (http://www.snom.com/it/products/ip-phones/snom-710/) ecco alcune caratteristiche salienti del modello 710:

  • Display a 4 linee, 128×48 Pixel, bianco e nero
  • 5 tasti funzione LED programmabili liberamente, 4 tasti funzione contestuali e programmabili in modo variabile
  • Vivavoce
  • Uso di cornetta e vivavoce in contemporanea
  • 4 identità SIP
  • Gestione di 4 chiamate simultaneamente
  • HTTPS server/client
  • Transport Layer Security (TLS), SRTP (RFC3711), SIPS, RTCP, VLAN (IEEE 802.1X), LLDP-MED, RTCP-XR
  • G.711 A-law, μ-law; G.722 (banda larga), G.726, G.729AB, GSM 6.10 (full rate)
  • SIP Conforme allo standard RFC 3261
  • NAPTR (RFC 2915), rport (RFC 3581), REFER (RFC 3515) 

 

PROVISIONING

Ammetto che riuscire a fare il provisioning non è stato proprio banale. Questi modelli sono usciti da pochi mesi ed ancora la documentazione disponibile non è così estesa come per altri modelli, così ho dovuto fare un po’ di debugging per riuscire a capire cosa (e dove) il telefono si aspettava la configurazione.

Grazie alla consulenza tecnica di Pietro, della Snom Italia, sono riuscito a capire dov’era il problema: il firmware 8.7.3.8 ha delle issue sul provisioning via TFTP pertanto è opportuno aggiornare il telefono all’ultima release disponibile, nel mio caso la 8.7.3.15. Dopo l’aggiornamento tutto ha funzionato come dovuto pertanto, per riepilogare:

OPZIONE 66 “tftp-server-name” sul server TFTP dove, nella root del server, metteremo il file “snom710.htm” (dal Wiki della Snom):

<html>
<pre>
# Redirect all phones to the php script
setting_server$: http://[server]/snom.php?mac={mac}
</pre>
</html>

Questo sistema permette di configurare dinamicamente i telefoni, utilizzando uno script PHP che ritorna un semplice file XML tipo:

<?xml version="1.0" encoding="utf-8"?>
 <settings>
 <phone-settings>
 <language perm="">Italiano</language>
 <tone_scheme perm="">ITA</tone_scheme>
 <display_method perm="">display_name_number</display_method>
 <web_language perm="">Italiano</web_language>
 <update_policy perm="">auto_update</update_policy>
 <setting_server perm="RW">http://[server]/snom.php?mac={mac}</setting_server>
 <settings_refresh_timer perm="">3600</settings_refresh_timer>
 <http_user perm="">[utente]</http_user>
 <http_pass perm="">[password]</http_pass>
 <user_active idx="1" perm="R">on</user_active>
 <user_realname idx="1" perm="R">[nome utente]</user_realname>
 <user_name idx="1" perm="R">[numero]</user_name>
 <user_host idx="1" perm="R">[server voip]:[porta]</user_host>
 <user_pass idx="1" perm="R">[password]</user_pass>
 <user_mailbox idx="1" perm="R">[numero]</user_mailbox>
 <user_idle_text idx="1" perm="R">[nome utente]</user_idle_text>
 <user_sipusername_as_line idx="1" perm="R">on</user_sipusername_as_line>
 <user_descr_contact idx="1" perm="R">off</user_descr_contact>
 <codec1_name idx="1" perm="R">9</codec1_name>
 <codec2_name idx="1" perm="R">0</codec2_name>
 <codec3_name idx="1" perm="R">8</codec3_name>
 <codec4_name idx="1" perm="R">2</codec4_name>
 <codec5_name idx="1" perm="R">3</codec5_name>
 <codec6_name idx="1" perm="R">18</codec6_name>
 <codec7_name idx="1" perm="R">4</codec7_name></phone-settings>
</settings>

Per qualunque problema o informazioni ci viene in aiuto il comodo log del telefono, al quale si accede attraverso l’interfaccia web, che mi ha aiutato a fare debugging sul file di configurazione.

CONCLUSIONI

Considerando il prezzo di listino al di sotto dei 100€, valutando non solo la semplicità tecnica ma anche l’estetica e la “qualità percepita”, lo ritengo una ottima alternativa a marchi più blasonati quali i Cisco e i Polycom. Oltretutto, e non è un aspetto trascurabile, la documentazione tecnica sul Wiki della Snom (anche se un po’ confusionaria…) è abbastanza completa ed esauriente.

 

A breve la recensione anche del 720 e del 760…tempo di provarli !

About Michele Pinassi

Nato a Siena nel 1978, dopo aver conseguito il diploma in "Elettronica e Telecomunicazioni" e la laurea in "Storia, Tradizione e Innovazione", attualmente è Responsabile del Sistema telefonico di Ateneo presso l'Università degli Studi di Siena. Utilizza quasi esclusivamente software libero. Dal 2006 si occupa di politica locale come attivista nel Movimento Siena 5 Stelle.

snom300_2

Snom 320 e Snom 300

0

Come i lettori assidui del mio blog già sanno, siamo in fase di ricerca e valutazione per gli apparecchi VoIP da utilizzare all’interno dell’Ateneo di Siena, dove lavoro.

Proprio qualche giorno fa ci hanno portato in prova un appliance T-Vox per una valutazione sul prodotto in merito alle necessità ed esigenze dell’ateneo.

Insieme al T-Vox hanno consegnato, sempre in prova, due apparecchi Snom: il 320, con i tasti laterali aggiuntivi, e il 300.

Direttamente dal sito web del produttore, troviamo:

Snom 300

Quale modello base della famiglia di telefoni aziendali, il telefono SIP snom 300 risponde alle esigenze primarie in termini di impiego della telefonia VoIP ed offre numerose funzioni irrinunciabili in ambito professionale.

Sempre dal sito web ecco alcune delle caratteristiche principali:

  • Display a due righe (2×16 caratteri)
  • 27 tasti, 7 LEDs
  • 6 tasti funzione liberamente configurabili
  • 4 account SIP (“linee”)
  • 2 porte Ethernet
  • SIP RFC3261
  • Sicurezza: SIPS/SRTP, TLS
  • STUN, ENUM, NAT, ICE
  • Compressione: G.711, G.729A, G.723.1,G.722, G.726, GSM 6.10 (Full rate)

Snom 320

Ideale per l’ufficio e per chi telefona molto: lo snom 320 é un telefono SIP professionale dall’ottimo rapporto qualità prezzo e dotato del vivavoce (full duplex) come della funzione di conferenza a tre.

Display grafico a due righeLe relative caratteristiche principali:

  • 47 Tasti, 13 LEDs
  • 12 account SIP (“linee”)
  • 12 tasti funzione liberamente configurabili
  • Vivavoce
  • Alimentazione ethernet (PoE)
  • Tastiera aggiuntiva con 42 tasti funzione programmabili
  • SIP RFC3261
  • Sicurezza: SIPS/SRTP, TLS
  • STUN, ENUM, NAT, UPnP, ICE
  • Codecs: G.711, G.729A, G.723.1, G.722, G.726, GSM 6.10 (Full rate)
  • Supporto della lingua locale

Dopo qualche prova di utilizzo, dei due apparecchi apprezzo particolarmente la chiarezza delle informazioni sul display, a caratteri grandi (a prova di “utonto”). La suoneria è facilmente personalizzabile ed anche l’interfaccia di configurazione via web è facile e intuitiva. L’aspetto esteriore è abbastanza solido e robusto, con plastiche nere opache e tasti con buon feedback tattile.

La documentazione su come fare l’autoprovisioning è disponibile sul Wiki della Snom all’indirizzo:http://wiki.snom.com/Features/Mass_Deployment

Configurazione degli apparati

 

Entrambi i modelli hanno un comodo server Web sulla porta 80 per la configurazione degli stessi. Basterà recuperare l’IP (nmap -sP può essere di grande aiuto) ed aprire il browser.

Unica accortezza per la configurazione è nella parte relativa agli account SIP. La schermata è chiara ma nel caso si inserisca un nome a dominio nella parte “Server:” è necessario aggiungere, nell’URI, anche la porta UDP. Ad esempio:
voip.server.it:5060

Altrimenti la registrazione al server fallirà in un antipatico 404:

Transport Error: Pending packet 1000251: generating fake
Registrar 2169@voip.server.it refused with code 404
Will try to reregister in 300 seconds
Registration Metrics failed

About Michele Pinassi

Nato a Siena nel 1978, dopo aver conseguito il diploma in "Elettronica e Telecomunicazioni" e la laurea in "Storia, Tradizione e Innovazione", attualmente è Responsabile del Sistema telefonico di Ateneo presso l'Università degli Studi di Siena. Utilizza quasi esclusivamente software libero. Dal 2006 si occupa di politica locale come attivista nel Movimento Siena 5 Stelle.

2012-06-15 08.29.50

Cisco IP Phone SPA502G

0

Proprio ieri abbiamo ricevuto, in visione, il telefono Cisco SPA502G per i contesti con stack SIP. Anche se Cisco ha tutto il suo sistema di Unified Communications basato su protocollo proprietario Skinny (SCCP), per poter rimanere anche sul mercato open source, ha prodotto anche qualche apparecchio SIP.

La qualità percepita del prodotto è davvero molto molto buona, come quasi tutti i prodotti Cisco: ottimo assemblaggio, plastiche solide e design curato.

Il display LCD, praticamente omnipresente su tutti i telefoni VoIP, ha un buon contrasto e la navigazione tra le varie voci di menu è semplice e intuitiva.

Sul retro le due prese RJ45 per la connessione alla rete e al PC ed il connettore per l’alimentazione a 5V. Questo modello supporta il POE.

Tra le varie caratteristiche segnalo:

  • Smart Phone Control Protocol (SPCP)
  • Audio codecs G.711a, G.711u, G.726_32, G.729ab, G.722
  • Secure Real-Time Transport Protocol (SRTP) e Transport Layer Security (TLS)
  • Autoprovisioning via TFTP (DHCP option 66)

 

Impostare l’autoprovisioning

Premesso che dovete avere già un server TFTP funzionante e un server DHCPD che invia l’opzione “66″ con l’IP del server TFTP dove cercare le configurazione, potete impostare l’autoprovisioning seguendo le istruzioni che trovate  su https://supportforums.cisco.com/docs/DOC-9954.

Per aiutarvi, ecco le richieste che il telefono (172.20.1.10) invia al server TFTP (172.20.1.2):

11:35:47.155280 IP (tos 0x0, ttl 64, id 1, offset 0, flags [none], proto UDP (17), length 79)
 172.20.1.10.1024 > 172.20.1.2.tftp: [udp sum ok] 51 RRQ "SEPCCEF485E8FE4.cnf.xml" octet timeout 10 tsize 0
11:35:47.176136 IP (tos 0x0, ttl 64, id 2, offset 0, flags [none], proto UDP (17), length 78)
 172.20.1.10.1025 > 172.20.1.2.tftp: [udp sum ok] 50 RRQ "XMLDefault502G.cnf.xml" octet timeout 10 tsize 0
11:35:47.198578 IP (tos 0x0, ttl 64, id 3, offset 0, flags [none], proto UDP (17), length 74)
 172.20.1.10.1026 > 172.20.1.2.tftp: [udp sum ok] 46 RRQ "XMLDefault.cnf.xml" octet timeout 10 tsize 0
11:36:05.656666 IP (tos 0x0, ttl 64, id 6, offset 0, flags [none], proto UDP (17), length 68)
 172.20.1.10.1028 > 172.20.1.2.tftp: [udp sum ok] 40 RRQ "/spa502G.cfg" octet timeout 10 tsize 0
11:37:00.205328 IP (tos 0x0, ttl 64, id 2, offset 0, flags [none], proto UDP (17), length 87)
 172.20.1.10.1025 > 172.20.1.2.tftp: [udp sum ok] 59 RRQ "/Cisco/SPA502G/[MAC Address del Telefono].xml" octet timeout 10 tsize 0

In particolare, nel mio caso, ho scelto di avere il file “spa502.cfg” nella root del server TFTP:

<flat-profile>
<Resync_On_Reset>Yes</Resync_On_Reset>
<Resync_Periodic>10</Resync_Periodic>
<Profile_Rule>tftp://172.20.1.2/Cisco/SPA502G/$MA.xml</Profile_Rule>
<Primary_NTP_Server ua="na">172.20.1.2</Primary_NTP_Server>
<Time_Zone ua="na">GMT+2:00</Time_Zone>
<Date_Format ua="na">day/month</Date_Format>
<Daylight_Saving_Time_Enable ua="na">No</Daylight_Saving_Time_Enable>
<TFTP_Server ua="na">172.20.1.2</TFTP_Server>
<Current_Gateway ua="na">172.20.1.2</Current_Gateway>
<Primary_DNS ua="na">172.20.1.2</Primary_DNS>
<Proxy_1_ ua="na"></Proxy_1_>
<Signaling_Protocol group="System/System_Configuration">SIP</Signaling_Protocol>
<SPCP_Auto-detect group="System/System_Configuration">No</SPCP_Auto-detect>
<Upgrade_Enable ua="na">Yes</Upgrade_Enable>
<Upgrade_Error_Retry_Delay ua="na">3600</Upgrade_Error_Retry_Delay>
<Downgrade_Rev_Limit ua="na"></Downgrade_Rev_Limit>
<License_Keys ua="na"></License_Keys>
</flat-profile>

Tutti i file di configurazione dei singoli apparecchi sono nella directory tftp://172.20.1.2/Cisco/SPA502G/$MA.xml. La variabile $MA viene sostituita con il MAC address del telefono.

Esempio di file di configurazione:

<flat-profile>
<Station_Name ua="na">[Nome utente]</Station_Name>
<Display_Name_1_ ua="na">[Nome da visualizzare nel display]</Display_Name_1_>
<Proxy_1_ ua="na">[Server VoIP]</Proxy_1_>
<User_ID_1_ ua="na">[User account SIP]</User_ID_1_>
<Password_1_ ua="na">[Password account SIP]</Password_1_>
<Resync_Periodic>432000</Resync_Periodic>
</flat-profile>

Nel documento di cui vi ho segnalato l’URL trovate comunque la spiegazione approfondita di tutte le opzioni.

About Michele Pinassi

Nato a Siena nel 1978, dopo aver conseguito il diploma in "Elettronica e Telecomunicazioni" e la laurea in "Storia, Tradizione e Innovazione", attualmente è Responsabile del Sistema telefonico di Ateneo presso l'Università degli Studi di Siena. Utilizza quasi esclusivamente software libero. Dal 2006 si occupa di politica locale come attivista nel Movimento Siena 5 Stelle.

VoIP diagram

Primi esperimenti con il VoIP: Asterisk + OpenSIPS

0

Come avevo già scritto precedentemente, sono al lavoro per la progettazione e successiva realizzazione di un sistema VoIP piuttosto grande. Dopo aver realizzato diversi PBX Asterisk, con limitato numero di interni (10-20), indubbiamente la mia predisposizione era fortemente indirizzata verso software libero. Tuttavia Asterisk, come confermato anche da esperti del settore, non è adatto a sopportare un elevato numero di interni (si parla di 1000-2000 telefoni) perché offre tutta una serie di servizi avanzati e di transcoding non sempre necessari. Per la semplice gestione della registrazione e gestione del routing è sufficiente un SIP proxy, molto più snello di un completo sistema PBX come Asterisk. Moltissimi, compresi appliances commerciali, hanno scelto OpenSIPS:

OpenSIPS (Open SIP Server) is a mature Open Source implementation of a SIP server. OpenSIPS is more than a SIP proxy/router as it includes application-level functionalities. OpenSIPS, as a SIP server, is the core component of any SIP-based VoIP solution. With a very flexible and customizable routing engine, OpenSIPS ‘unifies voice, video, IM and presence services in a highly efficient way, thanks to its scalable (modular) design.
What OpenSIPS has to offer, comes in a reliable and high-performance flavour - OpenSIPS is one of the fastest SIP servers, with a throughput that confirms it as a solution up to enterprise or carrier-grade class.

Premetto che un forte supporto e aiuto nella comprensione del tutto mi è stata data dal libro “Building Telephony Systems with OpenSIPS 1.6“, disponibile anche su Amazon.it.

Senza voler ripetere le basi già descritte nel mio precedente post (OpenSIPS: l’Installazione), il contesto nel quale  lavoreremo in questo post è composto da:

Per quanto riguarda l’installazione di Asterisk ho scelto di NON mettere FreePBX e di configurare manualmente il tutto. Asterisk, soprattutto in questa prima fase, servirà esclusivamente come gateway con la rete telefonica tradizionale.

Vediamo velocemente la configurazione di Asterisk. In particolare ho dovuto modificare i files sip.conf:

[voip-trunk]
type=peer
fromdomain=voip.unisi.it
host=voip.unisi.it
insecure=invite
disallow=all
allow=alaw

e extensions.conf:

[macro-from-pstn-1]
exten => s,1,Noop(Entering macro-from-pstn-1 with DID = ${DID} and setting to: 2617)
exten => s,n,Set(DNID=2617)

[macro-from-pstn-2]
exten => s,1,Noop(Entering macro-from-pstn-2 with DID = ${DID} and setting to: 2650)
exten => s,n,Set(DNID=2650)

[from-pstn]
exten => _X.,1,Set(DID=${EXTEN})
exten => _X.,n,Goto(s,1)
exten => s,1,Noop(Entering from-dahdi with DID == ${DID})
exten => s,n,Ringing()
exten => s,n,Set(DID=${IF($["${DID}"= ""]?s:${DID})})
exten => s,n,Noop(DID is now ${DID})
exten => s,n,Set(CHAN=${CHANNEL:6})
exten => s,n,Set(CHAN=${CUT(CHAN,-,1)})
exten => s,n,Macro(from-pstn-${CHAN},${DID},1)
exten => s,n,Noop(Returned from-pstn-${CHAN})
exten => s,n,Dial(SIP/${DNID}@voip-trunk,20);
exten => s,n,Hangup()

[from-voip]
exten=s,1,NooP("from-voip: ${EXTEN}")
exten=>_[0-9].,1,Dial(DAHDI/g0/${EXTEN})
exten=>_[0-9].,2,hangup()

Notare che in questo caso ho solamente 2 canali PSTN configurati all’interno del gruppo 0 (DAHDI/g0). Queste impostazioni si gestiscono nel file dahdi-channels.conf:

; Span 1: WCTDM/4 "Wildcard TDM400P REV I Board 5" (MASTER) 
;;; line="1 WCTDM/4/0 FXSKS"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 1

...

Adesso passiamo al cuore del sistema: OpenSIPS. In questo caso deve occuparsi del routing, dell’accounting e della registrazione/autenticazione dei telefoni VoIP. Ho scelto di basare il tutto su database MySQL, creando le opportune tabelle.

Per semplificarne la gestione ho fatto configurare una VLAN sulla rete e ho messo un server DHPC che, oltre a fornire l’indirizzo IP e la configurare di rete, invia anche l’opzione 66, “tftp-server-name“, per la configurazione automatica dei telefoni (autoprovisioning). Nel nostro caso si tratta di telefoni Yealink SIP-T20P che supportano l’autoprovisioning: inviando tale opzione DHCP, i telefoni tentano di scaricare la configurazione attraverso il server TFTP indicato. Ovviamente la configurazione di ogni singolo apparecchio deve essere salvata in un file dal nome [mac-address].cfg ma anche questo dipende dal modello del telefono e dalle specifiche del produttore.

Tornando all’OpenSIPS, usato come SIP proxy, ecco la configurazione:

####### Global Parameters #########
debug=4
log_stderror=no
log_facility=LOG_LOCAL7
fork=yes
children=4
# default db_url to be used by modules requiring DB connection
db_default_url="mysql://opensips:xxx@localhost/opensips"
port=5060
listen=udp:172.20.0.1:5060

####### Modules Section ########
mpath="/usr/lib/opensips/modules/"
loadmodule "db_mysql.so"
loadmodule "signaling.so"
loadmodule "sl.so"
loadmodule "tm.so"
loadmodule "rr.so"
loadmodule "maxfwd.so"
loadmodule "usrloc.so"
loadmodule "registrar.so"
loadmodule "textops.so"
loadmodule "mi_fifo.so"
loadmodule "uri.so"
loadmodule "acc.so"
loadmodule "auth.so"
loadmodule "auth_db.so"
loadmodule "alias_db.so"
loadmodule "domain.so"
loadmodule "presence.so"
loadmodule "permissions.so"
# ----------------- setting module-specific parameters ---------------
modparam("mi_fifo", "fifo_name", "/tmp/opensips_fifo")
modparam("rr", "append_fromtag", 1)
modparam("registrar", "max_contacts", 10)
modparam("usrloc", "db_mode", 2)
modparam("usrloc", "db_url","mysql://opensips:xxxx@localhost/opensips")
modparam("uri", "use_uri_table", 0)
modparam("acc", "early_media", 1)
modparam("acc", "cdr_flag", 1)
modparam("acc", "report_cancels", 1)
modparam("acc", "detect_direction", 1)
modparam("acc", "failed_transaction_flag", 3)
modparam("acc", "log_flag", 1)
modparam("acc", "log_missed_flag", 2)
modparam("acc", "db_flag", 1)
modparam("acc", "db_missed_flag", 2)
modparam("acc", "db_table_acc", "acc")
modparam("acc", "db_url", "mysql://opensips:xxx@localhost/opensips")
modparam("acc", "db_extra", "from_uri=$fU; to_uri=$tU; ip=$si; ua=$hdr(User-Agent)")
modparam("auth_db", "calculate_ha1", yes)
modparam("auth_db", "password_column", "password")
modparam("auth_db", "db_url","mysql://opensips:xxx@localhost/opensips")
modparam("auth_db", "load_credentials", "")
modparam("auth_db", "use_domain", 1)
modparam("alias_db", "db_url","mysql://opensips:xxxx@localhost/opensips")
modparam("domain", "db_url","mysql://opensips:xxx@localhost/opensips")
modparam("domain", "db_mode", 1) # Use caching
modparam("auth_db|usrloc|uri", "use_domain", 1)
modparam("presence", "db_url","mysql://opensips:xxx@localhost/opensips")
modparam("presence", "presentity_table", "presentity")
modparam("presence", "active_watchers_table", "active_watchers")
modparam("presence", "watchers_table", "watchers")
modparam("presence", "db_update_period", 100)
modparam("presence", "notify_offline_body", 1)
modparam("permissions", "db_url", "mysql://opensips:xxxx@localhost/opensips")
modparam("permissions", "address_table", "address")
modparam("permissions", "grp_col", "grp")
modparam("permissions", "ip_col", "ip")
modparam("permissions", "mask_col", "mask")
modparam("permissions", "port_col", "port")
modparam("permissions", "proto_col", "proto")
modparam("permissions", "info_col", "context_info")

####### Routing Logic ########

route{
 if (!mf_process_maxfwd_header("10")) {
   sl_send_reply("483","Too Many Hops");
   exit;
 }
 if (has_totag()) {
  if (loose_route()) {
   if (is_method("BYE")) {
    setflag(1); # do accounting ...
    setflag(3); # ... even if the transaction fails
   } else if (is_method("INVITE")) {
    record_route();
   }
  route(1);
 } else {
  if (is_method("SUBSCRIBE") && $rd == "172.20.0.1") {
  # in-dialog subscribe requests
   route(2);
   exit;
  }
  if ( is_method("ACK") ) {
   if ( t_check_trans() ) {
    # non loose-route, but stateful ACK; must be an ACK after 
    # a 487 or e.g. 404 from upstream server
    t_relay();
    exit;
   } else {
    # ACK without matching transaction ->
    # ignore and discard
    exit;
   }
  }
  sl_send_reply("404","Not here");
  }
 exit;
}
# CANCEL processing
if (is_method("CANCEL")) {
 if (t_check_trans())
  t_relay();
 exit;
 }
 t_check_trans();

 if (!(method=="REGISTER") && is_from_local()) {
  if(!check_source_address("0")){
   if (!proxy_authorize("", "subscriber")) {
    proxy_challenge("", "0");
    exit;
   }
   if (!db_check_from()) {
    sl_send_reply("403","Forbidden auth ID");
    exit;
   }
   consume_credentials();
   # caller authenticated
  }
 }
 # preloaded route checking
 if (loose_route()) {
  xlog("L_ERR", "Attempt to route with preloaded Route's [$fu/$tu/$ru/$ci]");
  if (!is_method("ACK"))
    sl_send_reply("403","Preload Route denied");
  exit;
 }
 # record routing
 if (!is_method("REGISTER|MESSAGE"))
  record_route();
 # account only INVITEs
  if (is_method("INVITE")) {
   setflag(1); # do accounting
  }
  if (!is_uri_host_local()) {
   append_hf("P-hint: outbound\r\n"); 
   route(1);
  }

 if( is_method("PUBLISH|SUBSCRIBE"))
  route(2);

 if (is_method("PUBLISH")) {
  sl_send_reply("503", "Service Unavailable");
  exit;
 }
 if (is_method("REGISTER")) {
  # authenticate the REGISTER requests
  if (!www_authorize("", "subscriber")) {
   www_challenge("", "0");
   exit;
  }
  if (!db_check_to()) {
   sl_send_reply("403","Forbidden auth ID");
   exit;
  }
  if (!save("location")) 
   sl_reply_error();
  exit;
 }
 if ($rU==NULL) {
  # request with no Username in RURI
  sl_send_reply("484","Address Incomplete");
  exit;
 }
 # apply DB based aliases 
 alias_db_lookup("dbaliases");
 # do lookup with method filtering
 if (!lookup("location","m")) {
  switch ($retcode) {
   case -1: # no contact - forward to the call to Asterisk PSTN gateway
   route(4);
   exit;
  case -3: # internal error
   t_newtran();
   t_reply("404", "Not Found");
   exit;
  case -2: # method not supported
   sl_send_reply("405", "Method Not Allowed");
   exit;
  }
 }

 # when routing via usrloc, log the missed calls also
 setflag(2);
 route(1);
}

route[1] {
 # for INVITEs enable some additional helper routes
 if (is_method("INVITE")) {
  t_on_branch("2");
  t_on_reply("2");
  t_on_failure("1");
 }
 if (!t_relay()) {
  sl_reply_error();
 };
 exit;
}

# Presence route
route[2]
{
 if (!t_newtran()) {
  sl_reply_error();
  exit;
 };
 if(is_method("PUBLISH")) {
  handle_publish();
 }
 else if( is_method("SUBSCRIBE")) {
  handle_subscribe();
 }
 exit;
}
route[4] {
 # Forward call to Asterisk 
 rewritehostport("172.20.0.5:5060");
 route(1);
}
branch_route[2] {
 xlog("new branch at $ru\n");
}
onreply_route[2] {
 xlog("incoming reply\n");
}
failure_route[1] {
 if (t_was_cancelled()) {
   exit;
 }
}

Utilizzando ngrep (ngrep -W byline -td any . port 5060) vediamo la fase di REGISTER all’accensione di un telefono (2617):

U 2012/06/08 12:18:23.083810 172.20.0.10:5062 -> 172.20.0.1:5060
REGISTER sip:voip.unisi.it SIP/2.0.
Via: SIP/2.0/UDP 172.20.0.10:5062;branch=z9hG4bK1849514868.
From: "2617" <sip:2617@voip.unisi.it>;tag=1735972936.
To: "2617" <sip:2617@voip.unisi.it>.
U 2012/06/08 12:18:24.916666 172.20.0.1:5060 -> 172.20.0.10:5062
SIP/2.0 200 OK.
Via: SIP/2.0/UDP 172.20.0.10:5062;branch=z9hG4bK1844770290.

Alla registrazione di un telefono, OpenSIPS memorizza il relativo numero (oltre ad altri dati tecnici), nella tabella “location“:

Quando dall’interno 2617 chiamo un altro numero “interno” (ad es. 2650), inteso come registrato sul medesimo proxy, ecco il flusso delle segnalazioni:

U 2012/06/08 12:32:32.512136 172.20.0.10:5062 -> 172.20.0.1:5060
INVITE sip:2650@voip.unisi.it SIP/2.0.
Via: SIP/2.0/UDP 172.20.0.10:5062;branch=z9hG4bK1302839294.
From: "2617" <sip:2617@voip.unisi.it>;tag=533584413.
To: <sip:2650@voip.unisi.it>
U 2012/06/08 12:32:32.611392 172.20.0.1:5060 -> 172.20.0.10:5062
SIP/2.0 100 Giving a try.
Via: SIP/2.0/UDP 172.20.0.10:5062;branch=z9hG4bK836251423.
From: "2617" <sip:2617@voip.unisi.it>;tag=533584413.
To: <sip:2650@voip.unisi.it>.
U 2012/06/08 12:32:32.611712 172.20.0.1:5060 -> 172.20.0.12:5062
INVITE sip:2650@172.20.0.12:5062 SIP/2.0.
Record-Route: <sip:172.20.0.1;lr;ftag=533584413>.
Via: SIP/2.0/UDP 172.20.0.1;branch=z9hG4bK6231.d78da302.0.
Via: SIP/2.0/UDP 172.20.0.10:5062;branch=z9hG4bK836251423.
From: "2617" <sip:2617@voip.unisi.it>;tag=533584413.
To: <sip:2650@voip.unisi.it>.
U 2012/06/08 12:32:32.790067 172.20.0.12:5062 -> 172.20.0.1:5060
SIP/2.0 180 Ringing.
Via: SIP/2.0/UDP 172.20.0.1;branch=z9hG4bK6231.d78da302.0.
Via: SIP/2.0/UDP 172.20.0.10:5062;branch=z9hG4bK836251423.
Record-Route: <sip:172.20.0.1;lr;ftag=533584413>.
From: "2617" <sip:2617@voip.unisi.it>;tag=533584413.
To: <sip:2650@voip.unisi.it>;tag=379428395.
U 2012/06/08 12:32:32.792249 172.20.0.1:5060 -> 172.20.0.10:5062
SIP/2.0 180 Ringing.
Via: SIP/2.0/UDP 172.20.0.10:5062;branch=z9hG4bK836251423.
Record-Route: <sip:172.20.0.1;lr;ftag=533584413>.
From: "2617" <sip:2617@voip.unisi.it>;tag=533584413.
To: <sip:2650@voip.unisi.it>;tag=379428395.

Se il 2650 non risponde e il chiamante decide di rinunciare, ecco che parte una segnalazione CANCEL e si chiude la chiamata:

U 2012/06/08 12:32:37.588802 172.20.0.1:5060 -> 172.20.0.10:5062
SIP/2.0 200 canceling.
Via: SIP/2.0/UDP 172.20.0.10:5062;branch=z9hG4bK836251423.
From: "2617" <sip:2617@voip.unisi.it>;tag=533584413.
To: <sip:2650@voip.unisi.it>;tag=643c56a457061490c918aea728c07866-83f3.
U 2012/06/08 12:32:37.589140 172.20.0.1:5060 -> 172.20.0.12:5062
CANCEL sip:2650@172.20.0.12:5062 SIP/2.0.
Via: SIP/2.0/UDP 172.20.0.1;branch=z9hG4bK6231.d78da302.0.
From: "2617" <sip:2617@voip.unisi.it>;tag=533584413.
Call-ID: 1123041723@172.20.0.10.
To: <sip:2650@voip.unisi.it>.

Quando l’interno 2617 chiama un numero esterno, esempio 2169, ecco che OpenSIPS reindirizza la chiamata all’Asterisk:

U 2012/06/08 12:38:37.068478 172.20.0.10:5062 -> 172.20.0.1:5060
INVITE sip:2169@voip.unisi.it SIP/2.0.
Via: SIP/2.0/UDP 172.20.0.10:5062;branch=z9hG4bK1064669372.
From: "2617" <sip:2617@voip.unisi.it>;tag=969196503.
To: <sip:2169@voip.unisi.it>.
U 2012/06/08 12:38:37.072909 172.20.0.1:5060 -> 172.20.0.10:5062
SIP/2.0 100 Giving a try.
Via: SIP/2.0/UDP 172.20.0.10:5062;branch=z9hG4bK1064669372.
From: "2617" <sip:2617@voip.unisi.it>;tag=969196503.
To: <sip:2169@voip.unisi.it>.
U 2012/06/08 12:38:37.074540 172.20.0.1:5060 -> 172.20.0.5:5060
INVITE sip:2169@172.20.0.5:5060 SIP/2.0.
Record-Route: <sip:172.20.0.1;lr;ftag=969196503>.
Via: SIP/2.0/UDP 172.20.0.1;branch=z9hG4bKe413.748e1db.0.
Via: SIP/2.0/UDP 172.20.0.10:5062;branch=z9hG4bK1064669372.
U 2012/06/08 12:38:37.077108 172.20.0.5:5060 -> 172.20.0.1:5060
SIP/2.0 100 Trying.
Via: SIP/2.0/UDP 172.20.0.1;branch=z9hG4bKe413.748e1db.0;received=172.20.0.1.
Via: SIP/2.0/UDP 172.20.0.10:5062;branch=z9hG4bK1064669372.

Se accade l’opposto, ovvero dalla rete PSTN (es. numero 2169) chiamano un numero interno 2617:

U 2012/06/08 12:41:27.002715 172.20.0.5:5060 -> 172.20.0.1:5060
INVITE sip:2617@voip.unisi.it SIP/2.0.
Via: SIP/2.0/UDP 172.20.0.5:5060;branch=z9hG4bK1fce9b73;rport.
Max-Forwards: 70.
From: "asterisk" <sip:asterisk@voip.unisi.it>;tag=as49579a42.
To: <sip:2617@voip.unisi.it>.
Contact: <sip:asterisk@172.20.0.5>.

Su Asterisk ho:

-- Starting simple switch on 'DAHDI/1-1'
 -- Executing [s@from-pstn:1] NoOp("DAHDI/1-1", "Entering from-dahdi with DID == ") in new stack
 -- Executing [s@from-pstn:2] Ringing("DAHDI/1-1", "") in new stack
 -- Executing [s@from-pstn:3] Set("DAHDI/1-1", "DID=s") in new stack
 -- Executing [s@from-pstn:4] NoOp("DAHDI/1-1", "DID is now s") in new stack
 -- Executing [s@from-pstn:5] Set("DAHDI/1-1", "CHAN=1-1") in new stack
 -- Executing [s@from-pstn:6] Set("DAHDI/1-1", "CHAN=1") in new stack
 -- Executing [s@from-pstn:7] Macro("DAHDI/1-1", "from-pstn-1,s,1") in new stack
 -- Executing [s@macro-from-pstn-1:1] NoOp("DAHDI/1-1", "Entering macro-from-pstn-1 with DID = s and setting to: 2617") in new stack
 -- Executing [s@macro-from-pstn-1:2] Set("DAHDI/1-1", "DNID=2617") in new stack
 -- Executing [s@from-pstn:8] NoOp("DAHDI/1-1", "Returned from-pstn-1") in new stack
 -- Executing [s@from-pstn:9] Dial("DAHDI/1-1", "SIP/2617@voip-trunk,20") in new stack
 == Using SIP RTP CoS mark 5
 -- Called 2617@voip-trunk
 -- SIP/voip-trunk-0000006b is ringing

Ho ovviamente rimosso tutte le segnalazioni di ACK e di OK non necessarie alla comprensione del flusso di funzionamento. Credo comunque che sia piuttosto chiaro il flusso delle segnalazioni SIP. Importante citare che la voce viene inviata via RTP da telefono a telefono pertanto considerate che, a meno di prevedere proxy RTP, tutti gli apparecchi devono essere raggiungibili sulla rete.

Ovviamente queste sono da considerarsi note di lavoro e sono, pertanto, soggette a errori, imprecisioni e omissioni.

 

About Michele Pinassi

Nato a Siena nel 1978, dopo aver conseguito il diploma in "Elettronica e Telecomunicazioni" e la laurea in "Storia, Tradizione e Innovazione", attualmente è Responsabile del Sistema telefonico di Ateneo presso l'Università degli Studi di Siena. Utilizza quasi esclusivamente software libero. Dal 2006 si occupa di politica locale come attivista nel Movimento Siena 5 Stelle.

SIP-T20P

Yealink SIP-T20P VoIP Phone

0

Per motivi di lavoro mi occupo di VoIP, così ho iniziato ad aver a che fare anche con i telefoni VoIP che supportano protocollo SIP (Esistono anche altri protocolli VoIP, quali Skinny -Cisco- e H.323).

Ultimamente abbiamo acquistato una dozzina di Yealink SIP-T20P, che hanno un costo relativamente basso e sembrano possedere discrete qualità tecniche.

Direttamente dal sito web Yealink si possono vedere le caratteristiche. Di seguito riassumo le principali:

  • 2 VoIP accounts, hotline, emergency call
  • Multi-language (more than 20)
  • IP PBX System Integration
  • Codecs: G.722 G.711, G.723.1, G.726, G.729AB
  • VAD, CNG, AEC, PLC, AJB, AGC
  • SIP v1 (RFC2543), v2 (RFC3261)
  • NAT Traversal: STUN mode
  • DTMF: In-Band, RFC2833, SIP Info
  • TFTP/DHCP/PPPoE client
  • Telnet/HTTP/HTTPS server
  • FTP/TFTP/HTTP/PnP auto-provision
  • Security: HTTPS (server/client), SRTP (RFC3711), Transport Layer Security (TLS), VLAN (802.1 pq), QoS

Nella scatola, oltre al telefono e alla base, trovate l’alimentatore da rete 110/220V, il cavo ethernet cat. 5 e il CD con il manuale.

Ecco qualche foto del telefono e screenshots della configurazione:

La programmazione può essere fatta dal display del telefono oppure via web, assegnando un IP via DHCP. L’account di default per accedere all’interfaccia di amministrazione via web è: admin/admin.

Altra caratteristica interessante, oltre alle numerosissime opzioni offerte dal firmware, è la possibilità di esportare e importare la configurazione completa dell’apparecchio. Noi ne abbiamo presi due di scorta e, a seguito del guasto di un telefono, in 5 minuti ne avevo subito uno pronto con la stessa configurazione.

La qualità costruttiva è standard di un prodotto cinese, tuttavia la Yealink è una delle leader della produzione di questi telefoni e molte marche rivendono questi apparecchi semplicemente ribrandizzandoli.

L’audio è molto buono e nei 3 mesi di utilizzo non hanno dato problemi segni di nota (se non un apparecchio che ha avuto problemi con il display).

Alla fine sono un buon rapporto qualità/prezzo.

About Michele Pinassi

Nato a Siena nel 1978, dopo aver conseguito il diploma in "Elettronica e Telecomunicazioni" e la laurea in "Storia, Tradizione e Innovazione", attualmente è Responsabile del Sistema telefonico di Ateneo presso l'Università degli Studi di Siena. Utilizza quasi esclusivamente software libero. Dal 2006 si occupa di politica locale come attivista nel Movimento Siena 5 Stelle.

opensips

OpenSIPS: L’Installazione

1

Inizio oggi una serie di post che riguardano direttamente il mio lavoro, ovvero il VoIP. Sono stato infatti incaricato ufficialmente di traghettare l’Università di Siena dal vecchio mondo degli Ericcson MD110 alla tecnologia VoIP, essendo stato uno dei pochi ad aver realizzato qualcosa del genere all’interno dello stesso ateneo.

Una bella avventura su cui mi appresto a lavorare al meglio, sfruttando il più possibile software libero (per quanto mi riguarda, ESCLUSIVAMENTE software libero) e niente appliances commerciali.

Alla fine credo che ne usciremo con qualche OpenSIPS, qualche Asterisk per i servizi quali VoiceMail ed IVR, uno o più Patton SR 4960 per interfacciare la rete telefonica ed il centralino tradizionale con la nuova realtà VoIP.

La sfida più grande, infatti, è migrare nel modo più trasparente possibile mantenendo comunque la compatibilità tra i due mondi senza disservizi per l’utenza, ormai abituata ad un certo tipo di servizi e metodologie.

L’idea è di partire migrando piccole realtà, uffici di 10-15 persone, e vedere come si comporta il tutto. Prendiamo spunto da realtà che hanno già fatto, o stanno facendo, il grande passo, come il CNR di Pisa (di cui siamo stati ospiti):

  • OpenSIPS a gestire le registrazioni ed il flusso di messaggi SIP, basando le configurazioni su DB MySQL
  • Asterisk per i servizi IVR e VoiceMail
  • Patton come gateway tra PSTN e VoIP

Inizio quindi a provare OpenSIPS, installando i binari della 1.7.0 su una Debian ad-hoc, da http://opensips.org/pub/opensips/1.7.0/.

Dopo dpkg -i e svariate dipendenze da risolvere, si passa a creare il DB e popolare le tabelle che accoglieranno le configurazioni. Tutti gli schemi si trovano nella directory /usr/share/opensips/mysql e dopo aver importato lo script standard-create.sql (che si limita a creare la tabella “version”), ho scritto due righe in bash per semplificare il lavoro:

#!/bin/sh
for filename in *.sql
do
    mysql -u opensips --password=[password] opensips < $filename
done;

alla fine il vostro bel DB “opensips” sarà popolato da tutte le tabelle necessarie al funzionamento. Adesso si passa ad adattare /etc/opensips/opensips.conf per le proprie necessità. Per iniziare è stato sufficente abilitare i vari moduli ed impostare adeguatamente le credenziali per l’accesso al DB. Nello stesso file, però, c’è la sezione cruciale di OpenSIPS:

####### Routing Logic ########

Per iniziare a giocare, mi sono limitato ad attivare l’autenticazione scommentando questa parte:

if (!(method=="REGISTER") && is_from_local())  /*multidomain version*/
    {
        if (!proxy_authorize("", "subscriber")) {
            proxy_challenge("", "0");
            exit;
        }
        if (!db_check_from()) {
            sl_send_reply("403","Forbidden auth ID");
            exit;
        }
        consume_credentials();
        # caller authenticated
    }

ho lanciato il demone OpenSIPS (/etc/init.d/opensips start) ed ho aggiunto una riga nella tabella subscriber:

id username domain password email_address ha1 ha1b rpid
1 2001 unisi.it 2001 michele.pinassi@unisi.it NUL

per provare se se almeno l’autenticazione funziona. Ho poi installato ngrep (apt-get install ngrep) per monitorare cosa succede sulla porta 5060:

ngrep -W byline -td any . port 5060

e questo è il primo risultato:

U 2011/10/06 15:43:33.258240 proxy-voip01:5060 -> mypc:5060
SIP/2.0 200 OK.
Via: SIP/2.0/UDP mypc:5060;rport=5060;branch=z9hG4bKPjc1eae852-b68a-4343-8b08-e875cf11899e.
From: <sip:2169@proxy-voip01>;tag=ca889e8a-13be-429d-ad28-50e1252b15e8.
To: <sip:2169@proxy-voip01>;tag=c97b4d1cb1f3d0da549e06a8d482ef63.abf4.
Call-ID: cbfbc2aa-0cf2-4455-aacb-5650beb92f3d.
CSeq: 42858 REGISTER.
Contact: <sip:2169@mypc:5060>;expires=60.
Server: OpenSIPS (1.7.0-notls (i386/linux)).
Content-Length: 0.
.

Per oggi può bastare :-) alla prossima puntata !

About Michele Pinassi

Nato a Siena nel 1978, dopo aver conseguito il diploma in "Elettronica e Telecomunicazioni" e la laurea in "Storia, Tradizione e Innovazione", attualmente è Responsabile del Sistema telefonico di Ateneo presso l'Università degli Studi di Siena. Utilizza quasi esclusivamente software libero. Dal 2006 si occupa di politica locale come attivista nel Movimento Siena 5 Stelle.

Go to Top