Mandare un fax è un’operazione che tutti abbiamo fatto almeno un volta nella vita. Inseriamo il/i foglio/i da inviare nella macchina fax, componiamo il numero del fax di destinazione e aspettiamo che l’invio termini. Alla fine sul display del fax vedremo un messaggio che ci comunicherà se il fax è stato ricevuto o se si sono presentati errori durante la trasmissione. Tutto quello che c'è in “mezzo” e che per noi è totalmente trasparente, è la forma (il protocollo) che i due fax usano per comunicare tra di loro. Questo protocollo è stato definito dalla “International Telecommunication Union” e prende il nome di T.30 (trovate in allegato un file con tutte le specifiche del protocollo)
Nel 1998 la stessa organizzazione definisce un nuovo protocollo che permette di ricevere e inviare fax usando una rete a pacchetti (Internet). Questo protocollo prende il nome di T.38 (in allegato il file con tutte le specifiche).
Come funziona il protocollo T.38
L’immagine che segue ci aiuta a capire:
La macchina fax allacciata alla linea telefonica è connessa a un Gateway che supporta il protocollo T.38 e che si fa carico di trasformare il fax nel formato richiesto per poi essere inviato attraverso la rete Internet. Dall’altra parte un altro Gateway T.38 si incaricherà di “decodificare” i pacchetti in arrivo per poi inviarli al fax di destinazione. Un classico Gateway T.38 funziona come mostrato nell’immagine che segue:
I dati inviati dal terminale fax vendono analizzati e manipolati per essere poi “pacchettizati” e inviati attraverso la rete internet. Per il trasporto dei pacchetti (chiamati IFP) si possono usare diversi protocolli di trasporto. UDPTL, TCP o RTP. sarà compito dei gateway T.38 negoziare il tipo di trasporto. Visto che in Asterisk l’unico protocollo di trasporto permesso è UDPTL vediamo come funziona:
Ogni pacchetto UDPTL conterrà il pacchetto IFP contenente i dati del fax che si sta inviando e un sistema per la correzione degli errori (FEC = forward error correction) oltre a un sistema di controllo che permette verificare che i pacchetti vengano ricevuti nel giusto ordine. In UDPTL esistono due forme per evitare la perdita dei pacchetti:
Il pacchetto UDPTL viene incapsulato in pacchetti UDP (protocollo usato per il trasporto dei dati) che a sua volta è in incapsulato in un pacchetto IP (protocollo usato per gestire il traffico dei pacchetti).
Asterisk supporta il protocollo T.38 però solamente passante (anche se dalle mie prove sembrerebbe che il comportamento è diverso), cioè Asterisk non interviene durante la trasmissione di un fax con protocollo T.38. Per questo motivo da un lato e dall’altro della trasmissione ci dovranno essere due gateway T.38 che si facciano carico di questo compito. In generale l’invio e la ricezione di fax in Asterisk è possibile attraverso la libreria SpanDSP che bisogna installare prima della compilazione di Asterisk (solo versione 1.6.X).
Se abbiamo compilato Asterisk con il supporto FAX entrando nella console dovremmo poter vedere la sintassi delle due applicazioni che ci permettono di inviare e ricevere fax:
asterisk –rvvvvvvvvvvvvvvvv
CLI> core show application ReceiveFax
-= Info about application 'ReceiveFAX' =-
[Synopsis]
Receive a FAX
[Description]
ReceiveFAX(filename[|options]):
Receives a fax from the channel into the given filename overwriting
the file if it already exists. File created will have TIFF format.
The option string may contain zero or more of the following characters:
'c' -- makes the application behave as a calling machine
The default behaviour is to behave as an answering machine.
This application uses following variables:
LOCALSTATIONID to identify itself to the remote end.
LOCALHEADERINFO to generate a header line on each page.
This application sets the following channel variables upon completion:
FAXSTATUS - status of operation:
SUCCESS | FAILED
FAXERROR - Error when FAILED
FAXMODE - Mode used:
audio | T38
REMOTESTATIONID - CSID of the remote side.
FAXPAGES - number of pages sent.
FAXBITRATE - transmition rate.
FAXRESOLUTION - resolution.
Returns -1 in case of user hang up or any channel error.
Returns 0 on success.
CLI> core show application SendFax
-= Info about application 'SendFAX' =-
[Synopsis]
Send a FAX
[Description]
SendFAX(filename[|options]):
Send a given TIFF file to the channel as a FAX.
The option string may contain zero or more of the following characters:
'a' - makes the application behave as an answering machine
The default behaviour is to behave as a calling machine.
This application uses following variables:
LOCALSTATIONID to identify itself to the remote end.
LOCALHEADERINFO to generate a header line on each page.
This application sets the following channel variables upon completion:
FAXSTATUS - status of operation:
SUCCESS | FAILED
FAXERROR - Error when FAILED
FAXMODE - Mode used:
audio | T38
REMOTESTATIONID - CSID of the remote side.
FAXPAGES - number of pages sent.
FAXBITRATE - transmition rate.
FAXRESOLUTION - resolution.
Returns -1 in case of user hang up or any channel error.
Returns 0 on success.
Alcuni ATA in commercio supportano il protocollo T.38. In Voip-info è presente una lista (anche se non molto aggiornata).
Per attivare il supporto T.38 in Asterisk dobbiamo modificare due files:
nano /etc/asterisk/sip.conf
nella parte generale cerchiamo questa linea e la configuriamo come segue:
t38pt_udptl = yes
Salviamo le modifiche e passiamo al secondo file:
nano /etc/asterisk/udptl.conf
Lo configuriamo così:
[general]
udptlstart=4000
udptlend=4099
udptlchecksums=yes
T38FaxUdpEC = t38UDPFEC
T38FaxMaxDatagram = 400
udptlfecentries = 3
udptlfecspan = 3
use_even_ports = no
Salviamo le modifiche e facciamo ripartire asterisk:
/etc/init.d/asterisk restart
Per le mie prove ho configurato un numero Eutelia (che si supporta il T.38 attraverso un gateway server Cisco) e ho aggiunto queste linee al file extensions.conf:
nano /etc/asterisk/extensions.conf
[from-eutelia]
exten => 07331870559,1,Answer
exten => 07331870559,n,Wait(2)
exten => 07331870559,n,Receivefax(/tmp/${UNIQUEID}.tif)
exten => 07331870559,n,Noop(FAXSTATUS ${FAXSTATUS}, FAXERROR ${FAXERROR}, FAXMODE ${FAXMODE})
exten => 07331870559,n,Hangup
Salviamo le modifiche e attualizziamo il Dialplan:
asterisk –rvvvvvvvvvvvvvv
CLI> dialplan reload
La prima prova l’ho fatto usando come provider per la chiamata JustVoIP inviando il fax con Hylafax e Iaxmodem. Questo è il risultato:
Executing [003907331870559@fax-out:1] Dial("IAX2/iaxmodem2-901", "SIP/justvoip/003907331870559") in new stack
-- Called justvoip/003907331870559
-- SIP/justvoip-082e0b38 is making progress passing it to IAX2/iaxmodem2-901
-- Executing [07331870559@from-eutelia:1] Answer("SIP/eutelia3-b6156d00", "") in new stack
-- Executing [07331870559@from-eutelia:2] Wait("SIP/eutelia3-b6156d00", "2") in new stack
-- SIP/justvoip-082e0b38 answered IAX2/iaxmodem2-901
-- Executing [07331870559@from-eutelia:3] ReceiveFAX("SIP/eutelia3-b6156d00", "/tmp/1255656629.101.tif") in new stack
-- Executing [07331870559@from-eutelia:4] NoOp("SIP/eutelia3-b6156d00", "FAXSTATUS SUCCESS, FAXERROR , FAXMODE T38,REMOTESTATIONID VozToVoice") in new stack
-- Executing [07331870559@from-eutelia:5] Hangup("SIP/eutelia3-b6156d00", "") in new stack
== Spawn extension (from-eutelia, 07331870559, 5) exited non-zero on 'SIP/eutelia3-b6156d00'
== Spawn extension (fax-out, 003907331870559, 1) exited non-zero on 'IAX2/iaxmodem2-901'
-- Hungup 'IAX2/iaxmodem2-901'
Come potete vedere il fax è stato ricevuto con successo usando il protocollo T.38 (parte in neretto).
La seconda prova l’ho fatta inviando un fax sempre con hylafax/iaxmodem a un numero CheapNet che ho (usando per la chiamata sempre justvoip)
Executing [6554451618@from-cheapnet:1] Answer("SIP/cheapnet-b5a268e0", "") in new stack
-- Executing [6554451618@from-cheapnet:2] Wait("SIP/cheapnet-b5a268e0", "2") in new stack
[Oct 17 00:17:55] NOTICE[26474]: channel.c:2926 __ast_read: Dropping incompatible voice frame on SIP/cheapnet-b5a268e0 of format ulaw since our native format has changed to 0x8 (alaw)
-- SIP/justvoip-082f2838 answered IAX2/iaxmodem2-293
-- Executing [6554451618@from-cheapnet:3] ReceiveFAX("SIP/cheapnet-b5a268e0", "/tmp/1255756675.129.tif") in new stack
[Oct 17 00:17:57] WARNING[26474]: app_fax.c:383 transmit_audio: channel 'SIP/cheapnet-b5a268e0' refused to negotiate T.38
[Oct 17 00:18:02] NOTICE[2684]: chan_iax2.c:10099 socket_process: Peer 'iaxmodem2' is now REACHABLE! Time: 3
-- ast_get_srv: SRV lookup for '_sip._UDP.sip.cheapnet.it' mapped to host sip.cheapnet.it, port 5060
-- Executing [6554451618@from-cheapnet:4] NoOp("SIP/cheapnet-b5a268e0", "FAXSTATUS SUCCESS, FAXERROR , FAXMODE audio,REMOTESTATIONID VozToVoice") in new stack
-- Executing [6554451618@from-cheapnet:5] Hangup("SIP/cheapnet-b5a268e0", "") in new stack
Come potete vedere in questo caso il fax viene ricevuto come Audio e non T.38
Questo significa che è possibile inviare fax T.30 (hylafax) –> Asterisk –> Eutelia T.38 e che non c’e bisogno di avere un gateway T.38 in entrambe le direzioni. La stessa applicazione ReceiveFAX serve anche per uno scenario tipo: T.30 (hylafax) –> Asterisk –> Chepnet T.30
Il miglior sistema?
Personalmente mi trovo bene con l’accoppiata Hylafax/IAXmodem però risente molto della qualità dello stato della rete e del provider scelto. Con T.38 la ricezione e trasmissione dei Fax dovrebbe essere migliore. Per confermarlo bisognerebbe fare altre prove.
Un’altra possibilità è usare il programma T38modem che una volta compilato e installato può essere usato come gateway T.38 in Hylafax
Per completezza di informazione CallWeaver (che è un fork di Asterisk) supporta il protocollo T.38 nella sua totalità.
Un minimo di bibliografia:
http://www.soft-switch.org/t38/
http://www.itu.int/rec/T-REC-T.38-200704-I/en
http://en.wikipedia.org/wiki/T.38
| Allegato | Dimensione |
|---|---|
| T30 Protocol - ITU-T.pdf | 2.46 MB |
| T38 Protocol - ITU-T.pdf | 2.28 MB |
Commenti recenti
3 settimane 3 giorni fa
4 settimane 15 ore fa
4 settimane 17 ore fa
5 settimane 1 giorno fa
5 settimane 4 giorni fa
8 settimane 20 ore fa
8 settimane 1 giorno fa
8 settimane 6 giorni fa
8 settimane 6 giorni fa
10 settimane 1 giorno fa