# FreeSWITCH

FreeSWITCH è un server gratuito e open source per la comunicazione in tempo reale attraverso WebRTC e VoIP.
Il software viene distribuito per sistemi operativi Linux, Windows, macOS e FreeBSD. Viene utilizzato per costruire sistemi PBX, servizi IVR, servizi di videoconferenza con chat e condivisione dello schermo, servizi di least-cost routing, Session Border Controller (SBC) e dispositivi di comunicazione embedded. Possiede pieno supporto per la crittografia, ZRTP, DTLS e SIPS. Può fungere da gateway tra la rete telefonica generale, il SIP, il WebRTC e molti altri protocolli di comunicazione. La sua libreria principale, libfreeswitch, può essere incorporata in altri progetti.
È concesso in licenza Mozilla Public License, una licenza di software libero.

## Storia

Il progetto FreeSWITCH è stato annunciato per la prima volta nel gennaio 2006 alla conferenza ETEL di O'Reilly Media.
Nel giugno 2007 FreeSWITCH è stato selezionato da Truphone per essere implementato nei propri servizi e nell'agosto 2007 Gaboogie ha annunciato di aver selezionato FreeSWITCH come piattaforma per le conferenze.
La prima versione ufficiale di FreeSWITCH 1.0.0 (Phoenix) è stata rilasciata al pubblico il 26 maggio 2008. La patch 1.0.1 è stata rilasciata il 24 luglio 2008.
Al ClueCon del 2012 Anthony Minessale ha annunciato il rilascio di FreeSWITCH 1.2.0 e che il team di sviluppo di FreeSWITCH avrebbe creato un ramo software stabile (versione 1.2) e uno di sviluppo (versione 1.3) separati.
FreeSWITCH 1.4, rilasciato all'inizio del 2014, è la prima versione che supporta il protocollo SIP su Websocket e WebRTC.
FreeSWITCH 1.6 ha aggiunto il supporto per la transcodifica video e le videoconferenze, il protocollo Verto per WebRTC e tutti i codec e gli standard WebRTC.
FreeSWITCH 1.8 è stato rilasciato al ClueCon del 2018 con ulteriori aggiornamenti e miglioramenti alla stabilità del progetto.
SignalWire Inc è stata fondata nel 2018 per fornire servizi di telecomunicazione cloud commerciale utilizzando un nucleo elastico FreeSWITCH e fornire uno sponsor commerciale permanente per il progetto open source controllato dai fondatori di FreeSWITCH. La società ha successivamente acquisito la FreeSWITCH Solutions.

## Design

Secondo il lead designer, Anthony Minessale, FreeSWITCH è concepito per essere un softswitch costruito su un core compatto, pilotato da una macchina a stati. Gli obiettivi dichiarati del progetto includono stabilità, scalabilità e astrazione.
Per ridurre la complessità della codebase, FreeSWITCH utilizza librerie software disponibili gratuitamente che eseguono alcune delle funzioni necessarie. Alcune dipendenze sono:
* Apache Portable Runtime (APR e APR-Util)
* SQLite : un'implementazione leggera di un motore SQL
* PCRE - espressioni regolari compatibili con il linguaggio Perl
* Sofia-SIP - un user agent SIP open source
* libspeex - Speex DSP (sostituisce libresample dalla versione 1.0.3)
* mod_spandsp per fax gateway o passthrough T.38
* libSRTP - un'implementazione open source del SRTP
Non tutte queste dipendenze software sono necessarie per compilare l'applicazione principale freeswitch, ma sono dipendenze di vari moduli esterni, come i codec. FreeSWITCH è un'applicazione modulare, in cui i moduli possono estenderne la funzionalità, ma il livello di astrazione impedisce la dipendenza tra moduli. L'obiettivo è garantire che il caricamento di un modulo non sia necessario ai fini del caricamento di un altro.

## Funzionalità

