Entendiendo FoIP (Fax sobre IP), T.38 y el servidor de fax
¿Qué es FoIP?
FoIP – FAX sobre IP, es la tecnología utilizada para permitir enviar faxes sobre una red de computadoras. El protocolo T38 fue desarrollado para resolver los problemas que aparecen al intentar transportar un fax a través de una llamada sobre telefonía IP, dado que el fax es una tecnología muy anterior a la telefonía IP y no fue diseñado para ser utilizado en ese entorno.
Una llamada de FoIP (FAX) es muy similar a una llamada normal de VoIP (voz). En esencia es una llamada que transmite señales de fax sobre una red IP.
¿Cómo recibe Faxes el servicio 3CX Phone System FAX Server?
3CX Phone System tiene un servicio separado de servidor de fax, que actúa como un cliente SIP dedicado a recibir faxes.
¿Cuál es la diferencia entre una llamada de FoIP y una de VoIP?
La mayor diferencia entre una llamada de VoIP y otra de FoIP es el tipo de media establecido entre los extremos, por lo tanto el SDP adjunto en la señalización SIP también es ligeramente diferente. Tradicionalmente la media de una llamada FoIP es T.38. T.38 es un estándar de la ITU para enviar FAX a través de redes IP. Las sesiones T.38 se encuentran descriptas en el SDP adjunto usando el tipo mime “image/t38″ descripto en la RFC 3362. Es necesario utilizar media T.38 en las llamadas de FAX en contraposición a los codecs de voz normales, ya que los codecs de voz comprimen con pérdida de información (la cual no es percibida en llamadas de voz, pero si en los datos) y por lo tanto no son confiables para transmisión de datos. Los datos T.38 transmitidos contienen data cruda de FAX. Al analizar una llamada de FoIP notará dos diferentes características:
1. En lugar de tener media RTP conteniendo datos de voz, una llamada de FoIP contiene media T.38 con la imagen del FAX.
2. La negociación SDP de la señalización SIP es prácticamente idéntica en una llamada de FoIP y en una de VoIP con la excepción de las imágenes listadas.
Descripción de la Media
El siguiente es un ejemplo de un INVITE desde un dispositivo SmartNode que contiene T.38 en su SDP;
INVITE sip:100@10.172.0.100 SIP/2.0
Via: SIP/2.0/UDP 10.172.0.115:5060
Contact: <sip:3cx@10.172.0.123:5060>
To: “100″<sip:100@10.172.0.100>
From: “anonymous”<sip:404@10.172.0.115:5060>;tag=1
Call-ID: 1-6056@10.172.0.115
Cseq: 1 INVITE
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO
Content-Type: application/sdp
Max-Forwards: 70
User-Agent: SN-4114
Content-Length: 215v=0
o=user1 53655765 2353687637 IN IP4 10.172.0.115
s=-
t=0 0
c=IN IP4 10.172.0.115
m=audio 6000 RTP/AVP 0
a=rtpmap:0 PCMU/8000
a=sendrecv
m=image 4908 udptl t38
a=T38FaxUdpEC:t38UDPRedundancy
a=sendrecvNOTE que los únicos encabezados adicionales son los últimos tres:
m=image 4908 udptl t38
a=T38FaxUdpEC:t38UDPRedundancy
a=sendrecv
La primera línea es una instrucción para el destinatario de la llamada para que envíe la media de tipo “image” al puerto “4908” donde “t38” es el método preferido. Las siguientes líneas (a=) son atributos de la media. En este INVITE describen el tipo de media y la dirección del flujo de datos (bidireccional). Por ejemplo, la conexión será establecido en modo de transmisión y recepción. El destinatario de la llamada sabrá a qué IP deberá enviar la media por la dirección IP mencionada en el encabezado de información de conexión (c=) del SDP “GLOBAL”.
NOTA!! La conexión Global solo aplica cuando no hay información de conexión para la descripción de la media (m=). Cada descipción de media PUEDE tener un encabezado de información de conexión distinto (m=) pero si éste no se encuentra definido el destinatario de la llamada debe utilizar la información provista en el encabezado de conexión “GLOBAL” descripto en el nivel de la sesión. Esto es descripto en mayor detalle en la RFC 2327 en la sección 6.
Informando la ubicación a la PBX – Registración del cliente de FAX
En el arranque, el servicio de FAX lee de la base de datos de 3CX Phone System el DN especial del FAX (número de extensión), el ID de autenticación de la extensión de fax y su contraseña. El cliente de FAX entonces envía un mensaje REGISTER a la PBX utilizando estas credenciales, refrescando la registración cada 10 minutos (por defecto). El monitor de estado mostrará las siguientes líneas de log:
17:11:42.229 FaxCfg::updateContact [CM504008]: Fax Service: registered as sip:888@3CXPhoneSystem with contact sip:888@10.130.0.2:5100;user=phone
Para revisar los detalles de la registración, la respuesta OK al mensaje REGISTER puede ser observada en los logs de trace de 3CXPhonesystem (logs del servidor SIP). En modo verborrágico (verbose) la PBX escribirá en el log la respuesta SIP la cual se verá como la siguiente:
17:37:30.874|DialogUsageManager.cxx(800)|Debug8|Resip|::ResipLogger:SEND: SIP/2.0 200 OK
Via: SIP/2.0/UDP 10.130.0.2:5100;branch=z9hG4bK-29D6-2
Contact: <sip:888@10.130.0.2:5100;user=phone>;expires=600
To: <sip:888@3CXPhoneSystem;user=phone>;tag=0b0ffd5b
From: <sip:888@3CXPhoneSystem;user=phone>;tag=CBB
Call-ID: 0@3CXPhoneSystem
CSeq: 2 REGISTER
User-Agent: 3CXPhoneSystem 5.0.3665.0
Content-Length: 0
La búsqueda dentro de logs en modo verborrágico puede ser tediosa y llevar mucho tiempo. Para encontrar rápidamente entra anotación busque el número de la extensión de FAX. Note que el encabezado de contacto (Contact) contiene la IP y puerto donde el cliente está escuchando. Por defecto el servicio de FAX escucha por mensajes SIP en el puerto 5100 en lugar del puerto usual 5060. El servicio de FAX es configurado de esta forma porque usualmente está instalado en el mismo servidor que la PBX, donde el puerto 5060 ya está siendo utilizado por la PBX. El URI de contacto debe ser un contacto válido alcanzable por el extreme llamante. Es posible que la PBX nunca reciba un pedido de registración (REGISTER). En ese caso puede revisar si el servicio está intentando registrarse en el archive de log “%ProgramData%\3CX\Data\Logs\3CXFAXServer.log”. Si el servicio está intentando registrarse, aparecerán líneas similares a las siguientes:
11:46:24.345|0eec|(0):FAXServer, ♪(nai 0, conn_id 0) SSC Evt (Register): Send SSC_REGISTER_RQ
Si es necesario revisar el pedido de registración mencionado, esto puede ser encontrado en “%ProgramData%\3CX\Data\Logs\FaxTraces\audittrace.log”. Estos son los logs de rastreo de NetBrick los cuales deberían ser generados solamente cuando el nivel de log de la base de datos está configurado en modo “trace”. Dado que estos logs son bastante grandes, es una buena práctica buscar por la hora del pedido de REGISTER que aparece en el archivo de log 3CXFAXserver.log. Una vez encontrado el pedido de REGISTER será como el siguiente:
74- 81- 49| 50- 50|001e1e04-001fdddc| 0.530-I| None | |SIP-IP |SOCK_U_DA_RQ | 0: 1: 0#466:……………………….REGISTER sip:10.130.0.2:5060 SI»– SIP Primitive –To Remote IP address: 10.130.0.2 (5060)
REGISTER sip:10.130.0.2:5060 SIP/2.0
Allow: INVITE,BYE,ACK,OPTIONS,CANCEL
Call-ID: 0@3CXPhoneSystem
Contact: <sip:888@10.130.0.2:5100;user=phone>
CSeq: 1 REGISTER
Expires: 600
From: <sip:888@3CXPhoneSystem;user=phone>;tag=27CB
Max-Forwards: 70
To: <sip:888@3CXPhoneSystem;user=phone>
User-Agent: Netbricks-Sip-T.38IAF/2.01 (PRODUCT ID:5, 05 Jul 2007)
Via: SIP/2.0/UDP 10.130.0.2:5100;branch=z9hG4bK-7EE7-1
Content-Length: 0
El pedido de REGISTER puede ser revisado buscando direcciones IP incorrectas. También preste atención a las líneas de log donde el cliente de Fax describe la dirección IP remota donde ha enviado los pedidos de REGISTER:
…REGISTER sip:10.130.0.2:5060 SI»– SIP Primitive –
Enviando llamadas al servicio de FAX
Las llamadas son enrutadas al cliente de FAX a través de la configuración de las reglas de enrutamiento de FAX en la configuración de cada línea. Pueden elegirse diferentes destinatarios de correo al enrutar las llamadas al FAX. Esto es realizado indirectamente seleccionando una extensión en el menú desplegable “Enviar fax a email de la extensión”. La PBX manipulará la parte visible del encabezado “To” de un mensaje INVITE entrante y lo completará con el número de extensión seleccionado. La PBX luego enviará el mensaje INVITE manipulado al cliente de FAX, caso contrario el mensaje INVITE será enviado sin cambios con el ID de FAX en el encabezado SIP “To”.
Convirtiendo el FAX
Una vez que un mensaje INVITE ha sido recibido por el cliente de FAX, puede negociar la llamada con el llamante, es decir, la pasarela. Note que el flujo de media debe ser pasado directamente desde la pasarela al servicio de FAX y esto no puede hacerse en un dispositivo que está “atado al Media Server”, es decir donde la opción de configuración “Central entrega el audio” se encuentra activada. T.38 no puede ser transcodificado por el Media server por lo tanto la pasarela debe operar con el Media Server en modo “pass-through” o “bypass”. En una llamada exitosa y una vez que el flujo T.38 es recibido exitosamente desde el llamante, la información del FAX es escrita en el directorio de trabajo del servicio de FAX como datos crudos de FAX. Este archivo con datos crudos de FAX es inútil sin su descriptor de datos, el cual se encuentra en la memoria del cliente de Fax. El servicio de FAX accede a esta información y a los datos crudos de FAX del archivo para construir un nuevo archivo TIF conteniendo la imagen del FAX. Los archivos TIF generados son guardados en la carpeta “%ProgramData%\3CX\Data\Fax\Faxes\ToSend” junto con un descriptor XML. El XML es completado con el ID de la extensión de destino, por ejemplo:
<INFO CALLEE_ID=”100″ CALLER_ID=”anonymous” FAX_ID=”” PAGES=”0″>
Convirtiendo y enviando el FAX
El servicio de FAX entonces intentará enviar este archive TIF al destinatario correcto. Obtendrá el ID del destinatario desde el XML y consultará en la base de datos por su dirección de correo electrónico. Si el servicio de FAX encuentra que el adjunto es un archivo TIF, lo convertirá a PDF y lo enviará al destinatario configurado. Si no hay datos de FAX entonces un email sin adjuntos será enviado con la siguiente información:
No Fax was received. Call was either not from a fax machine, or else fax handshaking failed.
El asunto del email será “Fax From: 888888”, donde el numero “888888” es el ID del FAX de la máquina que envió el FAX. El nombre del originante del fax será completado con el campo “Display Name” encontrado en el encabezado “From” del mensaje INVITE de la llamada de FAX.
Los FAX fallidos irán a la carpeta “%ProgramData%\3CX\Data\Fax\Faxes\Failed”. El motivo de la falla se encuentra en los elementos <ERROR>. Este es un ejemplo de falla al intentar enviar el email:
<ERROR>Failed to send SMTP message, response: ”, error: No recipients defined</ERROR>
En caso de tener un fax fallido que necesite ser reprocesado, puede mover el archive XML y el PDF con el mismo nombre a la carpeta “\ToSend”. Una pequeña modificación sera necesaria, la cual implica remover todos los elementos <FLAGS>, <NOTIFICATION>, <NOTIFIED> en el archivo XML. Por ejemplo, remover un bloque de texto similar a este:
<FLAGS>10</FLAGS>
<NOTIFICATION ATTEMPTS=”10″>
<ERROR>Failed to send SMTP message, response: ”, error: No recipients defined</ERROR>
<LASTATTEMPT>20071129154018.168</LASTATTEMPT>
</NOTIFICATION>
<NOTIFIED>20071129154018.168</NOTIFIED>
Enlaces útiles relacionados con FAX
http://www.voip-info.org/wiki/view/T.38
http://www.faqs.org/rfcs/rfc3362.html
http://www.faqs.org/rfcs/rfc2327.html