Administrator
发布于 2026-11-04 / 1 阅读
0
0

FreeSWITCH号码匹配实战:去掉接入码,再按线路补前缀

English
中文

上一期让7101、7102通过指定中继拨一个测试号码。这一期继续用同一条线路,解决三个容易混在一起的问题:用户按了什么,系统用哪个号码做路由判断,运营商最后收到了什么。示例保留唯一授权测试被叫,演示去掉本地接入码9,再按线路约定补上86。86只是本篇假设的中继格式,实际值从开通资料确认。

先把三份号码写下来

假设用户输入的是9加测试号码,拨号计划进入时收到的就是这串数字。规则可以把9理解为本地外呼入口,后面的号码才用于比较允许名单。构造中继目标时,再按对端需要生成新的字符串。例如约定要发86加国内测试号码,就在去9之后补86。假如手机端已经改号,FS收到的值可能和键盘输入不同,应先查收到的被叫,再决定处理哪个部分。

RFC 3966区分电话号码和拨号字符串。本地接入码属于拨号方式,全球形式用加号表示,号码本身也可以用本地形式并带上下文。这个区分有助于拆开内部存储与中继发送格式。即使业务数据库保存带加号的全球号码,中继也可能要求不带加号的纯数字,或者只接收本地号码。不能从规范直接推导某条线路接受什么格式。

在06期的测试规则上替换

查实际conf_dir,再确认内部Profile给7101、7102使用的是default上下文。备份第06期的dialplan/default/06_training_outbound.xml,把旧测试规则移出被包含的目录,再把下面的文件保存为同目录的07_training_outbound.xml。旧规则和新规则应二选一,避免两条同时匹配。模板中的default/*.xml包含位置也要核对,父文件中排在它前面的规则仍可能优先命中。

<include>
  <!-- 沿用06期鉴权范围,只在内部default上下文加载 -->
  <extension name="training-outbound-07">
    <condition field="${sip_auth_username}" expression="^(?:7101|7102)$"/>
    <!-- 替换为唯一获准的测试号码,暂时保留占位符即可做静态检查 -->
    <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}"/>
      <!-- 沿用06期已验收的gateway,只在授权测试环境拨打 -->
      <action application="bridge" data="sofia/gateway/training_carrier_reg/${training_carrier_number}"/>
      <action application="hangup"/>
    </condition>
  </extension>
</include>

把YOUR_TEST_NUMBER换成唯一已授权的纯数字号码,保留括号与锚点。样例的86仅在该目标没有国家码、且线路明确需要86时使用。如果运营商要国内号码,把training_carrier_number的赋值改成${training_number}。若第06期选的是IP鉴权中继,bridge引用那个已经配置好的名称即可。入站public和IVR、队列规则无需接入这段外呼逻辑。

每个字段管哪一步

第一条condition使用经过鉴权的通道变量,非捕获括号(?:...)用于分组而不占用捕获编号。只核对显示主叫7101或7102无法代替鉴权,变量没填时,应查INVITE鉴权与入口上下文。条件的默认break行为是失败时停止检查本条extension中的后续条件,仍可能检查其他extension。整个上下文的权限控制需要一起审查。

第二条condition用^和限制整串号码。9位于捕获组外,括号里的值通过1拿到。set保存该值,后面引用${training_number}时是在使用通道变量,跟正则捕获编号是两回事。改过括号或拆分条件后重新核对捕获,尤其是把可选前缀也放入了捕获组的时候。bridge把构造好的号码交给中继,保留原destination_number便于区分用户输入和实际发出号码。样例没有先answer,可观察对端振铃及应答过程。

增加第二种号码格式前

如果将来允许用户输入带加号的号码,正则中的加号要按字面量匹配,可写[+]。单独定义可接受的全局格式及目的地范围,再转换到同一内部表示。不要用删光所有非数字字符的办法去猜用户的意思,分隔符、分机参数和本地前缀不一定能靠一条替换表达清楚。

如果线路设置过gateway的destination-prefix,检查是否已经在那里补码。两层同时加会得到重复前缀。多个地区、不同中继分别定义输出格式,会比在全局做一次固定加码更好排查。紧急号、短号和国际长途也应按已有独立规则管理,实验不要覆盖这些号码。

加载后检查三点

用fs_cli执行reloadxml,检查解析报错,然后用非生产环境做验证。第一点,用7101和7102各拨一次9加授权测试号码,对照实际收到的被叫、捕获后的号码和中继发出的Request-URI用户部分。第二点,试相邻号码、少拨一位或未授权测试账号,确认不会命中这条外呼规则,并核对有无其他宽匹配线路接走。第三点,复查7101与7102互拨、7180菜单和7190队列。信令记录用于核验时先脱敏,真实中继测试可能产生费用。

对照现象排查

拨完没有走到新规则,先查context、原被叫和鉴权变量,再查更早的extension。reloadxml返回成功只能说明加载流程完成到相应阶段,仍要确认规则所在文件被包含。桥接发出的号码少一位,优先检查正则捕获范围,别只看手机的拨号历史。对端看到两个86,检查set和gateway是否同时补码。号码正确仍被拒,结合运营商的响应再查鉴权、主叫许可与业务范围。

回退时移出07期文件,恢复06期备份并执行reloadxml,再对照授权测试被叫和内部号码。只改XML路由不需要重启中继Profile。

Source 1 · Source 2 · Source 3


评论