ASTERISK y la E1 MFC/R2 en México (R2 Modificada de Telmex)

Estuve peleándome un buen rato con las E1 de Telmex, que aqui en Mexico les dicen E1 R2 Modificada, pero en el resto del mundo les llaman MFC/R2. Todos los posts en internet decian que en México eran super difíciles de configurar en las Tarjetas Digium.

Escribí este post para evitar que otros caigan en los mismos errores y evitar dolores de cabeza. Sigue leyendo y veras como activar un E1 R2 Modificada (MFC/R2) en México usando lineas de Telmex.

Algo de señalización primero

No soy un experto, pero lo que leí me dejó lo siguiente. El protocolo MFC/R2 es un protocolo _peer to peer_, es decir, no hay cliente y servidor, los dos dispositivos se comunican con simple señalizacion de 4 bits CAS (Channel Associated Signaling), los bits suelen llamarseles ABCD. Estos bits representan el estado de la linea, de una manera similar a la telefonía analoga. Cada bit significa algo, pero los bits C y D son raramente usados (solo en algunos paises asiáticos), el valor mas comun para ellos es 01. La tabla de estados de los bits ABCD es la siguiente:

--------------+-------+---------+- Estado Enviar Regresar --------------+-------+---------+- Idle/Released: 1001 1001 Seized 0001 1001 Seize Ack 0001 1101 Answered 0001 0101 ClearBack 0001 1101 ClearFwd 1001 0101 ClearFwd 1001 1101 Blocked 1001 1101

Lo que debe pasar es que la tarjeta debe regresar el modo blocked en todos lo canales siempre que no se este usando, es decir, si Asterisk esta apagado. Pero cuando Asterisk enciende debe desbloquear y poner en Idle los canales para esperar llamadas. Ambos extremos del enlace deben estar desbloqueados para que se puedan comunicar.

En caso de que Telmex no tenga activa tu conexión veras mensajes de Far end Blocked en los logs de inicio de Asterisk. Eso es porque Asterisk desbloqueó tu lado del enlace pero el otro lado esta aún bloqueado.

Algunas personas confunden la señalizacion MFC/R2 con la señalización que se hace entre aparatos telefónicos como el de tu casa y PBX, esto es incorrecto. La señalización MFC/R2 se da entre switches, que son los lados de un enlace E1. Para nuestros fines, esta señalización se da entre Asterisk y el lado remoto de la E1, que es distinta a la señalización que se da entre un Asterisk con tarjetas FXS y un aparato telefónico.

Tu Oficina | | Telmex | | [telefono]----[Asterisk]===MFC/R2===[switch] / | | [telefono]+ | |

Cuando se va a realizar una llamada ambos lados del enlace deben estar Idle o no se puede lograr un enlace.

Unicall

La cadena de comunicaciones de Zaptel usualmente funciona asi:

PSTN - zaptel card - zaptel driver - libpri - chan-zap - asterisk

pero con MFC/R2 usa una nueva libreria de abstracción llamada libunicall, que provee de una nueva interfaz unificada de manejo de llamadas (unified call handling interface, unicall). Y funciona de una manera ligeramente distinta.

PSTN - zaptel card - zaptel driver - libmfcr2 - libunicall - chan-unicall - asterisk

Zaptel para una E1 MFC/R2 (R2 Modificada)

Instala los drivers de zaptel, que se instalan igual que siempre, si lo bajamos del CVS usamos:

# cd /usr/src # export CVSROOT=:pserver:anoncvs@cvs.digium.com:/usr/cvsroot # cvs login - the password is anoncvs. # cvs checkout -r v1-0 zaptel libpri asterisk

Luego compilamos zaptel y libpri:

# cd zaptel # make clean; make install # cd ../libpri # make clean; make install

Configuramos /etc/zaptel.conf para MFC/R2 para que ponga los canales en el modo apropiado, es decir, ponemos los bits ABCD del CAS en modo blocked

# MFC/R2 normalmente no usa CRC4 span=1,1,0,cas,hdb3 cas=1-15:1101 dchan=16 cas=17-31:1101 loadzone=us defaultzone=us

Si lees mas arriba la tabla de valores, 1101 es “Regresar: Blocked”, es decir, cuando Telmex le intenta conmunicarse con tus canales, la tarjeta le devuelve “Blocked”, y Telmex se da cuenta de que la tarjeta no esta en uso por Asterisk. Simplemente la tarjeta esta conectada pero no esta en disposicion de recibir llamadas.

Antes de proseguir checa que si ejecutas ztcfg -vv veras:

bash# ztcfg -v Zaptel Configuration ====================== SPAN 1: CAS/HDB3 Build-out: 0 db (CSU)/0-133 feet (DSX-1) 31 channels configured.

