Verifica questa notizia !

Che Asterisk, con i suoi due moduli rx_fax e tx_fax, non fosse proprio il massimo per la gestione dei fax è risaputo.

Fortunatamente però il mondo opensource può beneficiare di un ottimo programma, HylaFAX, che attraverso IAXModem si interfaccia perfettamente con Asterisk, anche sulla medesima macchina, rendendo finalmente possibile integrare un fax server all’interno del vostro centralino VoIP.

In questo esempio sfrutterò la scheda TDM800 (con 8 canali FXO) collegati ad altrettante linee PSTN: ovviamente, con le dovute correzioni, potete tranquillamente configurare il tutto in un trunk VoIP.

Due parole su IAXModem:

IAXmodem is a software modem written in C that uses an IAX channel (commonly provided by an Asterisk PBX system) instead of a traditional phone line and uses a DSP library instead of DSP hardware chipsets.

Praticamente viene emulato un “modem” fisico, sfruttando per l’handshaking e tutti gli altri segnali in modulazione analogica la libreria spandsp.

Non è questa la sede per approfondire ma per chi ha qualche anno (informatico) sulle spalle, si ricorderà dei vecchi modem analogici, fino a 56Kbps di velocità, che sfruttavano il doppino telefonico per trasmettere dati, attraverso tecniche di modulazione analogica del segnale (PSK, FSK…)

Coloro che utilizzano Debian (o derivate) possono comodamente installare IAXModem tramite APT:

sudo apt-get install iaxmodem

Stessa procedura per HylaFAX:

sudo apt-get install hylafax-server

Ovviamente inizio dal presupposto che abbiate già installato, configurato e testato Asterisk (se non l’avete fatto, cliccate su questo link: Primi passi con il VoIP – Debian, Asterisk e FreePBX).

Prima di passare alla fase di configurazione dei servizi, cerchiamo di capire il flusso di lavoro attraverso un semplice schema di funzionamento, “simulando” la ricezione di un FAX:

asteriskfax

Dalla rete telefonica (PSTN) parte la chiamata. L’interfaccia FXO della scheda TDM800, configurata in Asterisk come dispositivo DAHDI, inoltra la chiamata sul canale IAX verso il “modem virtuale” creato da IAXModem. Quest’ultimo invia il segnale “RING” ad HylaFAX che, come se fosse un vero modem, risponde e riceve il fax.

Quanti FAX volete attivare ?

Già, perché con IAXModem ed HylaFAX potete creare diverse “fax machines” e, trattandosi di “modem virtuali”, la configurazione è poco più di un copia/incolla.

Su IAXModem, nella cartella /etc/iaxmodem, create tanti files quanti sono i “modem virtuali” da attivare:

/etc/iaxmodem# ls
iaxmodem-0.ttyIAX iaxmodem-1.ttyIAX iaxmodem-2.ttyIAX iaxmodem-3.ttyIAX

in ogni file scrivete:

device /dev/ttyIAX[n] 
owner uucp:uucp
mode 660
port 4570
refresh 300
server 127.0.0.1
peername iaxmodem0
secret faxserver
cidname FAXSERVER0
cidnumber [vostro numero di telefono]
codec alaw

La configurazione è molto semplice, tuttavia fate attenzione ad alcuni parametri:

device è nome del dispositivo virtuale che IAXModem creerà dentro /dev (tipicamente ttyIAX[n])

server è il server Asterisk dove IAXModem si connetterà per creare il canale IAX, utilizzando le credenziali “peername” e “secret

cidname e cidnumber sono, rispettivamente, il nome che darete al FAX (es. “Ufficio Reti”) ed il Caller ID (tipicamente il numero di telefono).

pertanto, per evitare errori, nel nostro esempio creeremo un solo modem virtuale sotto il device /dev/ttyIAX0. La configurazione sarà (nel file “iaxmodem.0.ttyIAX”):

device /dev/ttyIAX0
owner uucp:uucp
mode 660
port 4570
refresh 300
server 127.0.0.1
peername iaxmodem0
secret faxserver
cidname FAXSERVER0
cidnumber +3957700001
codec alaw

In Asterisk, ovviamente, dovete create un canale IAX con le medesime credenziali. Dentro il file /etc/asterisk/iax.conf:

[iaxmodem0]
type=friend
host=dynamic
secret=faxserver
context=fax-out
requirecalltoken=no
allow=alaw

Notate i campi in grassetto, rispettivamente il nome del canale IAX (iaxmodem0) e relativa password (faxserver).

A questo punto verifichiamo di aver fatto bene tutti i passaggi, riavviando prima Asterisk e poi IAXModem (/etc/init.d/iaxmodem restart).

