Configuración de Asterisk 1.6.X - Novena parte - ENUM

ENUM o mapeo de números telefónicos, está constituido por una serie de protocolos que permiten crear una convergencia entre la red telefónica tradicional y Internet. Permite asociar (utilizando el protocolo DNS) un numero telefónico a todas una serie de servicios típicos de la red internet (VoIP, correo electrónico, pagina web, etc.).

¿Cómo funciona?

Se ha creado una nueva jerarquía de dominios bajo el DNS e164.ARPA donde se almacenan los servicios asociados a un determinado numero telefónico.

Un ejemplo:

tenemos un numero telefónico: +5712345678

Este se almacenará bajo la jerarquía e164.ARPA siguiendo un orden inverso y poniendo entre cada digito un punto:

8.7.6.5.4.3.2.1.7.5.e164.arpa

Este numero estará asociado a unos registros DNS (Name Authority Pointer o NAPTR) que podrán conocerse a través de una consulta:

$ORIGIN 8.7.6.5.4.3.2.1.7.5.e164.arpa.

IN NAPTR 100 10 "u" "E2U+sip" "!^.*$!sip:phoneme@example.net!"

IN NAPTR 102 10 "u" "E2U+mailto" "!^.*$!mailto:myemail@example.com!"

En este caso dos:

  • una sip uri
  • un correo electrónico

Como queda claro a través de este ejemplo una vez que tengamos estos datos podremos usarlos en nuestra centralita. Llamar directamente la SIP URI en lugar del numero  telefónico (ahorrando los costos de llamadas) o enviar un correo electrónico.

Si queremos hacer una prueba podemos registrar nuestro numero telefónico y asociarlo a distintos servicios Internet a través de E164.org, un directorio ENUM publico.

 

ENUM y Asterisk

Primero tenemos que modificar el fichero enum.conf

nano /etc/asterisk/enum.conf

[general]
search => e164.arpa
search => e164.org
h323driver => H323

Ponemos estas líneas que nos permitirán hacer búsqueda en la jerarquía DNS e164.arpa y e164.org

Guardamos los cambios y echamos una mirada a las funciones disponibles en asterisk para hacer consultas a estos DNS

  • ENUMLOOKUP nos permite hacer una consulta de los registros NAPTR asociados a un determinado numero telefónico
  • ENUMQUERY nos permite hacer una consulta de los registros NAPTR pero, al contrario de ENUMLOOKUP generará como resultado un ID que luego podremos usar con la función ENUMRESULT
  • ENUMRESULT permite consultar los resultados generados por ENUMQUERY usando el ID creado por ENUMQUERY

 

ENUMLOOKUP

Sintaxis:

ENUMLOOKUP(number[,Method-type[,options[,record#[,zone-suffix]]]])

Ejemplos:

exten => _00.,1,Set(Enum1=${ENUMLOOKUP(+${EXTEN:2},SIP,c,,e164.org)})

El ejemplo funciona si para marcar un numero usamos el formato internacional: 00 + código país + código ciudad + numero.

  • Asignamos el resultado de la consulta a la variable Enum1
  • ENUMLOOKUP el nombre de la función de Asterisk
  • +${EXTEN:2} sacamos del numero marcado los primeros dos dígitos (00) y le ponemos al frente un + (el resultado será: +5712345678 que es el formato requerido para hacer consultas ENUM)
  • SIP Queremos recibir como resultados solamente SIP URI
  • c: con esta opción recibiremos como respuesta el numero de SIP URI asociadas al numero telefónico indicado
  • Hacemos la consulta en la jerarquía DNS e164.org

El resultado de la consulta será un numero entero que indicará cuantos SIP URI están asociados al numero telefónico indicado

exten => _00.,1,Set(Enum1=${ENUMLOOKUP(+${EXTEN:2},ALL,c,,e164.org)})

parecido al ejemplo precedente con la única diferencia que la consulta restituirá todos los NAPTRs asociados al numero telefónico indicado.

 

ENUMQUERY

Sintaxis:

ENUMQUERY(number[,Method-type[,zone-suffix]])

Ejemplos:

exten => _00.,1,Set(Enum1=${ENUMQUERY(+${EXTEN:2},SIP,e164.org)})

El resultado de la consulta será un numero (ID) que luego podremos usar con la función ENUMRESULT

Vamos a verlo en seguida:

 

ENUMRESULT

Sintaxis:

ENUMRESULT(id,resultnum)

Ejemplos:

exten => _00.,1,Set(NUM=${ENUMRESULT(${Enum1},1)})

Con este línea vamos a mirar el primer NAPTR resultado de la consulta hecha con ENUMQUERY. La variable ${Enum1} es la que contiene el ID de la consulta y es la misma que indicamos como ID en la función ENUMRESULT

DIALPLAN (Plan de llamadas)

Vamos a construir nuestro plan de llamadas de modo que antes de llamar cualquier numero (nacional o internacional) haga una consulta en ENUM para ver si es posible usar una SIP URI en lugar del numero telefónico:

exten => _00.,1,Set(Enum1=${ENUMLOOKUP(+${EXTEN:2},sip,c)}|counter=0)
exten => _00.,2,GotoIf($["${counter}"<"${Enum1}"]?3:6)
exten => _00.,3,Set(counter=$[${counter}+1])
exten => _00.,4,Dial(SIP/${ENUMLOOKUP(+${EXTEN:2},sip,,${counter})})
exten => _00.,5,GotoIf($["${counter}"<"${sipcount}"]?3:6)
exten => _00.,6,Dial(SIP/MyproveedorVoIP/${EXTEN})
exten => _00.,7,Hangup

Lo mismo podemos hacer para el protocolo IAX:

exten => _00.,1,Set(Enum1=${ENUMLOOKUP(+${EXTEN:2},iax2,c)}|counter=0)
exten => _00.,2,GotoIf($["${counter}"<"${Enum1}"]?3:6)
exten => _00.,3,Set(counter=$[${counter}+1])
exten => _00.,4,Dial(IAX2/${ENUMLOOKUP(+${EXTEN:2},sip,,${counter})})
exten => _00.,5,GotoIf($["${counter}"<"${sipcount}"]?3:6)
exten => _00.,6,Dial(SIP/MyproveedorVoIP/${EXTEN})
exten => _00.,7,Hangup

Estos son solamente dos ejemplos. Podemos pensar en construir una macro que se ocupe de las consultas ENUM y si no resultara volver al dialplan y efectuar la llamada vía proveedor SIP o a través de la línea telefónica tradicional.

 

Referencias: RFC3761 RFC2915 RFC3401 RFC3402 RFC3403 RFC3404

Vota el Articulo: 

Sin votos (todavía)
Evalúa la calidad del articulo
Suscribirse a Comentarios de "Configuración de Asterisk 1.6.X - Novena parte - ENUM" Suscribirse a VozToVoice - Todos los comentarios