Asterisk 1.6.X y el protocolo T.38

Ponemos la hoja en la “maquina”, digitamos el numero de teléfono de destino y esperamos que salga un OK por algún lado. Esta sencilla operación es la que hacemos cuando queremos enviar un FAX. Todo lo que pasa en el “mientras” es para nosotros totalmente transparente. Los dos Faxes negocian todos los pasajes y para hacer eso usan un protocolo. Este protocolo ha sido definido por la “International Telecommunication Union” y tomó como sigla T.30

En 1998 la misma organización define un nuevo protocolo que permite recibir y enviar faxes usando una red a paquetes (Internet). La sigla de este protocolo es T.38.

¿Cómo funciona el protocolo T.38?

Quizás la imagen que sigue nos ayuda a entender:

 

image

 

El FAX, conectado a la línea telefónica está también conectado a un Gateway con soporte T.38. Este Gateway se encarga de transformar el FAX en el formato requerido para luego ser enviado a través de la red Internet. En el lado opuesto otro Gateway T.38 se encarga de “decodificar” los paquetes que lleguen para luego pasar el resultado al fax de destinación. Un Gateway T.38 clásico funciona como se muestra en la imagen que sigue:

 

image

Los datos del FAX T.30 vienen analizados y manipulados para luego ser transformados en paquetes (IFP). Podemos enviarlos usando tres protocolos de transporte: UDPTL, TCP o RTP. Será tarea de los Gateway T.38 negociar el protocolo de trasporte. En el caso de Asterisk el único protocolo de trasporte permitido es UDPTL. Miramos como funciona:

 

image

 

Cada paquete UDPTL contiene encapsulado el paquete IFP (que contiene los datos del fax que estamos enviando y un sistema de corrección de errores – FEC [forward error correction]). Para repetir los paquetes perdidos y controlar que lleguen en el justo orden tenemos a disposición dos sistemas:

  • Con el primero se repite el ultimo paquete enviado como FEC para el paquete que se está enviando
  • Con el segundo se crea un paquete de paridad para un numero determinado de paquetes IFP y se incluye esta información en el paquete UDPTL corriente.

El paquete UDPTL está encapsulado en un paquete UDP (protocolo de trasporte) que a su vez está encapsulado en un paquete IP (protocolo que permite al paquete llegar a destinación).

 

Asterisk e T.38

Asterisk soporta el protocolo T.38 solamente como pasarela, es decir que no está “en el medio” a lo largo del envío del fax. A través de las pruebas que hice  parece que el comportamiento es distinto. A un lado y al otro de la trasmisión deberán estar dos Gateway T.38 que se hagan cargo de la tarea de enviar/recibir el fax. En Asterisk el envío y recepción de faxes es posible a través de la librería SpanDSP que tenemos que instalar antes de la compilación de Asterisk (versión 1.6.X).

Si hemos compilado Asterisk con el soporte FAX desde la consola deberíamos ver la sintaxis de los dos comandos relacionados con los faxes:

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.

Algunos ATA comercializados soportan el protocolo T.38. En Voip-info aparece una lista (aunque no muy actualizada).

Para el soporte T.38 en Asterisk tenemos que modificar dos archivos:

nano /etc/asterisk/sip.conf

en la parte general buscamos esta línea y si está comentada quitamos el punto y coma por delante:

t38pt_udptl = yes

Guardamos los cambios y seguimos con el segundo archivo:

nano /etc/asterisk/udptl.conf

Ponemos:

[general]
udptlstart=4000
udptlend=4099
udptlchecksums=yes
T38FaxUdpEC = t38UDPFEC
T38FaxMaxDatagram = 400
udptlfecentries = 3
udptlfecspan = 3
use_even_ports = no

Guardamos los cambios y volvemos a arrancar Asterisk:

/etc/init.d/asterisk restart

Para mis pruebas he configurado un numero geográfico de Eutelia VoIP (que soporta el protocolo T.38 a través de un Gateway Server Cisco) y he configurado estas líneas en mi 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

Guardamos los cambios y actualizamos el dialplan:

asterisk –rvvvvvvvvvvvvvv

CLI> dialplan reload

En la primera prueba he usado para la llamada saliente Justvoip y he enviado el fax a través de la pareja Hylafax/IAXmodem:

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'

Como se puede notar el fax ha llegado sin problemas y se ha usado el protocolo T.38

En la segunda prueba he usado para la llamada justvoip con Hylafax/IAXmodem y como numero geográfico en recepción un DID de Cheapnet

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

En este caso el “modo” ha sido audio, es decir T.30

Las dos pruebas indican que en Asterisk es posible enviar faxes T.30 (hylafax) –> Asterisk –> Eutelia T.38 y no se necesita tener en ambos lados un Gateway T.38 La misma aplicación Receivefax sirve también para un escenario de este tipo: T.30 (hylafax) –> Asterisk –> Chepnet T.30

¿El mejor sistema?

Personalmente me encuentro bien con Hylafax/IAXmodem aunque si la calidad de la línea no es buena hay problemas con el envío/recepción.