FreeSWITCH include diversi moduli che forniscono una moltitudine di applicazioni di telefonia come:
* audioconferenze,
* controllo XML-RPC di chiamate in diretta,
* IVR,
* sintesi vocale e riconoscimento vocale,
* un'interfaccia per la rete telefonica generale sia per i circuiti analogici che quelli digitali,
* protocolli VoIP tra cui SIP, Verto, SCCP, H.323, Extensible XMPP, GoogleTalk, T.38 e altri.
FreeSWITCH fornisce un'API che espone le primitive per il controllo delle chiamate e la funzionalità IVR. Le applicazioni che utilizzano le API possono essere scritte in linguaggio C, C++, Python, Perl, Lua, JavaScript, Java e Microsoft.NET tramite Microsoft CLR o tramite Mono.
Le applicazioni di controllo delle chiamate possono utilizzare l'Event Socket, una funzione di comunicazione basata su un socket Internet all'interno di FreeSWITCH che fornisce un'interfaccia indipendente dal linguaggio. La Event Socket Library (ESL) e gli "ESL-wrapper" sono disponibili per Erlang, JavaScript, Lua, Perl, PHP, Python e Ruby .
A partire dalla versione 1.4 FreeSWITCHsupporta il protocollo WebRTC.
In FreeSWITCH 1.6 è stato aggiunto il supporto per il video muxing ed è stato completato il supporto di WebRTC, wss, dtls, SIP.js, Verto.js, Opus 48 kHz a 8 kHz, resiliente fino al 40% di perdita di pacchetti.
Caratteristiche principali di FreeSWITCH 1.6:
* Supporto al protocollo WebRTC
* Directory utente / dominio centralizzata (directory.xml)
* Granularità CDR in nanosecondi
* Registrazione delle chiamate (in stereo chiamante / chiamato sinistra / destra)
* Motore multi-threaded ad alte prestazioni
* Configurazione tramite utility cURL attraverso un'interfaccia HTTP (mod_xml_curl)
* File di configurazione XML per una facile analisi
* Protocollo agnostico
* Supporto ZRTP per lo scambio di chiavi e la crittografia trasparenti basati su RTP
* Tipo di payload RFC 2833 configurabile
* Generazione e rilevamento di DTMF in banda.
* Conferenza basata su software (nessun requisito hardware)
* Conferenze a banda larga
* Modalità Media / No Media
* Composizione corretta ENUM / ISN integrata
* CDR dettagliato in XML
* Radius CDR
* Server di sottoscrizione
* Presenze di linee condivise
* Presenze di linee con ponte
* Motore Eventing di livello Enterprise / Carrier. (Eventi XML, Eventi valore nome, Eventi multicast)
* Formati di file caricabili e streaming
* Trasmetti in streaming e riproduci da Shoutcast e Icecast
* Interfaccia per frasi vocali multilingue
* Supporto ASR / TTS (nativo e tramite MRCP)
* Funzionalità IP / PBX di base
* Operatore automatizzato
* Suonerie personalizzate (Early Media)
* Supporto XML-RPC
* CDR di più formati supportati
* SQL Engine fornisce la persistenza della sessione
* Isolamento del filo
* Parallel Hunting
* Serial Hunting

## Supporto WebRTC

* FreeSWITCH è un gateway WebRTC, in grado di accettare media crittografati dai browser, convertirli e scambiarli con altre reti di comunicazione, che utilizzano diversi codec e crittografie, ad esempio: PSTN, operatori di telefonia mobile, sistemi legacy, ecc. FreeSWITCH può essere il gateway tra la rete SIP e le applicazioni e i browser su desktop, tablet e smartphone.
* FreeSWITCH è un WebRTC Application Server, in grado di fornire direttamente servizi nativi ai browser, come videoconferenze, IVR, Call Center, senza l'ausilio di alcun gateway o di terze parti. FreeSWITCH può fornire direttamente servizi tramite Secure WebSocket (WSS), SRTP e DTLS, i protocolli WebRTC nativi.
* FreeSWITCH rende disponibile un Piano di Segnalazione aggiuntivo perché con Verto i browser possono avviare o ricevere una chiamata vocale o una videochiamata nel modo più semplice, e possono chattare, condividere lo schermo, ricevere e inviare dati in tempo reale alle applicazioni di back end. Verto è un'alternativa a XMPP o SIP in Javascript. FreeSWITCH può servire in parallelo e contemporaneamente la stessa applicazione ai client che utilizzano la segnalazione in SIP e Verto.

## Supporto per videoconferenze

FreeSWITCH è sempre stata una potente piattaforma per le conferenze, nata molti anni fa come bridge per conferenze audio estremamente scalabile. In una svolta al ClueCon 2015 a Chicago, Illinois, il creatore di FreeSWITCH Anthony Minessale II ha annunciato il supporto per la transcodifica video, il missaggio, la manipolazione e la funzionalità Multipoint Control Unit (MCU). FreeSWITCH ora ha le funzionalità di videoconferenza più avanzate e mature:
* Supporto e transcodifica di più codec video
* Layout video multipli
* Lo schermo si divide
* Picture in picture
* Condivisione dello schermo
* Sovrapposizione video (didascalie, loghi e così via)
* Mixaggio video
* Effetti video e manipolazione in tempo reale
* Chroma-Key (video che mixa uno sfondo)
* Partecipanti SIP, WebRTC, VERTO, ISDN

## Codec supportati

