Administrator
发布于 2026-11-05 / 3 阅读
0
0

FreeSWITCH主叫显示实战:内呼、外呼和线路权限08

English
中文

让两个号码各用在合适的地方

这一期沿用7101、7102、7180菜单和7190队列。做完后,从7101打给7102时,预期在对方终端看到7101。打出测试中继时,FS改用运营商核准的主叫。谁能拨这条线路则由鉴权账号和目录里的授权标记决定。本文按FreeSWITCH v1.10.12目录模板与现行手册核对,未接真实中继实测。

先准备一条已通过第06期验收的测试线路、一个能接听的授权被叫和一个运营商明确允许送出的主叫号码。主叫与被叫可能恰好相同,但它们属于不同字段。第07期去9、按约定补86处理的是被叫,本期不要用同一个变量兼做主叫。还要确认运营商从哪个头取主叫,以及是否会重写显示名称或号码。

在目录中设置内部显示和权限

找出实际conf_dir,在现有7101用户文件中把以下三个变量合并进原来的variables。已经有同名变量就改原值。保留密码、用户域、user_context和拨号规则。7102做同样的修改,把显示名与显示号改成自己的值,将权限标记写为no,作为反向验证。

<variables>
  <!-- 合并到现有7101用户的variables,不替换用户文件 -->
  <variable name="effective_caller_id_name" value="Training 7101"/>
  <!-- 内部互拨显示分机号 -->
  <variable name="effective_caller_id_number" value="7101"/>
  <!-- 管理员授予此用户实验外呼权限 -->
  <variable name="training_outbound_allowed" value="yes"/>
</variables>

effective_caller_id_name和effective_caller_id_number用于后续桥接的显示身份。显示名还会受话机通讯录和终端实现影响。目录模板也提供outbound_caller_id_number和outbound_caller_id_name,现有拨号计划可以读它们并在外呼时覆盖有效主叫。检查当前线路是否已经使用这套映射,避免多个地方各设置一次,排查时说不清是谁覆盖了谁。

training_outbound_allowed是本篇自定义通道变量,yes和no没有单位。它本身不拦截电话,下面的condition才会消费它。原版目录里的toll_allow同理,需要相应拨号规则检查具体类别。不要把accountcode当成授权开关,它可以用于归集记录,但仅设置它不会阻止外呼。目录用户和SIP鉴权账号是这一期的权限对象,队列agent、tier分别描述接单成员和分配关系,不用更改。

只在外呼分支覆盖主叫

备份第07期文件,把旧版本移出被包含的目录,再在原位置新建08_training_outbound.xml。目录路径沿用内部default的包含规则。两期示例应二选一,否则旧规则可能先匹配,绕开新增的权限检查。下面是完整文件。

<include>
  <!-- 沿用06期鉴权范围,只在内部default上下文加载 -->
  <extension name="training-outbound-08">
    <condition field="${sip_auth_username}" expression="^(?:7101|7102)$"/>
    <!-- 由管理员在目录中发放,仅接受明确的允许值 -->
    <condition field="${training_outbound_allowed}" expression="^yes$"/>
    <!-- 替换为唯一获准的测试号码,暂时保留占位符即可做静态检查 -->
    <condition field="destination_number" expression="^9(YOUR_TEST_NUMBER)$">
      <!-- 只取括号捕获的号码,去掉接入码9 -->
      <action application="set" data="training_number=$1"/>
      <!-- 示例中继需要86前缀,仅在运营商确认后启用 -->
      <action application="set" data="training_carrier_number=86${training_number}"/>
      <!-- 只在这条外呼规则内覆盖送给对端的主叫 -->
      <action application="set" data="effective_caller_id_name=Training Desk"/>
      <action application="set" data="effective_caller_id_number=YOUR_APPROVED_CLI"/>
      <!-- 沿用06期gateway,只在授权测试环境拨打 -->
      <action application="bridge" data="sofia/gateway/training_carrier_reg/${training_carrier_number}"/>
      <action application="hangup"/>
    </condition>
  </extension>
</include>

把YOUR_TEST_NUMBER换成唯一获准的数字被叫,把YOUR_APPROVED_CLI换成运营商分配或授权的主叫。保持第07期已经验证的被叫转换和gateway名称。样例保留86只是为了延续前一期,如果你的运营商要国内格式,保持原先实际使用的赋值即可。对没有开通线路的环境,保留占位符做静态检查。

两条权限条件在号码匹配前,先核对本次INVITE鉴权账号,再读来自受控目录的yes标记。若系统会从外部请求或脚本导入同名变量,先查清来源并隔离输入。条件失败会跳过本条的桥接,但还要检查同一context里更宽泛的外呼规则。生产环境里,授权范围通常还要考虑可拨号码类别和中继权限,本例只放行单个测试目的地。

在SIP报文里看实际送出了什么

检查FS送往运营商的B腿INVITE。Request-URI里的用户部分用于核对被叫。From里的名称和号码可能采用gateway定义的身份,运营商也可能通过可信互联中约定的P-Asserted-Identity读取主叫。RFC 3325描述了信任域中断言身份的用法。公网来话随附的身份头不能直接当成本系统认证账号,更不能据此发放外呼权限。

如果运营商明确要求从From取号,核对gateway的from-user和caller-id-in-from,以及当前版本对这些设置的处理。切换caller-id-in-from可能改变该线路上其他呼叫的From,应先在独立测试中继验证。若双方约定PAI,检查sip_cid_type等设置和实际报文,按线路资料决定是否启用。终端最终显示什么也受运营商重写和隐私规则影响,只有抓包和实际接听相互印证,才知道这一段是否达到验收预期。

应用代码直接创建呼叫腿时,可以在拨号串变量块设置origination_caller_id_number。它与在现有通道上通过set设置effective_caller_id_number的作用点不同。调试时从实际创建该腿的bridge或originate入口入手,别把所有变量一起堆进目录瞎整。

加载后检查三点

用fs_cli运行reloadxml并查看解析错误,重新发起测试通话。若目录由外部系统提供或有缓存,确认新呼叫确实读到更新后的变量。第一点,用7101和7102互拨,核对显示号以及7180、7190仍可到达。第二点,用7101拨9加授权测试被叫,对照B腿主叫和被叫,再由接听端确认显示。第三点,用7102拨同一个号码,确认不会从这条线路产生B腿,并排查其他规则是否接走。真实呼叫可能计费,保存报文前应脱敏。

内部显示没变时,先查目录是否加载、后续set是否覆盖,再看话机本地通讯录。外呼显示为网关账号时,先比较B腿的From和运营商认可的身份头。FS已按约定送号而终端显示仍不同,就把脱敏报文和通话时间交给线路方核对。7102仍能打出时,找实际命中的extension,检查旧文件、宽匹配和标记来源。

回退时恢复原目录变量,移出08期测试文件并恢复07期备份,运行reloadxml后复查互拨和原有测试外呼。仅修改XML目录与拨号计划时无需重启中继Profile。

Source 1 · Source 2 · Source 3 · Source 4


评论