Esperimenti con Asterisk e T38
by admin on Sep.10, 2010, under Asterisk, Linux, Telefonia, VoIP
Il faxing T38 o FoIP (Fax over IP) è una modalità che ormai molti provider offrono e che dovrebbe finalmente sollevare i system integrators dall’onere di aver a che fare con linee analogiche o ISDN solo a causa dei fax, come da quello di applicare patches diverse per channels particolari a seconda dell’hardware utilizzato, specialmente in ambiente Asterisk.
Il supporto al faxing è sempre stato un punto debole di Asterisk, e ciò riguarda anche il supporto a T38, che normalmente consente solamente la modalità passthrough, mentre alcuni dei suoi concorrenti, per primo il suo fork CallWeaver, da tempo possono vantare un supporto T38 completo e più maturo.
Per poter iniziare a sperimentare con la normale modalità T38 Passtrough di Asterisk occorrerebbero dei fax, almeno due, e se, come me, non ne possedete nemmeno uno, l’unica alternativa è quella di sostituirli con dei software in grado di emularli.
Come originatore di fax in ingresso e come destinatario per quelli in uscita ho utilizzato due softphones Voiper (ex Idefisk), che rappresentano appunto un ottimo strumento per sperimentare con il FoIP, senza possedere alcun fax.
La funzionalità T38 Passthrough è facilmente verificabile in una situazione come la seguente, che prevede solamente la presenza di due host collegati in rete locale:
Il server Asterisk è in esecuzione sulla macchina host1 (IP 192.168.1.10), dove si trova in esecuzione anche un SIP softphone Zoiper, che, per non entrare in conflitto col server a causa della coabitazione, è impostato ad utilizzare la porta UDP 5062 anziché la 5060.
Un secondo softphone Zoiper si trova in esecuzione su host2 (IP 192.168.1.11)
A livello di server Asterisk i due softphones sono così definiti in sip.conf:
[zoiper1]
t38pt_udptl = yes,none
t38pt_usertpsource=no
type=friend
context=faxing
host=dynamic
user=zoiper1
allow=alaw
directmedia=no
[zoiper2]
t38pt_udptl = yes,none
t38pt_usertpsource=no
type=friend
context=faxing
host=dynamic
user=zoiper2
callerid=zoiper2
allow=alaw
directmedia=no
mentre dal punto di vista dei client la configurazione è molto semplice, bastando impostare per entrambi, come dominio, l’indirizzo IP del server Asterisk, uno username identico a quello definito a livello server (figura seguente)

ed il supporto al faxing over IP, che viene chiaramente dichiarato come sperimentale), attivo (figura seguente).

La porzione di dialplan relativa alla trasmissione (passthrough) di un fax T38 può essere la seguente:
[faxing]
exten => 444,1,Answer
exten => 444,n,Wait(2)
exten => 444,n,Dial(SIP/zoiper2)
exten => 444,n,Hangup
exten => 555,1,Answer
exten => 555,n,Wait(2)
exten => 555,n,Dial(SIP/zoiper1)
exten => 555,n,Hangup
Si può a questo punto comporre l’estensione sull’altro softphone, ma anziché il pulsante Dial premere quello di Invia Fax (figura seguente), azione che causa l’apertura di una finestra di dialogo per la selezione di un file formato TIFF da inviare come fax. Dopo aver confermato la scelta il file viene immediatamente trasmesso.

Dall’altra parte, al termine della ricezione, il file grafico può venire aperto automaticamente.
Il supporto T38 in Asterisk può anche essere esteso esteso a costituire una terminazione t38 (in realtà sarebbe più corretto parlare di gateway).
L’obiettivo lo si ottiene compilando l’applicazione app_fax (presente nei sorgenti di Asterisk) dopo aver installato come prerequisito essenziale la libreria spandsp.
Su Ubuntu (su Debian fa lo stesso):
# apt-get install libspandsp-dev
Una volta ricompilato Asterisk vi saranno due nuove applicazioni, ReceiveFax e SendFax
In tal modo, ad esempio, un fax trasmesso come t38 viene trasformato direttamente in un file tif, durante la ricezione.
Il pezzo di dialplan interessato è:
exten => 555,1,Answer
exten => 555,n,Wait(2)
exten => 555,n,Set(FAXFILE=/tmp/${UNIQUEID})
exten => 555,n,Set(FAXEXTEN=${EXTEN})
exten => 555,n,Set(CALLER=${CALLERID(num)})
exten => 555,n,Receivefax(${FAXFILE}.tif)
exten => h,1,NoOp(CHIAMANTE ${CALLER} STATUS ${FAXSTATUS}, FAXMODE ${FAXMODE} FILE ${FAXFILE})
exten => h,n,NoOp(Invocato lo script /var/lib/asterisk/scripts/mailfax.sh con argomenti "${CALLER}" "${FAXEXTEN}" "domenico.raffaele@voipandhack.it" "${FAXFILE}"
exten => h,n,System(/var/lib/asterisk/scripts/mailfax.sh "${CALLER}" "${FAXEXTEN}" "domenico.raffaele@voipandhack.it" "${FAXFILE}"
Quando il client Zoiper2 invia un fax, ma la stessa cosa succederebbe se ad inviarlo fosse un provider, la reazione è:
-- Executing [555@default:1] Answer(”SIP/zoiper2-0000000d”, “”) in new stack
– Executing [555@default:2] Wait(”SIP/zoiper2-0000000d”, “2″) in new stack
– Executing [555@default:3] Set(”SIP/zoiper2-0000000d”, “FAXFILE=/tmp/1284028897.13″) in new stack
– Executing [555@default:4] ReceiveFAX(”SIP/zoiper2-0000000d”, “/tmp/1284028897.13.tif”) in new stack
[Sep 9 12:42:56] WARNING[14846]: app_fax.c:811 transmit: Transmission error
== Spawn extension (default, 555, 4) exited non-zero on ‘SIP/zoiper2-0000000d’
– Executing [h@default:1] NoOp(”SIP/zoiper2-0000000d”, “FAXSTATUS SUCCESS, FAXMODE T38, FAXFILE /tmp/1284028897.13″) in new stack
Il transmission error non significa necessariamente che la trasmissione sia fallita.
Quello che importa è che l’extension speciale h rilevi che la variabile ${FAXSTATUS} valga SUCCESS, quella che rileva il mode (${FAXMODE}) sia effettivamente T38, e che vi sia un nuovo file come risultato della trasmissione.
Se cosi è infatti entrano in funzione le ultime due priorità della estension invocata:
-- Executing [h@default:2] NoOp(”SIP/zoiper2-00000022″, “Invocato lo script /var/lib/asterisk/scripts/mailfax.sh con argomenti “zoiper2″ “555″ “domenico.raffaele@voipandhack.it” “/tmp/1284047868.34″”) in new stack
– Executing [h@default:3] System(”SIP/zoiper2-00000022″, “/var/lib/asterisk/scripts/mailfax.sh “zoiper2″ “555″ “domenico.raffaele@voipandhack.it” “/tmp/1284047868.34″”) in new stack
Lo script mailfax.sh provoca l’invio per posta elettronica dell’avviso di ricezione di un fax alle caselle postali desiderate, col fax ricevuto in allegato.
Se si è verificato un errore bloccante nella ricezione, ne viene comunque inviata una notifica per email.
Un riscontro di questo lo si ha nella immagine seguente.


