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")
- 在Destination下拉菜单里,选择刚才创建的自定义应用
3. 测试与调试
- 打开Asterisk控制台看实时日志,方便排查问题:
asterisk -rvvv
- 用外部电话拨打进来,观察控制台输出:
- 如果看到
匹配到分机: XXX,说明脚本正常工作,会直接转接对应分机 - 如果看到
未匹配到来电号码,执行默认路由,就会自动走你原来设置的IVR或者分机转接策略
- 如果看到
注意事项
- 数据库表要给
caller_number字段加索引,避免大量数据时查询卡顿 - 脚本里的
SIP/$target_ext要根据你的分机类型调整,如果是PJSIP分机就改成PJSIP/$target_ext - 记得处理SQL注入,上面的脚本已经用
mysqli_real_escape_string做了处理,别偷懒省略
内容的提问来源于stack exchange,提问作者Dmytro Satur
相关产品推荐
相关产品推荐

