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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top