Usando la red DUNDi en Asterisk

Este mes toca darle un repaso a DUNDI, un protocolo de localización de servicios telefónicos.

Básicamente, DUNDI nos permite crear una red P2P de centralitas, donde cada una “publica” números de teléfono para los que es responsable, como sus extensiones locales, números para la que es la ruta de menor coste, etc.

Dos ejemplos

El ejemplo típico es el de la empresa multisede. Cada sede publica sus extensiones propias, de forma que el resto pueda localizarlas. ¿Quién tiene la extension 329? Esta consulta se enviaría, directa o indirectamente, a todos los equipos (peers) de la red DUNDI. La centralita que sirva esa extensión responderá algo como “IAX2/usuario:clave@1.2.3.4/329″, que es la forma de llamar a dicha extensión. La centralita que hizo la consulta utilizará esa información para llamar efectivamente a la extensión 329.

Aún en el caso de que cada sede tenga asignado un rango de extensiones, DUNDI nos resultará útil, porque evitaremos llamar a la centralita remota si la extensión buscada no está creada aún, aunque esté en su rango. Podremos gestionar el error localmente.

En otro ejemplo de uso, las diferentes centralitas publican los números de teléfonos locales. Tenemos la sede A en Asturias, la B en Barcelona y la C en Canarias.

Pongamos que un usuario de la sede C llama a Asturias, al 985123123. Estamos hablando de llamada nacional, que si no tenemos tarifa plana, no es barata. La centralita, antes de marcar usando las líneas propias, hará una consulta DUNDI, para ver si alguien puede terminarnos la llamada. La centralita A nos responderá con IAX2/usuario:clave@sedea.empresa.es/985123123.

Cuestiones a tener en cuenta

El protocolo DUNDi utilizar por defecto el puerto 4520/UDP. Habrá que abrirlos en los firewalls. Es independiente de IAX, es decir, la cadena de conexión devuelta en una consulta puede hacer referencia a cualquier tipo de canal (IAX2, SIP, H323, etc), aunque normalmente se usa el IAX2.

Manos a la obra

Leer más…

Escrito por julianjm el 17/12/2007. | Comments (22)
Tags: ,

Llamadas a bajo coste desde el móvil

Hoy en día, todo el que tenga una ADSL tiene además una tarifa plana para llamadas a fijos nacionales. Con determinadas operadoras incluso incluyen las llamadas a móviles. Si queremos hacer llamadas internacionales, usamos un operador de telefonía IP.

La idea, como se comentaba en la lista de correo asterisk-es, es poder utilizar estos servicios desde cualquier lugar, y de forma sencilla, usando nuestro teléfono móvil.

Casi todos los operadores nacionales permiten contratar “tarifas planas”, o tarifas reducidas para llamadas a uno o varios números de teléfono (normalmente fijos). Este punto depende de si somos particulares, autónomos, empresas, ya que las tarifas y promociones cambian.

Nuestro objetivo sera conseguir llamada gratuitas (o casi) en llamadas desde el móvil a nuestra centralita. Una vez conectados, las llamadas que realicemos se originarán en ésta última, y saldrán por la ruta de menor coste que tengamos configurada.

Escenario

Conseguimos una tarifa plana a un número fijo geográfico. No queremos usar el de nuestra línea fija, porque entonces las llamadas a fijo tendrían que salir por otro operador, y seguramente no entraría en la tarifa plana nacional.

Contrataremos, pues, un número DID en cualquiera de los proveedores IP que dan este servicio (telsome, azulcom, peoplecall, voxbone, etc). Como las llamadas entrarán vía internet, tendremos la línea convencional libre para sacar las llamadas a fijos nacionales.

La “tecla” P

En los teléfonos móviles, pulsando 4 veces la tecla asterisco *, nos aparece la letra P. Indica al teléfono móvil que llame al número de teléfono que la precede, espere a que contesten, y acto seguido enviar mediante tonos DTMF todo lo que sigue. Por ejemplo, 928999999P900502010. Si nuestra centralita está configurada correctamente, debería descolgar, y escuchar los tonos que se le envíen, para luego iniciar la llamada.

