FreeSWITCH 简单图形化界面55 - 拨号应用tansfer盲转/拨号计划跳转使用
- [00、 一个fs的web配置界面预览](#00、 一个fs的web配置界面预览)
- [01、 Web 配置界面预览](#01、 Web 配置界面预览)
- [02、 Web界面安装参考](#02、 Web界面安装参考)
- [1. 简介](#1. 简介)
- [2. 核心区别(重要)](#2. 核心区别(重要))
- [3. 用法](#3. 用法)
- [4. 关键机制](#4. 关键机制)
- [5. 示例](#5. 示例)
-
- [示例 1:基础跳转(默认上下文)](#示例 1:基础跳转(默认上下文))
- [示例 2:指定上下文的跳转](#示例 2:指定上下文的跳转)
- [示例 3:桥接中转接对端/双腿](#示例 3:桥接中转接对端/双腿)
- [示例 4:自定义跳转次数限制](#示例 4:自定义跳转次数限制)
- [示例 5:lua脚本进行盲转](#示例 5:lua脚本进行盲转)
- [示例 6:lua脚本进行拨号规则跳转](#示例 6:lua脚本进行拨号规则跳转)
- [6. 注意事项](#6. 注意事项)
00、 一个fs的web配置界面预览
如果您想通过图形化界面管理 FreeSWITCH 的场景,可直接访问以下 Web 配置界面。
01、 Web 配置界面预览
| 界面地址 | 备用地址 | 登录信息 |
|---|---|---|
| http://www.fspbx.cn/ | http://myfs.f3322.net:8020/ | 用户名:admin密码:admin |
02、 Web界面安装参考
若需自行部署 FreeSWITCH 图形化界面,包含 Docker、脚本、ISO 镜像三种安装方式,适配不同系统环境:
- 安装指南地址:https://blog.csdn.net/jia198810/article/details/137820796
- 核心安装方式概览:
- Docker 安装:快速部署;
- 脚本安装:适配 Almalinux、RockyLinux、Debian、Ubuntu 、欧拉等系统,提供一键安装命令,安装后需重启初始化;
- ISO 镜像安装:基于 Almalinux制作的镜像,刻录到 U 盘或光盘后可自动安装,适合全新服务器部署。
1. 简介
transfer 核心是拨号计划跳转(而非传统意义上的"通话转接"),会立即将当前呼叫通道切换到新的拨号计划上下文/分机:
- 若目标分机有独立 XML 文件(如
1047.xml),直接跳转到该分机逻辑; - 若无独立文件,则遍历目标上下文的所有规则匹配分机;
- 本质是修改呼叫的目标分机/上下文,重新解析拨号计划,而非真正的通话桥接转接。
2. 核心区别(重要)
transfer ≠ 传统通话转接(如 att_xfer):
- transfer:拨号计划层面的逻辑跳转,可理解为"IVR菜单跳转""分机重定向";
- att_xfer:通话媒体层面的专人转接,需要和第三方沟通后完成桥接。
3. 用法
xml
transfer <destination_number> [<dialplan> [<context>]]
| 参数 | 说明 | 默认值 |
|---|---|---|
| destination_number | 目标分机号/号码 | 无(必填) |
| dialplan | 拨号计划类型(如 XML/JSON) | XML |
| context | 拨号计划上下文(如 default/cntxt_a) | default |
特殊参数(桥接中使用)
| 格式 | 作用 |
|---|---|
-bleg <号码> |
桥接状态下,仅转接通话的"对端(B腿)" |
-both <号码> |
桥接状态下,同时转接通话的A、B双腿 |
4. 关键机制
- max_forwards 限制:默认值 70,每次调用 transfer 会减 1,减到 0 则挂断通话(防止无限循环);
- max_session_transfers 覆盖 :若设置该通道变量(如
set max_session_transfers=200),则不再使用 max_forwards,改用此值计数; - RDNIS 填充:跳转后,RDNIS(被叫号码识别服务)会自动填充为跳转前的目标号码;
- 兼容 mod_xml_curl:跳转时会重新请求动态拨号计划(如 XML CURL),逻辑与静态 XML 一致。
5. 示例
示例 1:基础跳转(默认上下文)
xml
<!-- 跳转到默认上下文(default)的 500 分机 -->
<action application="transfer" data="500"/>
示例 2:指定上下文的跳转
xml
<!-- 公网拨号计划中,将 1000-1099 分机跳转到 default 上下文的对应分机 -->
<extension name="public_extensions">
<condition field="destination_number" expression="^(10[01][0-9])$">
<action application="transfer" data="$1 XML default"/>
</condition>
</extension>
示例 3:桥接中转接对端/双腿
xml
<!-- 仅转接桥接的对端(B腿)到 2103 分机 -->
<action application="transfer" data="-bleg 2103"/>
<!-- 同时转接通话的 A、B 双腿到 2103 分机(如会议室) -->
<action application="transfer" data="-both 2103"/>
示例 4:自定义跳转次数限制
xml
<!-- 先设置最大跳转次数,再跳转(避免 70 次限制) -->
<action application="set" data="max_session_transfers=200"/>
<action application="transfer" data="1047 XML cntxt_a"/>
示例 5:lua脚本进行盲转
lua
#!/usr/bin/env lua
-- 2024年7月2日
-- 功能号码
-- 呼叫盲转
------------------打印日志-------------------
-- CONSOLE : console loglevel 0
-- ALERT : console loglevel 1
-- CRIT : console loglevel 2
-- ERR : console loglevel 3
-- WARNING : console loglevel 4
-- NOTICE : console loglevel 5
-- INFO : console loglevel 6
-- DEBUG : console loglevel 7
local flag = true
local level = "NOTICE"
local log = function(session, str)
if (flag == true and session:ready()) then
session:consoleLog(level, str)
end
end
if (session:ready()) then
local caller_id_name = session:getVariable("caller_id_name")
local caller_id_number = session:getVariable("caller_id_number")
local destination_number = session:getVariable("destination_number")
local context = session:getVariable("context")
log(session, "#======= start handle-blind-xfer.lua =======\r\n")
log(session, string.format("# 主叫:%s,被叫:%s,开始盲转\r\n", caller_id_number, destination_number))
-- 播放等待音
session:execute("set", "transfer_ringback=$${hold_music}")
-- 获取被叫
local digits = session:playAndGetDigits(1, 12, 3, 5000, "#", "default/blind-xfer-start.gsm",
"default/blind-xfer-error.gsm", "\\d+")
if (digits == '') then
session:execute("playback", "default/blind-xfer-end.gsm")
else
-- 设置转接号码变量
-- session:execute("set", string.format("destination_number=%s", digits))
-- 执行呼叫转接应用
session:execute("transfer", string.format("-bleg %s xml %s", digits, context))
end
log(session, "#======= end handle-blind-xfer.lua =======\r\n")
return
end
示例 6:lua脚本进行拨号规则跳转
lua
---呼叫入口
if (session:ready()) then
-- 获取一堆变量
local caller_id_name = session:getVariable("caller_id_name")
local caller_id_number = session:getVariable("caller_id_number")
local ani = session:getVariable("ani") ~= "" and session:getVariable("ani") or session:getVariable("caller_id_number")
local destination_number = session:getVariable("destination_number")
local auto_answer = session:getVariable("auto_answer")
local trunk_name = session:getVariable("trunk_name")
local max_calls = session:getVariable("max_calls") and session:getVariable("max_calls") or 100
local context = session:getVariable("context")
local extension = session:getVariable("extension") and session:getVariable("extension") or ''
local rdnis = session:getVariable("rdnis") ~= "" and session:getVariable("rdnis") or session:getVariable("destination_number")
--- 转到context里的extension
session:execute("transfer", string.format("%s xml %s", destination_number, context))
end
6. 注意事项
- transfer 会从拨号计划开头重新解析,需避免循环跳转(如 A→B→A);
- 若在桥接(bridge)中使用,默认转接对端(B腿),而非当前通道;
- 名称易混淆:transfer 是"拨号计划跳转",而非"通话转接",真正的通话转接需用 bridge/att_xfer;
- 支持内联拨号计划(inline dialplan),可直接指定跳转逻辑而非分机号。
💗 2026年
🐂 祝君成功,好运连连,牛气冲天