¿ Cómo rutear llamadas dinámicamente ?

¿ Cómo rutear llamadas dinámicamente ?

Posted Junio 19th, 2009 by phylevn

Qué tal, buen día.

Pongo este post ya que tengo una duda de como rutear llamadas en Asterisk de manera dinámicamente por si alguien puede darme una pista, tip o truco, les comento mi situación:
Aquí en México hay varias compañías de telefonía móvil(telcel, movistar, iusacell, unefón, nextel, etc). Cada compañía tiene precios bajos entre llamadas de teléfonos de la misma compañía, y llamadas a otras compañías son más caras, todos los números móviles en México comienzan con 044 y 045. En Asterisk tengo una tarjeta con puertos FXO, a los cuáles tengo conectados 3 telulares, en este caso uno para cada compañía de telcel, movistar y iusacell que son las principales compañías móviles en México.

Cada compañía tiene asignada una numeración, la numeración es de 13 digitos, y se puede saber a que compañía pertenece un número por los primeros 9 digitos y para esto hay que consultar una base de datos de cerca de 65,000 registros.

Entonces lo que quiero hacer es cuándo alguien marque un número que comience por 044 o 045 consultar la base de datos para saber a que compañía pertenece y de ahí poder redirigirla al puerto FXO correspondiente, esto para poder abaratar los costos de llamadas de telefonía celular.

El detalle de todo esto es que estaba pensando usar un AGI, pero al momento de mandar a ejecutar el AGI tengo que usar ANSWER, y esto le pasa al CDR que la llamada se contestó cuándo aún no se ha contestado y empieza a contar desde que se marca.

Por lo que pongo en este foro mi problema por si alguien puede darme un tip, sugerencia, truco de como poder darle solución a este detalle.

Sin más agradezco su apoyo..

Saludos :)

Sugerencia: Asterisk 1.6

Hola,

Hmm, al menos en Asterisk 1.6 la aplicacion AGI no dispone que el canal esta en ANSWER. En mis pruebas CDR(disposition) esta en NO ANSWER mientras el AGI no le indicaba que conteste.

Prueba con esto en tu Asterisk para saber si la disposicion cambia luego de ejecutar la aplicacion AGI.

Dialplan:
exten => XXXXXXXXX-XXX,1,AGI(set_variable_ruta.agi)
exten => XXXXXXXXX-XXX,n,Wait(1)
exten => XXXXXXXXX-XXX,n,Verbose(Ruta es ${RUTA})
exten => XXXXXXXXX-XXX,n,Verbose(disposicion es ${CDR(disposition)})
exten => XXXXXXXXX-XXX,n,Wait(1)
exten => XXXXXXXXX-XXX,n,Dial(Dahdi/${RUTA}/${EXTEN})

set_variable_ruta.agi:
#!/usr/bin/env python2.5

import sys
import sqlite3

agi_extension = None

for line in sys.stdin:
    key,data = line.split(': ', 1)
    if key.strip() == 'agi_extension':
        agi_extension = data.strip()
        break

#
# MUCHO OJO AQUI, DEBE ADAPTARSE A TU CONFIGURACION.
#
conn = sqlite3.connect('/var/lib/rutas.db')
cur = conn.cursor()
cur.execute('SELECT ruta FROM rutas WHERE prefijo=?', (agi_extension,))
row = cur.fetchone()

sys.stdout.write('SET VARIABLE RUTA %s\n' % row[0])
sys.stdout.flush()

En todo caso, la solucion mas facil es usar la aplicacion ResetCDR() luego de ejecutar AGI

Dialplan:
exten => XXXXXXXXX-XXX,1,AGI(set_variable_ruta.agi)
exten => XXXXXXXXX-XXX,n,ResetCDR()
exten => XXXXXXXXX-XXX,n,Dial(Dahdi/${RUTA}/${EXTEN})

Saludos,

PLL.

pd. Holas a todos.

Posted by pll on Sáb, 2009-06-20 04:39
Gracias @Pll, voy a intentar

Gracias @Pll, voy a intentar hacerlo.. si funciona publico por aquí el procedimiento y scripts con que lo hice funcionar en caso de que asi sea. Gracias de antemano. Saludos :)
--
Daría todo lo que sé, por la mitad de lo que ignoro..
httP://phylevn.binniza.com

Posted by phylevn on Vie, 2009-06-26 00:13