Instalando las librerias

Necesitas instalar las librerias spandsp, libsupertone, libmfcr2 y libunicall de ftp.soft-switch.org, pero resulta que ese sitio esta el 50% del tiempo prendido y el 50% apagado, si no puedes acceder a ese sitio tengo un mirror aqui. Bajas spandsp, libsupertone, libmfcr2 y libunicall, descomprimes y compilas.

SpanDSP,

# tar -zxvf spandsp-0.0.2pre18.tar.gz # cd spandsp-0.0.2/ # ./configure # make # make install

por defecto instala las librerias en /usr/local/lib, checa que tu /etc/ld.so.conf tenga este directorio en la lista. Si no lo tiene agregalo y ejecuta _ldconfig_

Se hace lo mismo para libsupertone, libunicall y libmfcr2 (descomprime, ./configure, make y make install). La cosa es que libmfcr2 ademas instala modulos en /usr/local/lib/unicall/protocols que se cargan dinamicamente por libunicall. Libunicall siempre busca sus modulos ahi.

Si quieres probar tu E1 MFC/R2 puedes checar Voip-Info.org en la seccion Testing your MFC/R2 signalling installation, en realidad no es necesario y es una lata. Mejor vamos directo a Asterisk.

Asterisk y los canales Unicall en MFC/R2

Baja chan_unicall.c, unicall.conf.sample y channels_makefile.patch de ftp.soft-switch.org (Recuerda que tengo un mirror aqui)

Luego copiamos al lugar donde bajamos el source del Asterisk, dentro del subdirectorio channels el chan_unicall.c y el channels_makefile.patch.

# cp chan_unicall.c channels_makefile.patch /usr/src/asterisk/channels

y parchas,

#cd /usr/src/asterisk/channels
#patch < channels_makefile.patch

luego compilas el Asterisk.

# cd /usr/src/asterisk/ # ./configure # make # make install # make samples # make config < ---- para clones Redhat

si checas dentro de /usr/src/asterisk/channels veras un archivo chan_unicall.so, si no aparece entonces algo salio mal. No te preocupes a mi me toco editar el makefile de la siguiente manera, te muestro los numeros de linea:

23 CHANNEL_LIBS=chan_modem.so chan_sip.so 24 chan_modem_aopen.so 25 chan_modem_bestdata.so chan_modem_i4l.so 26 chan_agent.so chan_mgcp.so chan_iax2.so 27 chan_local.so chan_skinny.so chan_unicall.so 28

En la linea 27 agregue: chan_unicall.so. Recompilé asterisk, lo instalé, y quedo todo bien.

Luego copia unicall.conf.sample a /etc/asterisk, lo renombras a unicall.conf y lo editas para que este acorde a tu configuracion. Por ejemplo, el mio es:

[channels] usecallerid=yes hidecallerid=no callwaitingcallerid=yes threewaycalling=yes transfer=yes cancallforward=yes callreturn=yes echocancel=yes echocancelwhenbridged=yes echotraining=yes rxgain=0.0 txgain=0.0 group=1 callgroup=1 pickupgroup=1 immediate=no musiconhold=default protocolclass=mfcr2 protocolvariant=mx,10,1 protocolend=cpe group = 1 context= e1-incoming channel => 1-10 ;channel => 17-31 ;skip time slot 16

Como dije antes, MFC/R2 es peer-to-peer asi que la linea _protocolend=cpe_ es ignorada. Tengo asignadas 10 lineas de telmex solamente. La linea _protocolvariant_ es importante para esto. Su sintaxis es:

protocolvariant=pais,digitos-ANI,digitos-DNI

El pais es alguno de los siguientes:

Argentina "ar" Bahrain "bh" Bolivia "bo" Brazil "br" Chile "cl" China "cn" Colombia landlines "co-land" Colombia cellular "co-cell" Czech "cz" Honduras "hn" India "in" Indonesia "id" Korea "kr" Malaysia "my" Mexico "mx" Panama "pa" Philipinnes "ph" Singapore "sg" Thailand "th"

Los Digitos ANI y DNI aun no los comprendo bien, en unos dias le preguntaré a un experto en telefonía convencional a ver que me dice y lo pego aqui. Pero lo que actualmente tengo es 10 digitos marcados para marcar mi numero y 1 digito que varía al final, es decir. Mis lineas son 443305257x, x es alguno de {0,1,2,3,4,5,6,8,9}. O sea que tengo lineas desde 4433052570 al 79.

Probando Asterisk con E1 MFC/R2 (R2 Modificada) de Telmex

Arrancamos Asterisk y entramos a la consola:

# asterisk -vvvvvvvvvvvvvvv& # asterisk -R

Al arrancar debe darte muchos mensajes

