在 FreeSWITCH 中,mod_prefix
模块的配置通常是静态的,通过 prefix.conf.xml
文件定义前缀规则。然而,FreeSWITCH 提供了强大的 API 和脚本支持,可以通过动态方式实现前缀的添加、删除和替换。以下是动态操作的实现方法:
一、动态添加前缀
1. 使用 set
和 regex
动态添加前缀
在拨号计划中,可以通过 set
和 regex
动态添加前缀。
<extension name="dynamic_add_prefix">
<condition field="destination_number" expression="^(.*)$">
<!-- 在号码前添加前缀 "123" -->
<action application="set" data="effective_caller_id_number=123${destination_number}"/>
<action application="bridge" data="sofia/gateway/my_gateway/${effective_caller_id_number}"/>
</condition>
</extension>
2. 使用 Lua 脚本动态添加前缀
在 Lua 脚本中,可以通过字符串拼接实现动态添加前缀。
-- 获取原始号码
local number = session:getVariable("destination_number")
-- 添加前缀
local new_number = "123" .. number
-- 设置新号码
session:setVariable("effective_caller_id_number", new_number)
-- 继续呼叫
session:execute("bridge", "sofia/gateway/my_gateway/" .. new_number)
二、动态删除前缀
1. 使用 regex
动态删除前缀
在拨号计划中,可以通过正则表达式删除前缀。
<extension name="dynamic_remove_prefix">
<condition field="destination_number" expression="^123(.*)$">
<!-- 删除前缀 "123" -->
<action application="set" data="effective_caller_id_number=$1"/>
<action application="bridge" data="sofia/gateway/my_gateway/${effective_caller_id_number}"/>
</condition>
</extension>
2. 使用 Lua 脚本动态删除前缀
在 Lua 脚本中,可以通过字符串操作删除前缀。
-- 获取原始号码
local number = session:getVariable("destination_number")
-- 删除前缀 "123"
local new_number = string.gsub(number, "^123", "")
-- 设置新号码
session:setVariable("effective_caller_id_number", new_number)
-- 继续呼叫
session:execute("bridge", "sofia/gateway/my_gateway/" .. new_number)
三、动态替换前缀
1. 使用 regex
动态替换前缀
在拨号计划中,可以通过正则表达式替换前缀。
<extension name="dynamic_replace_prefix">
<condition field="destination_number" expression="^123(.*)$">
<!-- 将前缀 "123" 替换为 "987" -->
<action application="set" data="effective_caller_id_number=987$1"/>
<action application="bridge" data="sofia/gateway/my_gateway/${effective_caller_id_number}"/>
</condition>
</extension>
2. 使用 Lua 脚本动态替换前缀
在 Lua 脚本中,可以通过字符串操作替换前缀。
-- 获取原始号码
local number = session:getVariable("destination_number")
-- 将前缀 "123" 替换为 "987"
local new_number = string.gsub(number, "^123", "987")
-- 设置新号码
session:setVariable("effective_caller_id_number", new_number)
-- 继续呼叫
session:execute("bridge", "sofia/gateway/my_gateway/" .. new_number)
四、通过 FreeSWITCH API 动态操作前缀
FreeSWITCH 提供了 fs_cli
和 ESL(Event Socket Library)接口,可以通过 API 动态操作前缀。
1. 使用 fs_cli
动态添加前缀
在 fs_cli
中,可以使用 uuid_setvar
动态设置变量。
uuid_setvar <call_uuid> effective_caller_id_number 123${destination_number}
2. 使用 ESL 动态替换前缀
通过 ESL(Event Socket Library),可以使用以下代码动态替换前缀:
import ESL
# 连接到 FreeSWITCH
conn = ESL.ESLconnection("localhost", "8021", "ClueCon")
if conn.connected():
# 获取呼叫的 UUID
call_uuid = "your_call_uuid"
# 设置新号码
conn.api(f"uuid_setvar {call_uuid} effective_caller_id_number 9871234567890")
# 继续呼叫
conn.api(f"uuid_bridge {call_uuid} sofia/gateway/my_gateway/9871234567890")
else:
print("Failed to connect to FreeSWITCH")
五、总结
动态添加、删除和替换前缀可以通过以下方式实现:
- 拨号计划:使用
set
和regex
实现动态操作。 - Lua 脚本:通过字符串操作实现动态操作。
- FreeSWITCH API:使用
fs_cli
或 ESL 动态设置变量。
这些方法可以根据实际需求灵活选择,适用于不同的场景。