FreeSWITCH supporta una varietà di codec audio e video:
* PCMU – G.711 μ-law
* PCMA – G.711 A-law
* G.722
* G.722.1
* G.722.1c
* G.726
* G.726 with AAL2 packing
* G.729 (passthrough)
* G.729 (licensed)
* GSM
* CELT and Opus
* iLBC
* DVI4 (IMA ADPCM)
* BroadVoice
* SILK
* Speex (narrow and wideband) with RFC 5574 fmtp support
* Codec2
* LPC-10
* AMR
* AMR-WB
* iSAC
* OPUS RFC 6716, RFC 7587
* VP8
* VP9
G.723.1, H263 e H264 sono supportati in modalità pass-through. Poiché i dati compressi grezzi vengono trasmessi tra i chiamanti senza alcuna elaborazione, ciò consente il supporto per alcuni codec che non possono essere forniti gratuitamente a causa di brevetti o altri problemi di licenza.
Il software supporta schede di transcodifica hardware, come quelle prodotte da Sangoma. Questi implementano i codec nell'hardware, riducendo l'utilizzo della CPU del server. Alcuni di questi codec sono dotati di licenza completa, fornendo un'alternativa alle opzioni pass-through sopra.

## Protocolli supportati

* SIP con mod_sofia
** Trasporti UDP, TCP, SCTP e TLS per la piena conformità SIP
** Trasporti xiWS e WSS per la piena conformità WebRTC
** SIP v.2.0 (RFC 3261)
** Supporto IPv6
** Timer di sessione SIP
** Timer RTP
** RFC 3263 (SRV e NAPTR)
** RFC 3325
** RFC 4694
** SRTP tramite SDES (funziona con Polycom, Snom, Linksys e Grandstream)
** Registrazione SIP cieca
** Supporto STUN
** Buffer jitter
** Supporto NAT
** Registrazioni SIP distribuite
** Negoziazione codec tardiva
** Più registrazioni SIP per account utente
** Multitenancy - Più UA SIP
** SIP reinvita
** Può agire come SBC (Session Border Controller)
** Gestisci presenza
** SIP / SEMPLICE (può passare ad altri protocolli di chat)
** Supporto per cercapersone multicast SIP per Linksys e Snom
** Supporto interfono / risposta automatica
** Funzioni di chiamata come Chiamata in attesa (Re-INVITE), Trasferimento cieco (RIFERIMENTO), Deviazione di chiamata (302), ecc.
* mod_skinny - Skinny Call Control Protocol (SCCP)
* mod_verto - VERTO WebRTC Signaling Protocol

## Applicazioni supportate

* Segreteria telefonica
** Multitenancy - Configurazione Enterprise / Carrier
** Saluti dell'ora del giorno
** Tagging dei messaggi urgenti
** Consegna tramite posta elettronica
** Riproduci e registra nuovamente i messaggi prima della consegna
** Le chiavi sono modelli che puoi riorganizzare in base alle tue esigenze
** Supporto per la richiamata dall'interno della casella vocale
** Podcast di posta vocale (RSS)
** Indicatore di messaggio in attesa (MWI)
* Supporto per le code (tramite mod_fifo o mod_callcenter)
* Parcheggio (tramite mod_fifo)
* Conferenza
** Conferenze basate su software senza requisiti hardware
** Conferenze a banda larga
** Conferenze multiple su richiesta o programmate con annunci di ingresso / uscita
** Riproduci file nella conferenza o in un singolo membro
** Relazioni
** Integrazione TTS
** Trasferimenti
** Chiamate in uscita
** Lay chiave configurabile
** Volume, guadagno e livello di energia per chiamata
** Transizione dal ponte alla conferenza
** Composizione in uscita multi-party
** Conferenza RFC 4579 SIP CC per UA
** Registrazione automatica o su richiesta
* Lettore RSS
* Endpoint fax, gateway e modalità passthrough
** T.30 (G.711) Audio Fax (tramite mod_spandsp) precedentemente noto come mod_fax.
** Fax T.38 (gateway, endpoint e passthrough)

## Metodi di crittografia supportati

* WSS
* HTTPS
* SRTP
* ZRTP
* TLS
* SIPS
* SSL
* SDES
* DTLS

## Supporto alla sintesi vocale e al riconoscimento vocale automatico

* Cepstral
* Flite
* PocketSphinx
* MRCP

## Sistemi operativi supportati

* Debian Linux è il sistema operativo preferito in quanto fornisce il più ampio supporto nelle sue librerie necessario per eseguire FreeSWITCH senza vincoli di licenza
* Altri sistemi Linux, come RHEL e CentOS
* Solaris 10 UNIX (Solaris Studio)
* FreeBSD (gmake)
* macOS (gmake)
* Windows (nativo)

## Confronto con altri software di telefonia

FreeSWITCH occupa uno spazio tra gli switch puri che instradano semplicemente le chiamate, come Kamailio e OpenSIPS, e quelli che forniscono principalmente funzionalità PBX o IVR, come Asterisk e i suoi derivati. FreeSWITCH fornisce elementi costitutivi da cui è possibile creare applicazioni, come un PBX, un sistema di posta vocale, un sistema di conferenza o una scheda telefonica, utilizzando una qualsiasi delle lingue supportate.

## Prodotti derivati

FreeSWITCH è un componente fondamentale in molti prodotti commerciali PBX in a box e progetti open-source. Alcuni dei prodotti commerciali sono bundle hardware e software, per i quali il produttore supporta e rilascia il software come open source.