Configuración básica

Nuestro nuevo DID será el 928999999. Cuando nos llamen a este número, la llamada entrará al contexto from-pstn. El número de nuestro móvil es el 653000000. Las llamadas desde este número se envían al contexto directdial. Contestará la llamada y esperará los tonos DTMF del verdadero destino. La llamada se efectuará como si estuviésemos marcando desde una extensión.

extensions.conf

[from-pstn]
exten => 928999999/653000000,1,Goto(directdial,s,1)
... (resto del contexto de entrada)...
;
[directdial]
exten => s,1,Answer
exten => s,n,Set(TIMEOUT(response)=5)
exten => s,n,Background(silence/1&beep)
exten => s,n,Disa(no-password|from-internal)

Como véis no tiene mucha complicación. Ahora para los paranóicos de la seguridad, cualquiera que sepa vuestro número DID, y pueda falsificar su callerid (y hacerse pasar por vuestro móvil), podría efecturar llamadas a vuestra costa. Creo que es una situación bastante poco probable. Aún así, vamos a ver una posible solución.

Alguno estará tentado de cambiar ese “no-password”, por una clave numérica. Si bien es posible, cada vez que queramos cambiar la clave, tendríamos que modificar toda nuestra agenda de teléfonos para hacerlo constar. Esta clave se pide antes de que leamos los tonos.

extensions.conf

[directdial]
exten => s,1,Answer
exten => s,n,Set(TIMEOUT(response)=5)
exten => s,n,Background(silence/1&beep)
exten => s,n,Disa(no-password|from-internal-authenticate)
;
[from-internal-authenticate]
exten => _[X*].,1,Authenticate(1234)
exten => _[X*].,2,Goto(from-internal,${EXTEN},1)

De esta forma, la clave nos la pedirá justo antes de efectuar la llamada.

Conclusión

Sé que no es cosa del otro mundo, pero seguro que más de uno puede ahorrarse unos euros. En cualquier caso, documentado queda.

Ah, y no se os olvide leer bien la letra pequeña de las diferentes tarifas de móviles, que siempre hay algo ;)

Escrito por julianjm el 26/11/2007. | Comments (15)
Tags: , ,

Reconocmiento de voz en asterisk con Lumenvox

Hoy toca ración de reconocimiento de voz :). Hace tiempo compré una licencia de evaluación (50$) para hacer pruebillas e impresionar al personal. En su día solo tenían el modelo de voz Inglés Americano, y para reconocer palabras en español tenías que hablar como un expresidente del gobierno ;). Pero han estado trabajando en ello, y ya tienen modelos específicos para español de Mejico y de Colombia.

Os voy a poner una ejemplo muy simple: el dialplan, la gramática, y un softphone web para que lo probéis de viva voz.

Paso 1: Instalar Lumenvox

Como he comentado antes, es un programa de pago,a sí que tendréis que adquirir al menos el Speech Starter Kit. La instalación y validación es algo cansina, pero que se le va a hacer. Seguid al pie de la letra las instrucciones que os llegarán por email. Básicamente se reduce a:

  1. Descargar e instalar el License Server.
  2. Generar el fichero de instalación (Info.bts), enviarlo a Lumenvox mediante el formulario web, y descargar el fichero con la licencia (License.bts). Estará asociado a la MAC de la tarjeta de red.
  3. Descargar e instalar el SRE (Speech Recognition Engine)
  4. Instalar el “Asterisk Connector Bridge”, que enlaza los servicios de voz de asterisk con el SRE de lumenvox.

Paso 2: Gramática

El sistema tiene que saber las frases que queremos detectar. Ejemplo:

root $frase
$sujeto = Pedro | Juan
$verbo = programa | estudia | sueña
$predicado = [ en ] C | PHP | AEL
$frase = $sujeto $verbo $predicado

