Administrator
发布于 2026-10-27 / 3 阅读
0
0

FreeSWITCH 新建分机:完整配置、常用参数与互拨实战|01

English
中文

要让新坐席能打电话,先给它配置可注册的SIP分机。这一期就做一个具体任务:新增7101、7102两个分机,用两部软电话注册,再互相拨号。做完应能看到两个注册记录,拨号时对方振铃,接听后双方能正常说话。

这里的分机是电话账号。如果要让它接收呼叫中心队列派单,还需要创建队列agent并关联tier,下一期接着做。callgroup变量也不能代替队列座席配置。

本文按官方v1.10.12的vanilla静态XML模板核对,要求已安装并启动FreeSWITCH、mod_sofia正常运行、fs_cli可连接,终端与服务端在同一可达测试网络。使用其他版本、管理平台或动态XML时先核对实际结构。配置按上述模板核对,实际通话还需要在自己的环境验证。本期先在内网完成注册和互拨,公网NAT暂时不参与讨论。

找到配置目录和分机所属域

在已经连接到目标实例的fs_cli中执行:

version
eval $${conf_dir}
eval $${domain}
sofia status profile internal

依次记录运行版本、配置目录、域值和internal的监听情况。后文用CONF表示刚查出的目录,它是说明用的占位符,不要直接原样粘贴进路径。Profile名称或域与本例不同时要相应替换。

