FreeSWITCH配置文件解析(3) dialplan 拨号计划中xml 的condition中field解析

发布于:2025-06-30 ⋅ 阅读:(15) ⋅ 点赞:(0)

在 FreeSWITCH Dialplan 的 <condition> 中,可以使用大量的通道变量(Channel Variables)来进行匹配和决策。这些变量包含了呼叫的各个方面信息。以下是一些​​最核心和常用​​的变量及其含义:

一、 呼叫目标相关 (关键路由变量)

  1. destination_number​: ​​绝对最重要​​的变量。包含呼叫请求中要拨打的号码 (即被叫号码)。这是路由逻辑最主要依据。
    • 示例destination_number="1000" 匹配呼叫号码为 1000 的请求。
  2. call_direction​: 呼叫方向。
    • inbound: 呼入 (从外部到 FreeSWITCH)。
    • outbound: 呼出 (从 FreeSWITCH 到外部)。
  3. user_name​: 在 userinfo 中设置的用户名 (常用于账号认证)。
    • 来源sofia.conf.xml 里的用户目录 (directory),在认证阶段设置。
  4. domain_name​: 认证请求中的域 (Realm) 或 当前处理的域。
    • 示例domain_name="myfreeswitch.com"
  5. user_context​: 在 userinfo 中设置的 Dialplan context。如果设置了,呼叫会首先进入这个 context。
    • 来源userinfo 配置。
  6. context​: 当前呼叫所在的 Dialplan context 名称。

 二、 主叫信息相关 (主叫显示)

  1. caller_id_name​: 主叫名称。
    • 来源: SIP From: 头的显示名 ("John Doe" <sip:1001@example.com> 中的 John Doe ),或出局呼叫时设置。
  2. caller_id_number​: 主叫号码。
    • 来源: SIP From: 头的用户部分 (1001),或出局呼叫时设置。
  3. ani (Automatic Number Identification)​​: ​​主叫线路标识符​​。通常指在 SIP P-Asserted-Identity 头或 ISDN 信令中传来的原始主叫号码(特别是经过运营商时可能不同于 caller_id_number)。
  4. aniii​: 主叫线路标识符的附加信息 (较少使用)。

 三、 其他信息 & 自定义变量

  1. chan_name​: 通道名称。包含协议、IP、端口等。示例sofia/external/1001@192.168.1.10:5060
  2. network_addr​: SIP 请求的源 IP 地址。
  3. rdnis (Redirected Dial Number Identification Service)​​: 重定向号码。比如用户 A 呼叫 B,B 把呼叫转到 C,那么 A 呼叫 C 时,rdnis 就是 B 的号码。
  4. source​: 通常表示来源的 context示例: 如果呼叫从网关入,source 可能为网关配置的 context。
  5. sip_invite_domain​: SIP INVITE 请求中 To: 头域名部分。有时用于区分不同域名的入站呼叫。
  6. sip_req_user​: SIP INVITE 请求中 To: 头用户部分(注意:可能被 Contact 重写,所以通常优先用 destination_number)。
  7. sofia_profile_name​: 处理该呼叫的 Sofia SIP profile 的名称 (如 internalexternal)。
  8. hangup_cause​: ​​非常重要​​!表示呼叫最终挂断的原因代码 (如 NORMAL_CLEARINGUSER_BUSYORIGINATOR_CANCEL)。通常在 Post-Dialplan 处理。
  9. ${variable_name}​: 任何通过 set Action ​​在 Dialplan 执行过程中设置的变量​​,或者通过其他方式(如 uuid_setvar, Lua 脚本等)设置的通道变量,都可以在后续的 <condition> 中被匹配。
    • 示例: 你设置 <action application="set" data="my_var=123"/>,之后可以用 <condition field="${my_var}" expression="^123$"> 来匹配。

⚠ 需要注意的关键点

  • ​变量赋值时机​​: 很多变量(如 destination_numbercaller_id_numberuser_namedomain_nameuser_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 帮助区分呼入呼出。anirdnis 提供额外的号码信息。hangup_cause 用于分析呼叫结束原因。最重要的技巧是​​在 Dialplan 中使用 <action application="log"> 打印变量值​​进行实时调试,确保你匹配的变量确实在那一刻包含了你认为的值。