Esta gramática reconocería frases como “Juan sueña en PHP”, “Pedro estudia C”, etc

Aquí es donde gana importancia el modelo de voz. Si usasemos el model Inglés, en vez de Pedro, habría que pronunciar algo como “Pedrou” ;), para que el sistema lo reconociese mejor.

Las gramáticas pueden ser muy complejas. Hay un ejemplo en la web de Lumenvox que simula la atención al cliente de una Pizzería, donde puedes realizar un pedido hablándole a la máquina (que miedo), aunque para el ejemplo que voy a mostraros, simplemente reconocerá una serie de nombres.

Paso 3: El Dialplan

Asterisk 1.4 ya incorpora funciones de reconocmiento de voz. Solo necesita de un motor que haga el reconocimiento y devuelva la información. Ejemplo:

exten => s,1,Answer
exten => s,n,Wait(1)
exten => s,n,SpeechCreate
exten => s,n,SpeechActivateGrammar(migramatica)
exten => s,n,SpeechStart
exten => s,n(otravez),SpeechBackground(beep)
exten => s,n,NoOp(${SPEECH_TEXT(0)})
exten => s,n,Goto(otravez)

Paso 4: El Ejemplo

Será un directorio de blogs con temática voip ;). El sistema reconocerá una serie de nombres, y contestará con la dirección del blog/página web. Para finalizar, se podrá decir “hasta luego” o “ya es suficiente”. Después de cada reconocimiento, se escuchará la calidad del resultado (de 0 a 1000).

No se por qué, pero he tenido que utilizar fonemas para que me reconociese bien todos los nombres. Debería bastar con el nombre directamente, pero bueno. Con frases más largas funciona mejor.

Descarga la gramática asteriskes.gram

Prueba el sistema en vivo y en directo: Abrir jiaxclient (a ver si no se satura la ADSL)

También podeis llamar desde asterisk:

exten => 123,1,Dial(IAX2/jiaxclient@voip.julianmenendez.es/demo)

Escrito por julianjm el 19/10/2007. | Comments (10)
Tags: , , , ,

Bug en manejo de eventos rfc2833 en asterisk

Desde que migré a Asterisk 1.4 no he podido usar mi cuenta de Azulcom para hacer llamadas salientes. No ha sido hasta hoy, después de confirmar que el problema era Asterisk 1.4, que he encontrado la causa del problema.

Todo viene por el tratamiento de eventos RFC2833. Cuando tenemos dtmfmode=rfc2833, cuando asterisk recibe uno de estos paquetes RTP, lo “decodifica”, y se lo reenvía a la otra parte. Es en este momento cuando asterisk interpreta que todo lo que sea RFC2833 debe ser un dígito multifrecuencia (0123456789*#ABCDX, la X es un hook flash), cuando la realidad es que hay muchísimos más eventos que estos 16, y no deben ser interpretados como DTMF.

En el caso concreto que comento, llegaba un evento 0×8f (143), que según el RFC, corresponde a “MF S3″. No sé para qué sirve, pero esta claro que no puede dejarme sin comunicación.

He notificado el bug (#10877) , donde está el parche para descargar, por si alguno está en la misma situación.

Mola el Software Libre, o no? ;)

Actualización 4-10-2007: Ya está arreglado en el trunk, y en la rama 1.4.

Escrito por julianjm el 3/10/2007. | Comments (0)
Tags: , , , , ,

Click2Dial automático en Firefox

Actualizado 24-09-2007: Nueva versión. Mejoras en la deteccion de numeros. Añadidos todos los prefijos de paises. Mi idea es poder adaptar la detección a números locales de cada país. En la actualidad funciona con números en formato internacional, y números españoles.

Actualizado 24-09-2007: Sí, otra actualización :). Mejorada la presentación, al no permitir el salto de línea. A veces se quedaba la bandera en una línea y el número en otra. También se ha añadido el nombre completo del país. Se puede ver dejando el ratón unos segundos encima del icono de llamada .