Otra opción podría ser T38modem pero por la pruebas que hice (quizás las voy a publicar) parece bastante complicado de estabilizar.

Para completar Callweaver, que es un fork de Asterisk, soporta el protocolo T.38 en su totalidad.

 

Un mínimo de bibliografía:

http://www.soft-switch.org/t38/
http://www.itu.int/rec/T-REC-T.38-200704-I/en
https://en.wikipedia.org/wiki/T.38

Vota el Articulo: 

Sin votos (todavía)
Evalúa la calidad del articulo

7 comentarios

FAX de alguna forma sobre SIP en Trunk IP

Hola que tal. He leido tu explicación sobre T.38 y T.30, muy buena por cierto, y te comento que estoy intentando poder utilizar faxes a traves de un proveedor de VoIP SIP.
El ideal seria poder utilizar el server de Asterisk, sea con Hylafax u otro similar, y poder enviar y recibir faxes en el mismo server.
Si no he entendido mal, podria tener (que ya he probado en una LAN y no sobre el Trunk del proveedor SIP) Hylafax con IAXmodem en una extension y al recibir llamadas SIP sobre el trunk IP al derivarlas a la extension del IAXmodem que atienda el mismo y reciba el fax?
Como crees que seria la mejor implementación y si es que esta probado que funcione?
El proveedor SIP me ha dicho que no es muy fiable el uso de fax sobre SIP. Si utilizara T.38, seria mi proveedor SIP quien deberia hacer la conversion a T.30 para que un cliente pueda recibir un fax sobre la PSTN convencional?

Gracias de antemano y disculpa la extension...
Saludos!

Re: Fax de alguna forma sobre SIP en Trunk IP

Has entendido bien. Puedes usar un trunk sip y en el contexto donde entran las llamadas a tu Asterisk llamas las extension IAX donde tienes registrado iaxmodem. Yo lo uso desde hace tiempo y la verdad funciona bastante bien.

El fax al clientes se lo envías tu desde Asterisk? Usando el trunk SIP?

Si es así puedes usar tranquilamente iaxmodem/Hylafax.

Si de todas formas quieres el t38, usando el trunk SIP para las llamadas salientes la conversión debe hacerla tu proveedor SIP y no puedes usar IAXmodem/Hylafax

Primero que nada, gracias por

Primero que nada, gracias por la pronta respuesta.

Efectivamente, la idea era desviar el fax entrante por el trunk SIP a la extension donde esta el IAXmodem, pero sin embargo esto entonces seria por T.30 y estaría viajando la señal de fax por audio, o sea sobre el codec que utilice en el trunk IP. G.729 ya sabemos que tendria problemas dada la compresión, pero incluso utilizando G.711 (alaw o ulaw) he visto y me ha dicho el proveedor que no es fiable.
Por lo tanto cuales crees que serian las alternativas para utilizar si o si el trunk SIP?
1- Por T.30 seria con Hylafax/IAXmodem y utilizando G.711? y en ese caso viajaría la señal de fax por audio, cierto? El mejor codec para esto seria G.711 cierto?
2- Utilizando T.38, entonces el proveedor deberia hacer la conversion a T.30 para la PSTN, cierto? En este caso, hay alguna forma de utilizar el servidor donde tenga instalado asterisk para generar y recibir los faxes? Me refiero a que no solo funcione como pass-through, sea instalando software adicional al asterisk y con ello evitarme utilizar una maquina real de fax.

Nuevamente, gracias por la ayuda de antemano. ALGO SALDRA FUNCIONANDO ESPERO!!!

Saludos!

Re: fax T.30 vs T.38

Escenario:

La llamada llega a la PSTN, linea que tienes conectada a Asterisk (me imagino con una tarjeta analógica). Si es así IAXmodem/Hylafax te deberían funcionar sin problemas. Haz una prueba y me cuentas.

Si no te funciona buscamos otras soluciones.

Saludos.

Re: fax T.30 vs T.38

No tengo PSTN. Solamente tengo el trunk SIP.
Por eso respecto a lo que consultaba y entendiendo que son las unicas opciones que tengo a traves del trunk SIP, seria:
A) con T.30, sea con Hylafax u otro, usando codec G.711 (con lo cual se transmitiria sobre el audio)
B) con T.38, sea con un ATA que lo soporte, o algun otro terminador como Callweaver, y el proveedor del trunk SIP deberia hacer la conversion.

Hylafax/IAXmodem no pueden utilizar T.38?

Saludos

Hola Carlos, que tal? con

Hola Carlos, que tal? con dolor de cabeza seguro...

Te cuento que desisti de hacer funcionar esto, ya que T.30 sobre internet no me funcionó bien.. apenas si llega a recibir el fax pero luego se cae la conexion.

Con T.38 el proveedor del trunk SIP debería soportarlo, pero el que poseo no lo soporta y no encontre muchos que si lo hagan.

La verdad no tengo mucha necesidad de usar Fax, pero para el caso utilizaria una linea analogica directamente (o una E1, T1 digital, claro).

saludos

Suscribirse a Comentarios de "Asterisk 1.6.X y el protocolo T.38" Suscribirse a VozToVoice - Todos los comentarios