Declarar contextos en RealTime

Asterisk, RealTime 1 Comment

Y cuando al final creemos que lo hemos visto ya todo en asterisk, aparece el realtime…

En este caso hablamos de declarar un contexto. Algo tan sencillo de hacer en nuestro dialplan puede sacarnos de quicio si intentamos hacerlo en realtime, ya que directamente, no se puede. Solo es posible declarar el contexto en el dialplan, aunque luego lo desarrollemos en realtime.
Por ejemplo si queremos utilizar un contexto “mi_contexto” en realtime, primero debemos declararlo en el extensions.conf de la siguiente manera:

[mi_contexto]
switch => Realtime/mi_contexto@

Parece fácil ¿verdad? Lo es.
Pero en nuestro caso, estamos desarrollando una aplicación PHP que crea y destruye contextos de forma dinámica, por lo que no sabemos a priori cuantos contextos vamos a utilizar.

Tras releer varias veces los manuales y consultar varios foros, solamente hemos conseguido solucionarlo de la siguiente manera: Hemos declarado en extensions.conf 200 contextos (en nuestro caso es mas que suficiente con 200) y los hemos nombrado “contexto1”, “contexto2”, etc. :

[contexto1]
switch => Realtime/contexto1@
[contexto2]
switch => Realtime/contexto2@
...
[contexto200]
switch => Realtime/contexto200@

Nos aseguramos de esta forma que la aplicación podrá usar cualquier contexto de estos ya creados. Sabemos que no es la solución mas elegante, ni la mas eficiente, pero funciona. De todos modos si alguno de nuestros lectores conoce una solución mejor, será bien recibida.

La cancelación de eco infernal.

Asterisk, Hardware No Comments

Llegas, montas el servidor, configuras asterisk, instalas los clientes y todo parece perfecto hasta que alguien pregunta: “¿porque me escucho con eco cuando hablo con alguien de fuera?”. Siguiendo las recomendaciones del proveedor habíamos comprado una tarjeta sin cancelador de eco, por lo que no nos queda mas remedio que intentar eliminarlo mediante software… manos a la obra.

Caracola

En un principio intentamos activar la cancelación de eco que trae implementada Asterisk tocando las variables echocancel y echocancelwhenbridged en el archivo zapata.conf pero no conseguimos ningún resultado, nisiquiera activando echotraining conseguimos solucionarlo, es más, al activar este último valor, pasabamos de escuchar la voz con eco, a no escuchar absolutamente nada, no sabemos si esto se debe a algún problema con la transición zaptel-dahdi, o por incompatibilidad de echotraining con el hardware de nuestra tarjeta zaptel.

Nuestro siguiente paso fue configurar las ganacias de entrada y salida. Encontramos un manual en el que explica como calibrar los valores rxgain y txgain, mediante la reproducción de un tono de 1004KHz de frecuencia, y el monitor de niveles ztmonitor. Con esto conseguimos mejorar los volúmenes y reducir un poco el eco, no lo suficiente.

Decidimos pasar a una solución comercial, en este caso el High Perfomance Echo Canceller (HPEC) de Digium, que en este caso ofrece licencias gratuitas a los poseedores de tarjetas analógicas Digium, pero tras un día de pruebas, el resultado, aunque notablemente mejor, sigue siendo insuficiente. Otro mas a descartar.

Tras leer algunas opiniones por internet nos decidimos a probar el nuevo cancelador de echo SoftEcho ofrecido por la empresa canadiense Octware comprando una única licencia para ver el resultado. Pasamos un día mas intentando compilar, instalar, y hablando con el servicio técnico del distribuidor, y en resumen haciendo funcionar este cancelador, pero sin éxito.

Cancelador de eco Digium

Como la cosa se alargaba ya mucho, y para no abusar de la paciencia del cliente, nos decidimos a comprar el cancelador de eco por hardware de Digium… y fue la mejor decision que tomamos en toda la semana, al día siguiente ya nos había llegado el paquete, lo instalamos en el servidor, y magia! el eco desapareció totalmente, y con el se acababa nuestra pesadilla.

Moraleja: Siempre es bueno tener un módulo cancelador de eco en reserva, nunca se sabe con que nefasto montaje de linea os vais a encontrar, y en cuanto veais que la cosa se pone fea… cancelador por hardware al canto!

La variable “rtcachefriends”

Asterisk, RealTime No Comments

Recientemente hemos tenido que montar una distribución de Asterisk sobre un Debian Lenny, y todo ha ido sobre ruedas hasta que nos hemos puesto a montar los clientes SIP en realtime: resulta que al agregar un usuario a la base de datos del RT y loguearnos en el softphone, nos aparecia en la consola de asterisk una y otra vez:

[Nov  3 09:12:45] NOTICE[7266]: chan_sip.c:12335 handle_response_peerpoke: Peer ‘104′ is now Reachable. (3ms / 2000ms)

[Nov  3 09:12:45] NOTICE[7266]: chan_sip.c:12335 handle_response_peerpoke: Peer ‘104′ is now Reachable. (2ms / 2000ms)

[Nov  3 09:12:46] NOTICE[7266]: chan_sip.c:12335 handle_response_peerpoke: Peer ‘104′ is now Reachable. (2ms / 2000ms)

Este mensaje se repite cada 2 o 3 ms, para avisarte que te has registrado correctamente en tu extensión saturando toda la pantalla, y dejando la consola inutilizada.