Aug 10 03:13:28 WARNING[2419]: chan_unicall.c:2865 handle_uc_event: Unicall/1 event Far end unblocked -- Unicall/1 far unblocked Aug 10 03:13:28 WARNING[2419]: chan_unicall.c:2865 handle_uc_event: Unicall/1 event Local end unblocked -- Unicall/1 local unblocked Aug 10 03:13:28 WARNING[2419]: chan_unicall.c:2865 handle_uc_event: Unicall/2 event Far end unblocked -- Unicall/2 far unblocked

uno para cada linea que tengas, nota el Local end unblocked y el Far end unblocked. Si no aparece nada algo o si aparece Far end blocked o algo similar checa que Telmex te haya desbloqueado la linea, llámales y gritales hasta que te arreglen la conexion :-P.

Otra forma de probar es llamarte a ti mismo, usa tu celular y llama a una linea de la E1. Deben aparecer mensajes del tipo:

Aug 10 03:18:48 WARNING[2419]: chan_unicall.c:2865 handle_uc_event: Unicall/1 event Detected Aug 10 03:18:49 WARNING[2419]: chan_unicall.c:2865 handle_uc_event: Unicall/1 event Offered Aug 10 03:18:49 WARNING[2419]: chan_unicall.c:2920 handle_uc_event: CRN 32769 - Offered on channel 0 (ANI: , DNIS: 0) Aug 10 03:18:49 WARNING[2419]: chan_unicall.c:2865 handle_uc_event: Unicall/1 event Accepted (...) Aug 10 03:18:54 WARNING[2564]: chan_unicall.c:1347 unicall_hangup: Hangup: channel: 1 index = 0, normal = 24, callwait = -1, thirdcall = -1 Aug 10 03:18:54 WARNING[2564]: chan_unicall.c:962 update_conf: Updated conferencing on 1, with 0 conference users Aug 10 03:18:54 WARNING[2419]: chan_unicall.c:2865 handle_uc_event: Unicall/1 event Drop call Aug 10 03:18:54 WARNING[2419]: chan_unicall.c:3246 handle_uc_event: CRN 32769 - Doing a Release Call -- Hungup 'UniCall/1-1' Aug 10 03:18:54 WARNING[2419]: chan_unicall.c:2865 handle_uc_event: Unicall/1 event Release call Aug 10 03:18:54 WARNING[2419]: chan_unicall.c:3260 handle_uc_event: CRN 32769 - Call released -- Unicall/1 released Aug 10 03:18:54 WARNING[2419]: chan_unicall.c:1042 unicall_disable_ec: disabled echo cancellation on channel 1

Antes de continuar checa que tengas esos mensajes en el log y que Telmex tenga activa tu conexion E1.

¿Aun no funciona?

Si Telmex te dice que tiene activa tu linea y tienes todo configurado bien, como dice arriba, te recomiendo reiniciar tu maquina, eso me paso a mi y creeme que es un dolor de cabeza. Reinicia e intenta de nuevo. Es algo extraño pero a mi me funciono.

Puedes checar el estado de las lineas usando _UC show channels_ a mi me aparece:

Asterisk*CLI> UC show channels Channel Extension Context Status Language MusicOnHold 1 0 e1-incoming Idle default 2 e1-incoming Idle default 3 e1-incoming Idle default 4 e1-incoming Idle default 5 e1-incoming Idle default 6 e1-incoming Idle default 7 e1-incoming Idle default 8 e1-incoming Idle default 9 e1-incoming Idle default 10 e1-incoming Idle default

Si notas los canales estan en _Idle_, eso es lo correcto. Si no puedes usar el comando _UC_ significa que tu modulo chan_unicall no se ha cargado, regresa, compilalo y verifica que este en el lugar adecuado, normalmente esta en /usr/lib/asterisk/modules/chan_unicall.so.

Configurando las extensiones

Ya que tienes la tarjeta con sus canales funcionando es hora de configurar las extensiones. Como se ve en _UC show channels_ en unicall.conf configuramos para que las llamadas entrantes _caigan_ en el contexto _e1-incoming_. Es cosa de editar extensions.conf y colocar la definicion de ese contexto con algun manejador apropiado. En el mio esta asi:

[e1-incoming] exten => _.,1,Ringing exten => _.,2,Answer exten => _.,3,VoicemailMain exten => _.,4,Hangup

Y cuando marco alguna de las extensiones me manda al Voicemail, entonces escucho el clasico mensaje “Comedian mail, login”. Felicitaciones ya puedes recibir llamadas en tu E1 MFC/R2 (R2 Modificada). Configurar extensiones y demás esta fuera del alcance de este articulo, pero es muy fácil.

Ahora para hacer llamadas es igual que usar Dial(Zap/g1….) pero usas Dial(Unicall/g1…).