先查看CONF/directory/default.xml,确认域名使用$${domain},而users内包含default/*.xml。这条包含关系存在时,新文件才会被该模板读到。若由后台管理用户,不要直接修改自动生成文件。

7101和7102也要先确认未被自己的用户、路由及业务号码占用。这里特意没有选2001和2002:参照模板已经把它们用于组呼,直接拿来当新分机容易撞路由。

新建7101的用户文件

在服务器文件系统新建CONF/directory/default/7101.xml。文件完整内容如下。把password占位值换成你为这个账号生成的密码,软电话里也填这一份。

<include>
  <!-- 用户标识:本例的新分机号码 -->
  <user id="7101">
    <!-- params是供认证等功能读取的用户参数 -->
    <params>
      <!-- 改为独立密码,并在软电话填写相同值 -->
      <param name="password" value="REPLACE_WITH_UNIQUE_PASSWORD_7101"/>
    </params>
    <!-- variables提供用户相关的通道变量 -->
    <variables>
      <!-- 呼叫进入哪个拨号计划context -->
      <variable name="user_context" value="default"/>
      <!-- 用于账务或统计关联;不会自动生成话单 -->
      <variable name="accountcode" value="7101"/>
      <!-- 本例呼叫使用的主叫显示名 -->
      <variable name="effective_caller_id_name" value="Agent 7101"/>
      <!-- 本例呼叫使用的主叫显示号码 -->
      <variable name="effective_caller_id_number" value="7101"/>
    </variables>
  </user>
</include>

user的id是当前域下的用户标识,7101和7101@另一个域不应混为一谈。文件名便于管理,实际标识以id为准;把文件改名不会自动改分机号。

password供SIP认证使用;user_context让本例已认证用户的呼叫进入default上下文,它必须与实际拨号计划对应。accountcode是统计关联值,不等于登录密码,也不意味着计费已经配置完成。

effective_caller_id_name和effective_caller_id_number控制本例呼叫的主叫身份,但后续拨号计划或设备仍可能调整显示。外呼到运营商时,主叫号码还要符合线路要求。

再创建CONF/directory/default/7102.xml,将上面所有7101改为7102,并给7102设置另一份独立密码。文件名和user id一起改,7102才是一个独立账号。两个文件都应保持单一include根节点。

样例里还有这些参数,什么时候加

官方用户样例比上面的最小文件多几项。以后遇到语音信箱、外呼和组内代接,会用到它们。下面都写在用户的params或variables中,不是再建一份用户。

vm-password放在params里,是进入语音信箱时使用的口令。SIP登录用password,两者分开管理。需要语音信箱时可以增加下面一项,并换成自己的信箱口令;语音信箱模块和访问路由还要另外配置。

<!-- 用户params中:替换为自己的语音信箱口令 -->
<param name="vm-password" value="REPLACE_WITH_VOICEMAIL_PIN"/>

toll_allow放在variables里,样例用domestic、international、local这些标签表达通话权限。标签名称由业务约定,例如只给某组用户local。它需要拨号计划读取并判断才有作用:如果外呼路由直接bridge到中继,没有检查这个变量,给账号写local也不会自动拦住其他号码。

<!-- 用户variables中:本例只写一个权限标签,由外呼路由判断 -->
<variable name="toll_allow" value="local"/>

outbound_caller_id_name、outbound_caller_id_number也放在variables里,用来保存外呼希望使用的主叫信息。样例引用{outbound_caller_name}和{outbound_caller_id},值来自全局变量。接运营商线路时,通常需要在外呼路由里取出这些值,写入实际外呼腿使用的主叫字段;具体号码还要符合线路要求。内部分机显示7101,外呼显示企业统一号码,可以分别配置。

callgroup放在variables里。官方模板有与它配合的组内代接等规则,同组用户可以通过相关规则归到一组。如果只是给账号写了techsupport,而拨号规则没有使用它,通话行为不会跟着变化。呼叫中心排队用的是mod_callcenter的queue、agent和tier,和这里的callgroup分开配置。

这些项可以按需加入。比如只做内部分机互拨,就保留前面的最小文件;要开语音信箱,再补vm-password及语音信箱路由;要控制外呼范围,就连同toll_allow的判断规则一起做。

补上7101和7102的拨号规则

只建用户文件还不够。参照模板的普通本地分机规则匹配1000~1019,7101需要我们补一条匹配规则。确认CONF/dialplan/default.xml在default上下文中包含default/*.xml,再新建CONF/dialplan/default/01_agent_test.xml:

<include>
  <!-- 规则名称方便在配置和日志中辨认 -->
  <extension name="agent-test-7101-7102">
    <!-- 完整匹配7101或7102,括号保留被叫号码 -->
    <condition field="destination_number" expression="^(710[12])$">
      <!-- 呼叫目标振铃等待上限:本例演示值30秒 -->
      <action application="set" data="call_timeout=30"/>
      <!-- 成功桥接结束后,结束主叫侧剩余流程 -->
      <action application="set" data="hangup_after_bridge=true"/>
      <!-- 按当前模板域查找用户,再呼叫其注册地址 -->
      <action application="bridge" data="user/$1@$${domain}"/>
    </condition>
  </extension>
</include>

extension的name是规则名称,不是分机账号。destination_number是待匹配的被叫号码;^和要求完整匹配,710[12]只允许7101或7102,括号把匹配结果保存为1。

bridge发起到目标用户的呼叫。user/7102@某域会通过用户目录的dial-string等配置查找联系地址,不能把它当成公网电话号码。$${domain}在预处理时展开,本例与用户所属域保持一致;多域系统要按真实业务设计,不能照抄一个全局域。

call_timeout=30里的30表示本例等待接听的秒数,接通后不会在第30秒自动挂断;hangup_after_bridge=true表示通话成功桥接后,被叫挂断就结束主叫侧。若有更早的宽泛匹配规则截获号码,需要调整规则位置或缩小匹配范围。

路由常用的几种扩展

等两个账号能互拨后,可以按需要改路由。下面的片段是参考选项,不用全部塞进第一份配置。

被叫忙或没人接,想继续播放提示音,可以在bridge前设置continue_on_fail,并在bridge后安排失败处理。例如下面只在USER_BUSY、NO_ANSWER这两类失败后继续执行。提示音路径要换成服务器上确实存在的文件。

<!-- bridge前:只对指定失败原因继续后续动作 -->
<action application="set" data="continue_on_fail=USER_BUSY,NO_ANSWER"/>
<!-- 原来的bridge动作仍放在这里 -->
<action application="bridge" data="user/$1@$${domain}"/>
<!-- bridge失败后:换成已经准备好的提示音绝对路径 -->
<action application="playback" data="/absolute/path/unavailable.wav"/>

continue_on_fail管呼叫没接通时怎么继续,hangup_after_bridge管成功通话结束后怎么继续。设置true会允许更多失败情况往后走;需要区分忙线、无人接听和号码不存在时,按实际挂断原因分别处理更方便。

如果一条路由要呼叫多个目标,leg_timeout可以对某一条呼叫腿单独设等待接听时间,例如在对应目标前加[leg_timeout=15]。它和call_timeout的作用范围不同,多个号码同时振铃或顺序振铃时再按需要设置。

有时设置30秒等待却与实际体验不一致,要看看对端是否提前送了183早期媒体。call_timeout受到早期媒体处理方式影响;ignore_early_media=true可以选择忽略早期媒体并继续等正式接听,但也会影响接听前听到的运营商提示。普通内部分机先用本期配置,遇到早期媒体再按线路需求调整。

拨号计划中的set给当前呼叫腿赋值,export还可以把值带到后续创建的被叫腿。想改主叫侧的等待逻辑与想让被叫侧带上某个变量,使用的位置和方式可能不同。后面讲外呼、录音和队列时,会用具体配置继续展开。

重新读取XML,确认账号被加载

保存用户文件与新增拨号规则后,在fs_cli执行reloadxml。本例只新增静态用户和拨号规则,不需要为此重启SIP Profile。

reloadxml
user_exists id 7101 YOUR_DOMAIN
user_exists id 7102 YOUR_DOMAIN

将YOUR_DOMAIN换成前面查出的实际域;不要原样使用。两条user_exists应返回true。返回false,先看域名和user id,再看文件有没有被include进来。XML语法有问题时,reloadxml附近的日志通常会给出线索,按日志定位到对应文件修改。

软电话每一项填什么

准备两个独立客户端,分别登录7101和7102。软电话界面名称可能不同,按下面含义对应填写:

  • 用户名/SIP用户:7101;另一部填写7102。
  • 认证用户名/Auth ID:本例与各自用户id相同。
  • 密码:各自用户文件中实际设置的password。
  • SIP域/Domain:前面查出的用户所属域。
  • 服务器/代理地址:终端可达的FreeSWITCH监听地址;端口按internal实际监听值填写,默认模板通常使用5060。
  • 传输协议:与该Profile和网络允许的协议一致;本例同网测试采用UDP,前提是相应UDP监听和通路可用。
  • 显示名称:可填Agent 7101或Agent 7102;它不是认证用户名。

如果域与服务器地址不同,在支持分开配置的客户端中分别设置:域用于SIP身份,代理地址用于找到服务器。本期先在内网测试。注册超时时,检查客户端填写的服务器、端口和UDP监听;接通后没声音,再看RTP与音频设备。

查注册、互拨,再核对结果

客户端启用账号后,在fs_cli查看:

sofia status profile internal reg

应能找到7101和7102对应域的注册记录。把这里的注册记录与两部软电话上的账号对应起来。若反复401并注册失败,核对域、认证用户名和密码;正常认证握手也可能出现401,单个401不能判为故障。超时则先检查终端到实际监听地址、端口和传输协议的通路。

从7101拨7102,确认7102振铃、接听、双方可交谈且能正常挂断;再反向拨一次。注册成功却不振铃,检查呼叫进入的context和号码匹配;振铃接通但单向无声,则继续检查RTP、终端音频和网络,账号认证和音频传输是两段流程,按出问题的环节检查。

几个容易卡住的地方

账号文件已经建好,user_exists仍是false:常见的是域填错、id没改,或者新文件没被父文件包含。先让这条查询返回true,再去软电话登录。

软电话已注册,拨7102却进了别的业务:检查号码是否和原路由冲突。vanilla模板的2001、2002已有组呼规则,所以本例用了7101、7102;自己的系统仍要查一遍号码。路由按实际匹配过程走,文件名小不代表它一定最先执行。

两部软电话都填成7101:两台设备会以同一个账号注册,来电会受该Profile多重注册设置影响。测试互拨时分别用7101和7102,排查更直观。

接通前等30秒和接通后只能说30秒,是两回事。前者看call_timeout等等待参数;要限制已经接通的通话时长,需要另外设计定时挂断逻辑。

回退时让测试客户端注销并停用账号,确认没有测试通话,再移走新增的两个用户文件和本篇拨号文件,执行reloadxml。移除文件不会自动清掉既有注册或通话;清理前先让两部测试终端退出,现有通话结束后再做删除。

做到这一步,你已经能新增可注册、可互拨的SIP分机。下一期把7101和7102关联到mod_callcenter的agent、queue和tier,解释contact、状态及派单关系,完成真正的队列座席接入。

参考资料

FreeSWITCH configuration reference

FreeSWITCH configuration reference

FreeSWITCH configuration reference

FreeSWITCH configuration reference

FreeSWITCH configuration reference

FreeSWITCH routing reference

FreeSWITCH routing reference


评论