Se tutto è andato a buon fine, dovremmo avere il device /dev/ttyIAX0 mentre dalla consolle di Asterisk, digitando “iax2 show peers”:

asterisk*CLI> iax2 show peers 
Name/Username Host Mask Port Status 
iaxmodem0 127.0.0.1 (D) 255.255.255.255 54652 Unmonitored
1 iax2 peers [0 online, 0 offline, 1 unmonitored]

In caso contrario, verificate nei log sia di IAXModem (/var/log/iamodem) che di Asterisk cosa può essere andato storto.

Passiamo ora a configurare la nostra “FAX machine” attraverso il comando:

faxaddmodem

che ci chiederà alcune informazioni, tra cui la più importante è il device del modem:

Serial port that modem is connected to [ttyS0]? ttyIAX0

Rispondete alle successive domande e, alla fatidica “Are these ok [yes]?“, verificate la correttezza dei dati e premete invio.

Verifichiamo che, fino a qui, sia tutto ok. Digitiamo “faxstat -s”, che dovrebbe risponderci con qualcosa tipo:

HylaFAX scheduler on asterisk-gw: Running
Modem ttyIAX0 ([numero di fax]): Running and idle

L’ultimo passaggio è configurare il dialplan di Asterisk così che le chiamate in ingresso sul nostro numero di FAX vengano dirottate direttamente sul trunk IAX. Molto semplicemente, considerando che il nostro Asterisk abbia impostato come contesto per le linee fax “fax-in“, aggiungiamo nel file “/etc/asterisk/extensions.conf” le seguenti righe:

[fax-in]
exten => _X.,n,Goto(s,1)
exten => s,1,Noop("fax-in: ${CHANNEL}")
exten => s,n,Dial(IAX2/iaxmodem0)
exten => s,n,Hangup()

Il comando ‘Noop‘ semplicemente stampa la riga indicata come argomento ed in questo caso serve esclusivamente per fare diagnostica

Ricarichiamo il dialplan con “reload” e proviamo a comporre il numero di telefono al quale dovrebbe rispondere il FAX. Nel log di Asterisk dovrebbe comparire:

Starting simple switch on 'DAHDI/1-1'
 -- Executing [s@fax-in:1] NoOp("DAHDI/1-1", ""from-fax: DAHDI/1-1"") in new stack
 -- Executing [s@fax-in:2] Dial("DAHDI/1-1", "IAX2/iaxmodem0") in new stack
 -- Called IAX2/iaxmodem0
 -- Call accepted by 127.0.0.1 (format ulaw)
 -- Format for call is ulaw
 -- IAX2/iaxmodem0-7851 is ringing

e sul telefono chiamante si dovrebbe sentire il classico “fischio” del FAX.

Bene, passiamo adesso alla fase di invio dei FAX: gran parte del lavoro è già stato fatto, pertanto è sufficiente dire ad Asterisk che quando arriva una chiamata dal canale IAX2, questa deve essere inoltrata verso il mondo esterno. Pertanto, sempre nel nostro bel extensions.conf, aggiungiamo:

[fax-out]
exten => _X.,1,Dial(DAHDI/1-1/${EXTEN})

Il contesto “fax-out” lo avevamo indicato già nella configurazione del canale IAX2, dentro il file iax.conf

proviamo adesso ad inviare un FAX utilizzando il comando “sendfax“:

sendfax -n -d [numero di fax] [file da inviare]

E sempre con il comando “faxstat -s” potete seguire l’andamento dell’invio:

HylaFAX scheduler on asterisk-gw: Running
Modem ttyIAX0 ([numero di fax]): Sending job 1

nel log di Asterisk dovreste vedere:

== Spawn extension (fax-out, [numero], 1) exited non-zero on 'IAX2/iaxmodem2-8159'
 -- Hungup 'IAX2/iaxmodem2-8159'
 -- Accepting AUTHENTICATED call from 127.0.0.1:
 > requested format = alaw,
 > requested prefs = (),
 > actual format = ulaw,
 > host prefs = (ulaw|alaw),
 > priority = mine
 -- Executing [[numero]@fax-out:1] Dial("IAX2/iaxmodem3-826", "DAHDI/1-1/[numero]") in new stack

Per concludere, ecco qualche comodo client per HylaFAX, provato personalmente, che potete utilizzare per il vostro PC o per i colleghi, molto più pratico della console:

  • JHylaFax, scritto in Java ed indipendente dalla piattaforma
  • wphfxwin7, per Windows 7 in poi, che aggiunge il FAX come fosse una stampante (per i sistemi più vecchi, potete usare Winprint HylaFAX)
  • YajHFC, in Java indipendente dalla piattaforma, molto più completo di JHylaFax