You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FreePBX 13来电匹配数据库转指定分机配置咨询

刚好折腾过FreePBX 13 + Asterisk 13的类似需求,给你捋一遍亲测有效的配置步骤,分分钟搞定:

整体思路

核心逻辑是拦截所有来电,先执行自定义数据库查询逻辑:匹配到对应分机就直接转接;没匹配上就无缝跳转到FreePBX原来的默认来电策略。这里推荐用AGI脚本实现,比直接写Asterisk拨号规则更灵活,也方便调试。

具体配置步骤

1. 编写数据库查询的AGI脚本

FreePBX默认带PHP环境,直接写个PHP脚本就行,放在Asterisk的AGI目录下:

  • 新建文件:/var/lib/asterisk/agi-bin/callerid_route.php
  • 复制以下代码(记得替换你的数据库信息、表名和字段名):
#!/usr/bin/php -q
<?php
ob_implicit_flush(true);
ob_end_flush();

// 初始化AGI环境
$agi = new AGI();
$caller_id = $agi->request['agi_callerid'];

// 数据库配置(改成你自己的)
$db_host = 'localhost';
$db_user = 'freepbx_db_user';
$db_pass = 'your_db_password';
$db_name = 'asterisk';

// 连接数据库并处理注入风险
$conn = mysqli_connect($db_host, $db_user, $db_pass, $db_name);
if (!$conn) {
    $agi->verbose("数据库连接失败: " . mysqli_connect_error());
    exit(0); // 连接失败直接走默认路由
}
$safe_caller_id = mysqli_real_escape_string($conn, $caller_id);

// 查询匹配的分机号
$query = "SELECT extension FROM your_callerid_table WHERE caller_number = '$safe_caller_id' LIMIT 1";
$result = mysqli_query($conn, $query);

if (mysqli_num_rows($result) > 0) {
    $row = mysqli_fetch_assoc($result);
    $target_ext = $row['extension'];
    $agi->verbose("匹配到分机: $target_ext");
    // 转接分机,超时20秒(可自行调整)
    $agi->exec("Dial", "SIP/$target_ext,20");
    $agi->hangup(); // 转接后挂断流程
} else {
    $agi->verbose("未匹配到来电号码,执行默认路由");
    exit(0); // 不做处理,让FreePBX继续执行原有逻辑
}

mysqli_close($conn);
?>
  • 设置脚本权限(必须让Asterisk能执行):
chown asterisk:asterisk /var/lib/asterisk/agi-bin/callerid_route.php
chmod 755 /var/lib/asterisk/agi-bin/callerid_route.php

2. 在FreePBX中配置自定义来电路由

接下来要让所有来电先经过这个AGI脚本,操作步骤:

  • 登录FreePBX后台,进入Admin > Custom Applications
  • 新建一个自定义应用,名字随便取(比如CallerID_DB_Route),在Dialplan框里输入:
exten => s,1,Verbose(2,启动来电号码数据库匹配路由)
exten => s,n,AGI(callerid_route.php)
exten => s,n,Goto(from-inbound,${EXTEN},1) ; AGI没处理的话,跳回默认来电上下文
  • 保存这个自定义应用。
  • 进入Connectivity > Inbound Routes,找到你要修改的默认来电路由(或者新建一个路由覆盖所有线路):
    • 在Destination下拉菜单里,选择刚才创建的自定义应用CallerID_DB_Route
    • 保存并应用配置(点击右上角的"Apply Config")

3. 测试与调试

  • 打开Asterisk控制台看实时日志,方便排查问题:
asterisk -rvvv
  • 用外部电话拨打进来,观察控制台输出:
    • 如果看到匹配到分机: XXX,说明脚本正常工作,会直接转接对应分机
    • 如果看到未匹配到来电号码,执行默认路由,就会自动走你原来设置的IVR或者分机转接策略
注意事项
  • 数据库表要给caller_number字段加索引,避免大量数据时查询卡顿
  • 脚本里的SIP/$target_ext要根据你的分机类型调整,如果是PJSIP分机就改成PJSIP/$target_ext
  • 记得处理SQL注入,上面的脚本已经用mysqli_real_escape_string做了处理,别偷懒省略

内容的提问来源于stack exchange,提问作者Dmytro Satur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:06:05