Despues de un par de horas tirandonos de los pelos, recompilando Asterisk, cambiando de base de datos, cambiando de sofphone,  y probando a poner servidor bocabajo (a punto estuvimos) dimos con el problema… ¡¡La variable “rtcachefriends” en el archivo sip.conf!!

Cuando la tenemos activa, es la que dice a Asterisk que debe meter a todos los usuarios creados en tiempo real en la caché interna donde se almacenan también los “friends” agregados por el archivo de configuración sip.conf. Digamos que cuando no está activa nuestro Asterisk es como el pececito Doris, solo ahora pierde la memoria cada 3 ms y vuelve a registrar una y otra vez al mismo usuario.

Así que ya sabeis niños, cuando trabajeis con usuarios en realtime, rtcachefriends=yes.

Configurando extensiones SIP en real time

Asterisk 1 Comment

Una de las ventajas de Asterisk es la arquitectura realtime. Este sistema permite almacenar la configuración de nuestro Asterisk en una base de datos, en lugar de hacerlo en los archivos de configuración que tenemos en etc/asterisk. De esta forma Asterisk puede leer los archivos de configuración en tiempo real, en lugar de tener que hacerlo al cargar los módulos.

Lo bueno de esto es que podemos hacer modificaciones en la configuración sin tener que reiniciar Asterisk o recargar módulos. Hoy vamos a mostrar aquí como podemos introducir los clientes SIP en la base de datos de forma que podamos crearlos y modificarlos sobre la marcha.

Lo primero que tenemos que hacer es configurar el acceso a la base de datos, para ello editaremos el archivo res_mysql.conf y introduciremos los datos de conexión:

[general]
dbhost = 127.0.0.1 ;en caso de que Asterisk y mySQL compartan el mismo servidor.
dbname = nombre_bd
dbuser = usuario_bd
dbpass = pass_bd
dbport = 3306 ;puerto por defecto en mySQL

A continuación crearemos una tabla en la base de datos donde alojaremos la información de las cuentas SIP, os pego aquí el choricete SQL para ahorraros el trabajo:

CREATE TABLE `sip_buddies` (
`id` int(20) NOT NULL auto_increment,
`name` varchar(80) NOT NULL default ”,
`host` varchar(31) NOT NULL default ‘dynamic’,
`callerid` varchar(80) default NULL,
`mailbox` varchar(50) default NULL,
`secret` varchar(80) default NULL,
`ipaddr` varchar(15) NOT NULL default ”,
`port` smallint(5) unsigned NOT NULL default ‘5060′,
`regseconds` int(11) NOT NULL default ‘0′,
`username` varchar(80) NOT NULL default ”,
`context` varchar(80) NOT NULL default ‘contexto_saliente’,
`fullcontact` varchar(80) NOT NULL,
`disallow` varchar(45) NOT NULL default ‘all’,
`allow` varchar(45) NOT NULL default ‘g729,gsm,ulaw,alaw,ilbc’,
`type` varchar(45) NOT NULL default ‘friend’,
`qualify` varchar(45) NOT NULL default ‘yes’,
`canreinvite` varchar(45) NOT NULL default ‘yes’,
`nat` varchar(45) NOT NULL default ‘yes’,
`dtmfmode` varchar(45) NOT NULL default ‘rfc2833′,
`record_out` varchar(45) NOT NULL default ‘Adhoc’,
`record_in` varchar(45) NOT NULL default ‘Adhoc’,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=MyISAM;

Según las especificaciones del manual, podríamos declarar muchos mas campos en la tabla, pero con estos que hemos puesto es suficiente para nosotros.

NOTA: en “contexto” debemos poner el contexto que tengamos definido para llamadas salientes en nuestro dialplan.

Por último solo nos queda indicarle a Asterisk que la información SIP debe buscarla en la base de datos, en lugar de hacerlo en el archivo de configuración, sip.conf. Para esto editamos el archivo extconfig.conf e introduciremos las siguientes lineas:

sipusers => mysql,nombre_bd,sip_buddies
sippeers => mysql,nombre_bd,sip_buddies

Esto le indica que la información acerca de los sip users y los sip peers debe buscarla en el servidor mysql, en la base de datos nombre_bd, y en la tabla sip_buddies. Guardamos el archivo, reiniciamos Asterisk… y estamos preparados para empezar a registrar usuarios.

Desde ahora ya podemos meter nuestros usuarios SIP en tiempo real. Eso sí, hay que tener en cuenta que nuestro archivo sip.conf ya no sera cargado, por lo que si tenemos alguna configuración de usuarios aquí, debemos pasarla a la base de datos.

Ahora un caso práctico:

Llega a nuestra empresa el nuevo becario, al cual vamos a enmarronar con un monton de encuestas telefónicas. Necesita, claro está, que le creemos una cuenta SIP en asterisk. Los únicos campos requeridos serán name (su extension), callerid (su nombre genérico) y secret (password), así que directamente podemos introducir en MySQL:

INSERT INTO sip_buddies (name, callerid, secret) VALUES (105, ‘Becario’, 44322);

Ahora abrimos la configuración del softfone/telefono SIP, introducimos el usuario y la contraseña… ¡Y listo!

Becario

Un saludo desde aquí a todos los becarios que nos leen! xD

« Previous Entries