MySQL, Asterisk Dialplans y desvío de llamadas
Pregunta
¿Cómo consigo que Asterisk reenvíe llamadas entrantes basándose en la coincidencia del número de llamada entrante con un número al que reenviar?Ambos números se almacenan en una base de datos MySQL.
Solución 3
La solución que estaba buscando terminó luciendo así:
[default]
exten => _X.,1,Set(ARRAY(${EXTEN}_phone)=${DTC_ICF(phone_number,${EXTEN})})
exten => _X.,n(callphone),Dial(SIP/metaswitch/${${EXTEN}_phone},26)
exten => _X.,n(end),Hangup()
Otros consejos
Perdón por el ejemplo de código tan largo, pero más de la mitad es código de depuración para ayudarle a configurarlo.
Supongo que su servidor ya tiene una versión moderna de PHP (en /usr/bin/php
) con la biblioteca PDO y que tiene una tabla de base de datos llamada fwd_table
con columnas caller_id
y destination
.
En /var/lib/asterisk/agi-bin obtenga una copia del PHP AGI biblioteca.Luego crea un archivo llamado algo así como forward_by_callerid.agi
eso contiene:
#!/usr/bin/php
<?php
ini_set('display_errors','false'); //Supress errors getting sent to the Asterisk process
require('phpagi.php');
$agi = new AGI();
try {
$pdo = new PDO('mysql:host='.$db_hostname.';dbname='.$db_database.';charset=UTF-8', $db_user, $db_pass);
} catch (PDOException $e) {
$agi->conlog("FAIL: Error connecting to the database! " . $e->getMessage());
die();
}
$find_fwd_by_callerid = $pdo->prepare('SELECT destination FROM fwd_table WHERE caller_id=? ');
$caller_id = $agi->request['agi_callerid'];
if($callerid=="unknown" or $callerid=="private" or $callerid==""){
$agi->conlog("Call came in without caller id, I give up");
exit;
}else{
$agi->conlog("Call came in with caller id number $caller_id.");
}
if($find_fwd_by_callerid->execute(array($caller_id)) === false){
$agi->conlog("Database problem searching for forward destination (find_fwd_by_callerid), croaking");
exit;
}
$found_fwds = $find_fwd_by_callerid->fetchAll();
if(count($found_fwds) > 0){
$destination = $found_contacts[0]['destination'];
$agi->set_variable('FWD_TO', $destination);
$agi->conlog("Caller ID matched, setting FWD_TO variable to ''");
}
?>
Luego desde el plan de marcado puedes llamarlo así:
AGI(forward_by_callerid.agi)
Y si su base de datos tiene una coincidencia, establecerá la variable FWD_TO
con bondad.Edite su pregunta si necesita más ayuda para integrar esto en su plan de marcado.
Este artículo debería funcionar.Se trata de 3 líneas de código y algunas consultas simples para agregar y eliminar reglas de reenvío.