Fax server T.38 con Asterisk 14

Prerequisiti: confidenza con il sistema Linux, compilazione ed installazione da sorgente, conoscenza della tecnologia VoIP, conoscenza base di Asterisk.

Le nuove tecnologie informatiche hanno reso praticamente obsoleto il Telefax, lo strumento che, immancabile in ogni ufficio, permetteva di ricevere ed inviare documenti attraverso la linea telefonica.

Anche le ultime normative in materia di Amministrazione Digitale (Art. 47 del CAD, D. Lgs. 82/2005), recentemente aggiornate con la legge n. 98 del 9 agosto 2013, hanno definitivamente chiuso l’epoca dei “fax”, stabilendo che nei rapporti tra pubbliche amministrazioni, ai fini della verifica della provenienza delle comunicazioni, è in ogni caso esclusa la trasmissione di documenti a mezzo fax.

Tuttavia, anche se l’obsolescenza della tecnologia non è dettata solo dalle normative (chi manda più i fax quando via e-mail si può spedire di tutto, gratuitamente ?), alcuni uffici resistono prepotentemente al dover rinunciare a questo strumento, ormai più per abitudine che per reali necessità.

Così, dovendo migrare a VoIP una intera Pubblica Amministrazione che di FAX ne ha ancora molti, per cercare di convincere anche gli ultimi colleghi a dovervi rinunciare, ho implementato un FAX server utilizzando l’ormai arcinoto Asterisk, arrivato alla versione 14, e la libreria spandsp.

Iniziamo sempre da una Debian 8 minimale, scaricando l’ultima versione della libreria spandsp disponibile:

wget http://www.soft-switch.org/downloads/spandsp/snapshots/spandsp-20160831.tar.gz

che scompatteremo, configureremo, compileremo ed installeremo:

cd spandsp-0.0.6
./configure
make
make install

A questo punto scarichiamo l’ultima versione di Asterisk stabile disponibile:

wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-14-current.tar.gz

che scompatteremo e configureremo:

cd asterisk-14.2.0
./configure --prefix=/usr --sysconfdir=/etc --with-mysqlclient 

adesso dobbiamo aggiungere alla configurazione il supporto fax per spandsp:

make menuconfig

L’eventuale abilitazione/disabilitazione di altre voci dipende dalle specifiche richieste e necessità. Suggerisco tuttavia di non modificare le impostazioni senza averne ben chiari gli effetti.

Salviamo le nuove impostazioni e compiliamo Asterisk:

make
make install

Se tutto è andato a buon fine, in /etc/asterisk ci saranno i file di configurazione ed Asterisk sarà pronto per essere configurato secondo le nostre esigenze.

La verifica dell’attivazione del modulo FAX possiamo averla accedendo alla CLI (asterisk -r) e lanciando il comando “fax show capabilities“:

asterisk*CLI> fax show capabilities
Registered FAX Technology Modules:

Type : Spandsp
Description : Spandsp FAX Driver
Capabilities : SEND RECEIVE T.38 G.711 GATEWAY

1 registered modules

A questo punto i comandi ReceiveFAX() e SendFAX() sono a nostra disposizione per essere utilizzati all’interno del dialplan di Asterisk.

Per il mio contesto VoIP, basato su OpenSIPS, ho scelto di utilizzare un sistema basato su alias che reindirizza le chiamate dirette ai numeri fax verso destinazioni “FAX_[numero]“, così da avere maggiore flessibilità. Pertanto in extensions.conf ho:

[default]

; FAXes
exten => _FA[X]_.,1,Noop("from-voip: FAX ${CALLERID(num)} ${EXTEN}")
exten => _FA[X]_.,n,Set(DID=${EXTEN:4})
exten => _FA[X]_.,n,Goto(fax-services,s,1)

che reindirizza tutte le chiamate destinate a FAX_[numero] alla procedura fax-services:

; ======================================================================================
; FAX
; ======================================================================================

[fax-services]
exten => s,1,NoOp("from-voip: FAX ${CALLERID(num)} ${DID}")
exten => s,n,Set(FAXOPT(ecm)=yes)
exten => s,n,Set(FAXOPT(maxrate)=14400)
exten => s,n,Set(FAXOPT(minrate)=2400)
exten => s,n,Set(FILENAME=fax-${DID}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)})
exten => s,n,Set(FAXFILE=${FILENAME}.tif)
exten => s,n,Goto(fax-${DID},s,1)
exten => i,1,Playback(ss-noservice)
exten => i,n,Hangup

[fax-999] ; FAX machine 999
exten => s,1,NoOp(** Receiving Fax : ${FAXFILE} **)
exten => s,n,Set(FAXOPT(localstationid)=+39.0577.000999)
exten => s,n,Set(DEST=o-zone@zerozone.it)
exten => s,n,ReceiveFAX(/tmp/${FAXFILE})
exten => s,n,Hangup()
exten => h,1,NoOp(FaxStatus : ${FAXSTATUS})
exten => h,n,GotoIf(${FAXSTATUS}="SUCCESS"?succ:fail) 
exten => h,n(succ),System(echo | /var/spool/asterisk/fax_receive_cb.php /tmp/${FAXFILE} ${FILENAME} '${REMOTESTATIONID}' ${FAXPAGES} ${CALLERID(num)} ${DID} ${DEST})
exten => h,n(fail),Hangup()

Con questo sistema creare ulteriori “fax” è semplicissimo: basta creare ulteriori “blocchi” [fax-(numero)] e configurarli con le specifiche richieste (nell’esempio sopra, c’è solo un fax che risponde al numero 999).

Qualcuno avrà notato che il dialplan richiama uno script esterno “fax_receive_cb.php“, che si occupa di convertire il file tiff ricevuto da ReceiveFAX() e spedirlo come allegato e-mail all’indirizzo indicato. Questo script richiede 7 argomenti rappresentati da altrettante variabili:

  1. /tmp/${FAXFILE} = Nome del file .tif
  2. ${FILENAME} = Nome univoco del fax
  3. ${REMOTESTATIONID} = ID del fax che ha inviato il documento
  4. ${FAXPAGES} = Numero di pagine ricevute
  5. ${CALLERID(num)} = Numero telefonico del chiamante
  6. ${DID} = Numero telefonico chiamato (il numero del fax di destinazione)
  7. ${DEST} = Indirizzo e-mail dove inviare il fax ricevuto

Lo script può essere scaricato da https://github.com/michelep/SimpleAsteriskFax.

Se desiderate utilizzare questo script assicuratevi di avere installato l’interprete PHP (apt install php5)

A questo punto non rimane che provare il funzionamento del sistema e verificare la corretta ricezione e salvataggio dei fax.

Sono a disposizione, nei limiti del possibile, per eventuali dubbi o suggerimenti.

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 ed esperto di sicurezza informatica nello staff del DPO. Utilizza quasi esclusivamente software libero.

Potrebbero interessarti anche...

Rispondi

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.

%d blogger hanno fatto clic su Mi Piace per questo: