viernes, 4 de noviembre de 2011

Como enviar variables entre centrales

Después de tanto tiempo que no publico nada en el Blog, quiero compartir con ustedes una solución, tal vez un poco "sucia", a un problema que seguramente se le presentó a aquellas personas que tienen varios Asterisk interconectados por troncales SIP o  IAX2.

Veamos un ejemplo:



Tal como se muestra en la imagen anterior, en el momento que Teléfono llama al Interno, dicho llamado pasará por ambas PBX y a su vez generará un registro en el CDR de cada una de ellas. Si queremos asociar ambos registros, nos daríamos cuenta que sería una tarea muy complicada, dado a que ambos contarán con un UniqueID distinto.

Ahora, si nosotros pudiéramos, de alguna forma, enviar de la PBX A a la PBX B el uniqueID, eso simplificaría muchísimo las cosas.

En el momento que el llamado pasa de la "PBX A" a la "PBX B" la única variable que es enviada es CALLERID(name), por lo tanto lo que podríamos hacer es concatenarle los datos que quisiéramos enviar y luego, cuando los valores se reciben en la "PBX B", parsearlos y volver todo como estaba.

Para ello haremos lo siguiente:

PBX A:
Supongamos que en esta PBX tenemos un DID donde los llamados que se reciben a través de este, son enviados a un contexto, llamémoslo from-my-did, que es donde se hace el dial a la PBX B. Entonces para poder concatenar, en este caso el uniqueID, para pasarlo a la otra PBX, tendríamos que poner, antes del dial, la siguiente línea:

exten => s,1,set(CALLERID(name)=${CALLERID(name)}#CDR(uniqueid)=${CDR(uniqueid)}#)
dando como resultado, lo siguiente:

[from-my-did]
exten => s,1,set(CALLERID(name)=${CALLERID(name)}#CDR(uniqueid)=${CDR(uniqueid)}#)
exten => s,n,dial(IAX2/pbxb/frommydid)

Como se podrá notar, cuando concatenamos la variable uniqueID vemos que la misma está entre dos numerales (#), esto se debe a que lo vamos a utilizar como separador para poder parsear los datos que enviamos.

PBX B:
Ahora bien, supongamos que en la configuración del troncal IAX2 dijimos que los llamados de la PBX A, van a ser recibidos en el contexto "from-pbx-a". Entonces tendríamos que agregar la siguiente línea, que se encargará de parsear los datos y crear las variables necesarias:

exten => frommydid,1,AGI(parser.php)

Dando como resultado, lo siguiente:

[from-pbx-a]
exten => frommydid,1,AGI(parser.php)
exten => frommydid,n,Dial(SIP/222)

Por lo tanto, cada vez que la PBX B reciba un llamado desde la PBX A, se parsearan y crearan las variables que concatenamos al CALLERID(name) y luego el llamado será enviado al interno 222.

Aquí les paso el código del parser.php

#!/usr/bin/php
/* Parser.php
 * ----------------------------------------------------------------------
 * AGI utilizado para parsear las variables enviadas a através del
 * CALLERID(name), separadas por #, y luego declararlas en Asterisk.
 * ----------------------------------------------------------------------
 * by Gustavo Borgoni - gborgoni@gmail.com
 */

<?php
require_once "phpagi.php";
$agi = new AGI();

function get_var($value) {
        global $agi;
        $r = $agi->get_variable( $value );
        if ($r['result'] == 1) {
                $result = $r['data'];
                return $result;
        } else {
                return '';
        }
}

$info = get_var("CALLERID(name)");
$result = split("#", $info);
$agi->set_variable("CALLERID(name)", $result[0]);

foreach ($result as $k => $v) {
        $variable = split("=",$v);
        if (trim($variable[0]) != "" && trim($variable[1]) != "") {
                $agi->set_variable(trim($variable[0]), trim($variable[1]));
        }
}

?>


Hasta la próxima!

No hay comentarios:

Publicar un comentario