¿Aquí no sirve el "service asterisk restart"?

Charros, ¿en estos casos qué comando se usa? xD

Porfin rediseñaron la página de Digium!!

Después de estar quejándome de la página tan fea que Digium tenía por fin se dieron a la tarea de echarle una manita de gato. El contenido se ve más ordenado, además de incluir los nuevos servicios y productos (como la adquisición de switchvox).

Plantillas en archivos de configuración de Asterisk, una buena forma de ahorrar tiempo!!



Esto sobre todo va para los que les encanta modificar directamente los archivos de configuración de Asterisk (como yo) en lugar de usar una GUI (Graphic User Interface). Sabemos que casi toda la sintaxis dentro de los archivos de configuración del PBX va de la siguiente manera:

[parte]
variable=valor

Normalmente en diferentes archivos, como el sip.conf (el que usaremos como ejemplo) cada que declaramos un nuevo usuario tenemos que repetir secciones de código para cada entrada, como por ejemplo:

[usuario1]
username=usuario1
context=entrantes
callerid="Nombre Apellido" <1101>
host=dynamic
nat=no
canreinvite=no
disallow=all
allow=ulaw
allow=alaw
allow=gsm
mailbox=1101@default
callgroup=1
pickupgroup=1

[usuario2]
username=usuario2
context=entrantes
callerid="Nombre Apellido" <1102>
host=dynamic
nat=no
canreinvite=no
disallow=all
allow=ulaw
allow=alaw
allow=gsm
mailbox=1102@default
callgroup=1
pickupgroup=1

Vemos que gran parte del código se comparte entre el usuario1 y usuario2, y si tenemos alguna instalación con más de 50 extensiones pues la administración de estos archivos se vuelve algo complicada. Aquí es donde los templates de archivos de configuración vienen a ayudarnos de la siguiente manera: detectamos la mayor parte del código que se vaya a compartir y la declaramos al principio de nuestro archivo como una sección independiente, es decir:

[usuariogeneral]
context=entrantes
host=dynamic
nat=no
canreinvite=no
disallow=all
allow=ulaw
allow=alaw
allow=gsm
callgroup=1
pickupgroup=1

Y así mismo podemos mandar llamar dicha sección y que la use como template en la declaración de cada nuevo usuario que creemos, es decir:

[usuario1](usuariogeneral)
username=usuario1
callerid="Nombre Apellido" <1101>
mailbox=1101@default

[usuario2](usuariogeneral)
username=usuario2
callerid="Nombre Apellido" <1102>
mailbox=1102@default

Vemos aquí que sólo estamos declarando los valores que van cambiando en cada usuario, pero lo demás lo podemos dejar en un solo template. Así logramos reducir en gran medida el código utilizado en nuestros archivos de configuración.

Algunas cosas extras: la sección que dimos de alta "usuariogeneral" se puede usar como sección independiente, es decir, sin ser tratada como template. Para evitar ésto sólo basta con agregar un signo de admiración entre paréntesis después del nombre de la sección:

[usuariogeneral](!)
...

De esta manera evitamos el acceder la sección de manera directa dentro de nuestro plan de marcado, y así sólo podra ser usada como template.

También es posible mandar llamar más de un template dentro de la declaración de algún usuario separando por comas cada uno de los templates:

[usuario1](usuariogeneral,nat)
...

Esto nos ayuda si tenemos alguna sección en un template en particular, y otra sección de la declaración en otro template, y así ayuda a dar de alta usuario de manera más rápida. Supongamos que en el ejemplo anterior tenemos un template "usuariogeneral" con los datos más generales de un usuario, como el tipo de codec, host y tipo de DTMF, y dentro del template "nat" tenemos lo referente a cuando el usuario debe de ser configurado detrás de un NAT, es decir nat=yes. canreinvite=no, etc., y de la misma manera podemos tener un template llamado "nonat" con los datos cuando no se tenga detrás de NAT.

Espero les sea útil.

Asterisk + Unicall de forma simple

Para los que hayan intentado modificar Asterisk para que tenga soporte con las librerias de Unicall sabrán que es una tarea no tan sencilla, sobre todo cuando son las primeras veces. Es por eso que comparto con ustedes un paquete que ya incluye Asterisk parchado mas los paquetes necesarios para hacer funcionar Unicall (sólo lo he probado con clientes en México).

Las versiones que incluyo en el paquete astunicall-1.2.21 son:

  • Asterisk-1.2.21.1
  • Zaptel-1.2.19
  • spandsp-0.0.4
  • unicall-0.0.5pre1
Para los que prefieren el branch 1.4 de asterisk tambien existe el paquete astunicall-1.4.9 generado por moy que incluye:
  • Asterisk-1.4.9
  • Zaptel-1.4.4
  • spandsp-0.0.4
  • unicall-0.0.5pre1
Estas versiones han sido probadas para la integración con enlaces digitales E1 MFCR2 de Telmex y Maxcom y ya cuentan con Asterisk parchado para su funcionamiento, lo que espero les haga más sencillo el proceso de usar el mentado unicall (siempre que puedan, pidan enlaces ISDN!!!)

En éste post no entraré en detalles de como instalar los paquetes, ya hay mucha información en la red (revisen los ejemplos que documenta moy)

Saludos!

Can't find address for host... (pero yo si se donde esta!)

Después de actualizar el firmware de unos teléfonos Aastra 9133i (a la versión 1.4.2.1081) me dí cuenta que dicho teléfono ya no podía recibir llamadas correctamente, después de establecida la comunicación después de 5 segundos se cortaba la llamada. En el CLI de Asterisk aparecía lo siguiente:


-- Called 1105
-- SIP/1105-08eb8a60 is ringing
Oct 30 18:59:40 WARNING[2405]: chan_sip.c:4083 set_destination: Can't find address for host '1105'
-- SIP/1105-08eb8a60 answered SIP/1102-08eb0238
Oct 30 18:59:41 WARNING[2405]: chan_sip.c:4083 set_destination: Can't find address for host '1105'
Oct 30 18:59:42 WARNING[2405]: chan_sip.c:4083 set_destination: Can't find address for host '1105'
Oct 30 18:59:44 WARNING[2405]: chan_sip.c:4083 set_destination: Can't find address for host '1105'

Asterisk trataba de encontrar la dirección IP del teléfono, pero al no encontrarla después de algunos segundos decidía cortar la comunicación. Habilité el debug de SIP en Asterisk para ver que estaba pasando, y oh sorpresa!!! dentro del string que usa como Caller ID y así saber quién y qué extensión usa ( Usuario <1105> ) no lo parseaba correctamente, ya que no podía separar dichos campos, lo tomaba como uno solo, es decir:

To: "Nombre <1105>" en vez de To: "Nombre"

Al parecer el teléfono Aastra con esta versión de firmware no estaba pasando correctamente la cadena del CallerID, de tal manera que Asterisk no la podía procesar correctamente la negociación SIP. ¿Cuál fue la solución? Simple, dejar en blanco el campo de Caller ID en la configuración del teléfono, y dejar que Asterisk use el Caller ID que esta puesto en el archivo sip.conf.

Espero que les sirva!!!

Alguien dijo que los fans de Asterisk son nerds??

Chequen y diganlo ustedes mismos! :D

Tomada en el Asterisk Bootcamp. Atlanta, GA.

Howto: Voceo a teléfonos Aastra y Asterisk

Pues uno de nuestros clientes tiene una instalación de Asterisk típica con teléfonos Aastra 9133i, y nos pidió habilitar una funcionalidad para que los teléfonos funcionen como intercomunicador, también conocido como voceo, anunciador o pager. Básicamente el requerimiento consiste en que desde cualquier teléfono se marque una extensión (o una tecla rápida) y que en algún otro teléfono se abra el speaker automáticamente, y así el que llama pueda dar un anuncio, solicitar a la secretaria que entre a la oficina del jefe, etc.

Para poder lograr el objetivo es necesario contar con teléfonos que tengan la funcionalidad de "autocontestar", es decir, que en el momento de entrar una llamada, el teléfono automáticamente abra el speaker (o diadema en su caso) sin necesidad de que el receptor levante el auricular o apriete algún botón. Este tipo de cosas se utilizan comúnmente para centros de llamadas donde se cuentan con sistemas de marcación progresiva, predictiva, etc. Con los teléfonos IP que he trabajado y que cuentan con esta funcionalidad son los Aastra, Grandstream y Polycom.

Después de buscar en varios foros y algunos experimentos de prueba y error para teléfonos Aastra el código para lograr el voceo a una extensión en específico es el siguiente:

; Pager general
exten => _*25*XXXX,1,SIPAddHeader(Call Info: Answer-After=0)
exten => _*25*XXXX,n,SIPAddHeader(Call-Info: \;answer-after=0)
exten => _*25*XXXX,n,Set(TIMEOUT(absolute)=60)
exten => _*25*XXXX,n,Page(SIP/${EXTEN:4})
exten => _*25*XXXX,n,Hangup


La aplicación se puede mandar llamar marcando en una sola línea * + 25 + * + Extensión de cuatro dígitos a quien desea llamar. Las dos primeras líneas agregan encabezados SIP para indicarle al teléfono destino que tiene que autocontestarse (tengo entendido que esto no es igual para cada marca marca de teléfonos, esto esta probado con Aastra).

La cuarta línea es la más interesante, ya que manda llamar la aplicación Page(). Ya que Asterisk no cuenta con una aplicación específica para hacer voceo, lo que hace la aplicación Page es crear en un instante un cuarto de conferencia, y meter en él todos a los participantes de la llamada, así como darle permisos de hablar sólo a quien genera la llamada.

Si se desea realizar voceo a muchos teléfonos al mismo tiempo el proceso es similar, con algunos cambios:

AASTRA=SIP/1101&SIP/1102&SIP/1104&SIP/1105&SIP/1106&SIP/1120&SIP/1130

exten => _*25,1,SIPAddHeader(Call Info: Answer-After=0)
exten => _*25,n,SIPAddHeader(Call-Info: \;answer-after=0)
exten => _*25,n,Set(TIMEOUT(absolute)=60)
exten => _*25,n,Page(${AASTRA})
exten => _*25,n,Hangup


Donde en la variable AASTRA tenemos todos los teléfonos que deseamos alcanzar en el voceo. Es importante recalcar que se genera un cuarto de conferencias (Asterisk necesita un reloj, por lo que si no tienen una tarjeta instalada hay que habilitar el módulo ZTDUMMY en zaptel) y sólo se le da permisos de hablar en este caso al que marca, de otra manera el relajo que se armaría el escuchar por speaker a todos los teléfonos al mismo tiempo!!! Sin embargo la aplicación Page() puede recibir diferentes opciones (que no se tratan en este artículo) que permiten modificar el comportamiento.

Espero que les sea de utilidad. Saludos!