A raíz de un mensaje en la lista de correo de asterisk-es, intenté encontrar un sistema similar, pero que no dependiese de Skype o similares. La idea era que se detectasen los números de teléfono que hubiese en una página web, y automáticamente convertirlos en un enlace a un servicio click2dial.

Greasemonkey es una extensión para Firefox, que permite ejecutar codigo javascript en la página que está cargando. Estos scripts permiten analizar y modificar la página web, y como son persistentes, se ejecutan cada vez que se carga.

Existe ya un script, Skype Linkify, que sustituye los números que encuentra por un enlace a “skype:elnumero?call“. Lo he tomado como base, para hacerle unas mejoras:

  • Soporte de números en formato internacional +34 928000000, 00 34 928000000, 011 34 928000000.
  • Soporte para números españoles: [6-9]xxxxxxxx.ww
  • Se añade una banderita con el país al que pertenece el número de teléfono, que queda muy mono ;)

Instalación

  1. Instalar la extensión Greasemonkey
  2. Descargar e instalar el script PhoneLink (original, eh?)
  3. En Greasemonkey, editar el script, y modificar las variables “myExt” y “url”. La primera corresponde a tu extensión. Si pones 201, el canal utilizado será SIP/201. La segunda corresponde al script (en php por ejemplo) que se llamará cuando pulséis en un teléfono. %DEST% se sustituye por el número de teléfono solicitado.
  4. Abrir una página que tenga números de teléfono.

Por supuesto, tendréis que tener alojado un php o similar que inicie la llamada en asterisk. El que he usado para pruebas (cuidado con dejarlo accesible, que no es seguro) es este: webcall.php

Ejemplos de patrones que se detectan bien:

  • +34 928 00 00 00
  • 0034 928000000
  • +1 212-000-1234
  • 928000000
  • 91-800-00-00
  • 928.00.00.00

Seguro que falla con otros, y que da falsos positivos en determinados casos. La expresión regular tiene bastante margen de mejora.

Screenshots ;)

Antes:

Página original

Después:

Página después de ser procesada por PhoneLink

PopUp:

Popup de información

Escrito por julianjm el 20/09/2007. | Comments (18)
Tags: , , ,

Integración CRM. Monitorizar extensiones. Generar PopUps

Es fundamental en los call centers, que cuando suena el teléfono del agente, se le abra un popup con la información del cliente que está llamando en ese instante. Hay varias formas de lograrlo, pero una de las más interesantes por su sencillez es utilizar el FOP (Flash Operator Panel), de Nicolás Gudiño.

De hecho, en la versión 0.27, ha incluido un nuevo control flash (comunicator.swf), que elimina la parte gráfica, y se convierte en un simple interfaz entre nuestro asterisk y el código javascript de nuestra página. Este control es ideal para integrar en aplicaciones CRM (Customer Relationship Management), como puede ser SugarCRM.

Lo que voy a mostrar en este post son los requisitos mínimos para que esto funcione. Voy a eliminar todo lo superfluo, de modo que sea más fácil de integrar con cualquier aplicación ya existente, que es lo que de verdad nos dará la utilidad a este sistema.

Instalar/Actualizar FOP a la versión 0.27

La última versión de FreePBX ya incorpora esta versión. Si no está instalada, tendremos que descargarnosla de http://www.asternic.org/, y reemplazar los siguientes ficheros:

  • op_server.pl
  • operator_panel.swf
  • op_lang*

Tendremos que añadir unas líneas a op_buttons.cfg:

[AUTO/SIP/.*]
Context =${CONTEXT}
Extension=${CHANNEL}
Label =${CHANNEL}
Icon =1
Starting_Position=1
Server=1
Panel_Context=popup

Con esto crearemos un nuevo contexto (popup) para nuestro monitor de extensiones.
También añadiremos las siguientes líneas a op_server.cfg

[popup]
flash_dir=/var/www/html/popuptest/

De forma que nos guarde en ese directorio un fichero (variablesPOPUP.txt) con la información sobre nuestras extensiones.

