在 FreeSWITCH Dialplan 的 <condition>
中,可以使用大量的通道变量(Channel Variables)来进行匹配和决策。这些变量包含了呼叫的各个方面信息。以下是一些最核心和常用的变量及其含义:
一、 呼叫目标相关 (关键路由变量)
-
destination_number
: 绝对最重要的变量。包含呼叫请求中要拨打的号码 (即被叫号码)。这是路由逻辑最主要依据。- 示例:
destination_number="1000"
匹配呼叫号码为 1000 的请求。
- 示例:
-
call_direction
: 呼叫方向。inbound
: 呼入 (从外部到 FreeSWITCH)。outbound
: 呼出 (从 FreeSWITCH 到外部)。
-
user_name
: 在userinfo
中设置的用户名 (常用于账号认证)。- 来源:
sofia.conf.xml
里的用户目录 (directory
),在认证阶段设置。
- 来源:
-
domain_name
: 认证请求中的域 (Realm) 或 当前处理的域。- 示例:
domain_name="myfreeswitch.com"
。
- 示例:
-
user_context
: 在userinfo
中设置的 Dialplancontext
。如果设置了,呼叫会首先进入这个 context。- 来源:
userinfo
配置。
- 来源:
-
context
: 当前呼叫所在的 Dialplan context 名称。
二、 主叫信息相关 (主叫显示)
-
caller_id_name
: 主叫名称。- 来源: SIP
From:
头的显示名 ("John Doe" <sip:1001@example.com>
中的John Doe
),或出局呼叫时设置。
- 来源: SIP
-
caller_id_number
: 主叫号码。- 来源: SIP
From:
头的用户部分 (1001
),或出局呼叫时设置。
- 来源: SIP
-
ani
(Automatic Number Identification): 主叫线路标识符。通常指在 SIPP-Asserted-Identity
头或 ISDN 信令中传来的原始主叫号码(特别是经过运营商时可能不同于caller_id_number
)。 -
aniii
: 主叫线路标识符的附加信息 (较少使用)。
三、 其他信息 & 自定义变量
-
chan_name
: 通道名称。包含协议、IP、端口等。示例:sofia/external/1001@192.168.1.10:5060
。 -
network_addr
: SIP 请求的源 IP 地址。 -
rdnis
(Redirected Dial Number Identification Service): 重定向号码。比如用户 A 呼叫 B,B 把呼叫转到 C,那么 A 呼叫 C 时,rdnis
就是 B 的号码。 -
source
: 通常表示来源的context
。示例: 如果呼叫从网关入,source
可能为网关配置的 context。 -
sip_invite_domain
: SIP INVITE 请求中To:
头域名部分。有时用于区分不同域名的入站呼叫。 -
sip_req_user
: SIP INVITE 请求中To:
头用户部分(注意:可能被 Contact 重写,所以通常优先用destination_number
)。 -
sofia_profile_name
: 处理该呼叫的 Sofia SIP profile 的名称 (如internal
,external
)。 -
hangup_cause
: 非常重要!表示呼叫最终挂断的原因代码 (如NORMAL_CLEARING
,USER_BUSY
,ORIGINATOR_CANCEL
)。通常在Post-Dialplan
处理。 -
${variable_name}
: 任何通过set
Action 在 Dialplan 执行过程中设置的变量,或者通过其他方式(如uuid_setvar
, Lua 脚本等)设置的通道变量,都可以在后续的<condition>
中被匹配。- 示例: 你设置
<action application="set" data="my_var=123"/>
,之后可以用<condition field="${my_var}" expression="^123$">
来匹配。
- 示例: 你设置
⚠ 需要注意的关键点
- 变量赋值时机: 很多变量(如
destination_number
,caller_id_number
,user_name
,domain_name
,user_context
)在进入 Dialplan 之前就存在了(尤其是在userinfo
认证过程中设置的)。 - Dialplan 作用域: 使用
<action application="set">
设置的变量只对该呼叫通道内的后续 Dialplan 逻辑有效。 - 查看变量值: 调试时,一个非常有用的方法是直接在 Dialplan 中使用
<action application="log" data="INFO ${destination_number}"/>
或<action application="log" data="INFO ${caller_id_number}"/>
将变量的值打印到 FreeSWITCH 控制台 (fs_cli
) 或日志文件 (freeswitch.log
) 中。这是解决 Dialplan 逻辑问题的首选方法。 - 表达式语法:
<condition field="${variable}" expression="regex_pattern">
。字段field
指定要检查的变量名(通常用${}
包裹),expression
是一个正则表达式。expression="^123$"
表示精确匹配 “123”。expression=".*123.*"
表示包含 “123”。
总结
最核心的变量是 destination_number
(被叫号码)、caller_id_number
(主叫号码)、user_name
(认证用户名)、domain_name
(认证域/当前域) 和 context
(当前上下文)。call_direction
帮助区分呼入呼出。ani
、rdnis
提供额外的号码信息。hangup_cause
用于分析呼叫结束原因。最重要的技巧是在 Dialplan 中使用 <action application="log">
打印变量值进行实时调试,确保你匹配的变量确实在那一刻包含了你认为的值。