Instalar los scripts

Creamos el directorio /var/www/html/popuptest y descomprimimos en él el siguiente fichero: popup-sample-v1.tgz

mkdir /var/www/html/popuptest
cd /var/www/html/popuptest
tar -zxvf /ruta/al/fichero/popup-sample-v1.tgz

Abrimos el navegador, y nos vamos a http://1.2.3.4/popuptest (sustituir 1.2.3.4 por la IP de vuestra máquina). Nos pide la extensión a monitorizar. En la siguiente página, si hacemos o recibimos llamadas en esa extensión, debería actualizarse en tiempo real su estado.

Si, además, queremos que en las llamadas entrantes se nos abra un popup a otra página, que nos haga por ejemplo una búsqueda en una base de datos, editamos el fichero monitor.php y definimos la variable popupurl:

var popupurl=null; //Si esta null, no haremos popup
popupurl="http://192.168.0.1/buscarnumero/find.php?q=";

Recargamos la página, y probamos a recibir una llamada. Si todo ha ido bien, y el navegador permite el popup, debería abrirnos la dirección http://192.168.0.1/buscarnumero/find.php?q=XXXXX, siendo XXXXX el número de teléfono que nos llama.

Conclusion

He intentado reducir el ejemplo a su mínima expresión, para que sea más sencillo adaptarlo a una aplicación real. La versión completa está en los fuentes del FOP. Revisad el fichero js/operator.js, porque ahí está el meollo de la cuestión ;)

Saludos
Julián J. Menéndez

Escrito por julianjm el 5/07/2007. | Comments (6)
Tags: , , , ,

Mejoras en la detección de inversiones de polaridad

Como muchos habéis comprobado, cuando hacemos un reload desde la consola de asterisk, perdemos los parámetros answeronpolarityswitch, hanguponpolarityswitch y polarityonanswerdelay. Es decir, volvían a sus valores por defecto y ya no detectabamos los cuelgues remotos. Había además un problema con las llamadas entrantes en las que si nos colgaban rápidamente (antes de haber detectado completamente el callerid), asterisk ignoraba esa inversión y nos dejaba el canal activo (Gracias a SuD por el parche).

En un intento de no despistar a los que vienen desde los buscadores (que sois unos cuantos), el parche actualizado estará disponible en el post anterior, Nuevo parche polaridad para Asterisk 1.4

Escrito por julianjm el 29/06/2007. | Comments (1)
Tags: , ,

Nuevo parche polaridad para Asterisk 1.4

Actualización final (19-dic-2007): A punto para las navidades, han incluido finalmente el parche tanto en la rama 1.4 como el el trunk. La versión 1.4.16 ya lo trae incluido. Gracias a fidojones por el aviso en los comentarios ;) 

Volvemos a la carga. Desde que actualizar a la 1.4.x he notado que en ocasiones las llamadas entrantes que colgaban mientras estaban en cola, llegaban a sonar en los teléfonos. Pasaba pocas veces, quizás recibo pocas llamadas ;), pero después de recibir correos apuntando en la misma dirección, me dispuse a revisar el amado y odiado chan_zap.c. (Por cierto, en openpbx^H^H^H^H^H callweaver lo están reescribiendo desde 0)Resulta que se revirtieron algunos cambios necesarios para que funcione bien en las líneas de Telefónica de España. Las llamadas entrantes, una vez que se descuelgan con Answer(), no detectan el cuelgue remoto. No ocurría lo mismo con las llamadas que no se han contestado aún.

En cualquier caso, aquí os dejo el parche. Si va bien, lo intentaremos meter de nuevo en el svn ;)Parche chan_zap.c rama 1.4 version4

Descargar chan_zap.c-1.4-polarity-v5.diff

Para aplicarlo:

$ cd /usr/src/asterisk$ patch -p0 < /ruta/al/chan_zap.c-1.4-polarity-v5.diff

A continuación, recompilar, reinstalar y reiniciar asterisk, probar si funciona, y dejar un comentario ;)

Versiones anteriores:

Actualizado (5 horas después de la publicación) :) : Como casi siempre, las primeras versiones nunca fueron buenas… Al corregir este fallo, introduje otro con las llamadas salientes… Corregido en la versión 2 del parche.

Actualización (12 de mayo): Según confirme Jose L. Villalon en los comentarios, el parche también funciona con asterisk 1.2.18. Habrá que ver a partir de qué versión de asterisk es necesario parchear.

Actualización (25 de junio): Gracias a SuD, que nos comenta acerca de un parámetro, polarityonanswerdelay, que tiene un valor por defecto demasiado alto, y que podría traer problemas al ignorarse ciertos cambios de polaridad. Para resultados óptimos, añadir polarityonanswerdelay=1 a vuestro zapata.conf (antes de la línea channel=> correspondiente).

Actualización (29 de junio): Adaptado a asterisk svn r72609. No se pierden los valores de answeronpolarityswitch, hanguponpolarityswitch ni polarityonanswerdelay al hacer un reload. Se contenmpla la detección de colgado dentro de la rutina de detección de callerid, según parche proporcionado por SuD.

Actualización (19 de julio): Adaptado a asterisk svn r75893.

Actualización (20 de julio): He abierto el bug #10238 en bugs.digium.com, para intentar que incluyan este parche en el código de asterisk y no tener que parchear cada nueva versión. Si estás interesado, deja allí tu experiencia con el parche.

Escrito por julianjm el 9/05/2007. | Comments (76)
Tags: , ,

Usando FXOTune para reducir el eco

Cuando me cambié de piso, allá por noviembre, empecé a tener problemas de eco en las llamadas a través de la TDM. Nada había cambiado de puertas para adentro, así que supuse que este cambio se debía a que estaba a una distancia mayor de la central, o que el par de cobre no estaba en el mejor estado.

De cualquier modo, no era una situación sostenible, ya que era bastante molesto. Buscando un poquillo en google y voip-info.org (para variar), me encontré con esta página sobre fxotune http://www.voip-info.org/wiki/view/Asterisk+fxotune. Copio y pego:

fxotune optimizes the line characteristics of a TDM device to minimize the *source* of echo. This is generally referred to as ‘balancing the hybrid’ and is quite important in echo cancellation. Once the hybrid is properly balanced, software echo cancellers will work very nicely.

No soy teleco, pero ese balanceo del híbrido, viene a ser ajustar la impedancia (resistencia) del puerto FXO, para que coincida con la de la línea, y evitar que se refleje lo menor posible la señal enviada o recibida. Si estoy metiendo la pata hasta el fondo, hacédmelo saber jeje. También ajusta los coeficientes de eco, aunque aquí sí que estoy totalmente perdido.

Por cierto, las clónicas vienen configuradas con una impedancia fija (no configurable) de 600 ohmnios, que está bien para las líneas americanas, no así para las españolas y gran parte de Europa. Si tienes una clónica, no te molestes.
Leer más…

Escrito por julianjm el 8/03/2007. | Comments (29)
Tags: , , ,

Pasarela email2fax con hylafax y postfix

Una pasarela email a fax (mail2fax) permite enviar faxes a través del correo electrónico. Por ejemplo, envías un email a 92800000@fax.tudominio.com, con un adjunto en formato PDF. La pasarela leerá ese PDF, y te lo enviará al número de fax 9280000. También te llegará por email la notificación de estado (enviado, reintentando, etc).

Algunas pasarelas mail2fax:

Requisitos

  • Un subdominio (fax.dominio.com)
  • Un servidor Postfix (Se agradecerán las instrucciones para sendmail)
  • Hylafax ya instalado y funcionando. Podéis echar un vistazo a esta página para integrarlo con Asterisk
  • Paciencia ;)

Leer más…

Escrito por julianjm el 7/01/2007. | Comments (81)
Tags: , , ,

Next Page »