本节介绍 3CX 如何处理来电呼叫,呼叫路由的标准以及如何从传入的 INVITE 消息中提取信息。
识别呼叫来源(Source Identification)
呼叫来源识别(在本文章中简称为 “SI“)是 3CX 来电呼叫的关键部分,3CX 会尝试将每个呼叫的 INVITE 消息与配置好的 SIP 中继进行匹配,如果匹配失败则拒绝该呼叫。这点对于配置了多个 SIP 中继账号的 3CX 来说非常重要,特别是 SIP 中继也有不同的供应商。
呼叫来源识别匹配标准
3CX 采用多种方法将传入的 INVITE 消息与 SIP 中继进行匹配,如上面的流程图所示,在下面也会更详细地说明。
3CX 会将所有配置了的 SIP 中继的 INVITE 消息以随机顺序重复匹配流程图中的彩色方块,进行 SI 匹配。如果没有匹配,将会匹配下一个彩色方块选项。当有 SI 匹配后 3CX 将会停止该流程。
“rinstance” 匹配
第一步 3CX 会在 INVITE 消息的 SIP 域中的 RURI(Request Line URI)中查找 “rinstance” 参数,以匹配 SIP 中继(仅限基于注册的供应商)。如果这个参数是存在的,3CX 会检查 “rinstance” 的值有没有用来注册 SIP 中继,如果有,就能匹配上对应的 SIP 中继。该功能不能被禁用。
参数 “rinstance” 是如何生成的可以查看 “3CX SIP 中继的注册和验证类型“。
在 “Contact: User Part” 中匹配 “Auth ID“
这个匹配的功能主要是为了匹配 PSTN 网关而设计的,不过用来匹配 SIP 中继也很好用。在这个情况下,3CX 会确认 INVITE 消息中的 “Contact: User Part” 的值,并与每一个 SIP 中继的 “Auth ID” 进行比对。如果找到一样的,就是匹配上了对应的 SIP 中继。
该功能不能被禁用。
备注:这也是为什么 3CX 不允许多个 SIP 中继使用相同的 “Auth ID“
“Call Source Identification” 标准匹配
在这些字段中查找DID号码(Call Source Identification)可以在 SP 中继 > 呼入参数 选项页开启。
这些选项会开启用户定义的标准匹配。开启后你可以配置 INVITE 消息的哪个字段和 SIP Trunk 的哪个选项进行匹配。
如果 3CX 匹配到了,那 3CX 会将匹配到的 SIP 中继与对应的 INVTIE 关联起来。
这个 SI 选项可能会返回多个匹配的 SIP 中继,所以 3CX 会将 INVITE 与返回的 SIP 中继中的任意一个进行匹配。对于开启了 “Call Source Identification” 选项的这种情况我们一般称为 “loose SI” 。
为了应对这种情况,有一个额外的选项可以来解决 “Use both ‘Source Identification’ rules and ‘Caller Number/Name’ field mappings”。如果来电的 INVITE 匹配了 “loose SI“,系统会额外检查被叫号码是否与 SIP 中继中的 DID 号码匹配,如果是匹配上的则 INVITE 会与该 SIP 中继进行匹配。3CX 读取的被叫号码的 SIP 域参数可以在呼入参数 > “CalledNum” 设置。当这个选项开启后,我们称它为 “Strict SI“。
在开启 “Strict SI” 后,在 3CX 的所有 SIP 中继中只能有一个匹配结果。如果超出一个,这通呼叫会被拒绝。
最后,关于 “Strict SI” 的警告:开启 “Strict SI” 后 3CX 不会再去进行其他的 SI 匹配,检查是否有其他的 SIP 中继符合条件。
备注:开启 “Strict SI” 后, DID 的号码格式非常重要,因为需要从 INVITE 消息中匹配号码
“CalledNum” 中匹配 DID
SI 匹配方法会将传入的 INVITE 消息中的被叫与 SIP 中继的 DID 号码进行匹配。调整呼入参数的 “CalledNum” 变量,就可以让每个 SIP 中继从 INVITE 中读取不同的被叫号码。
如果匹配到了一个结果,INVITE 消息会被分配给有这个 DID 的 SIP 中继。如果 3CX 匹配了超过一个的 SIP 中继,呼叫会被拒绝。
“CalledNum” 匹配主号码中继
该方法与我们上面的 “‘CalledNum’ 中匹配 DID” 匹配 SI 基本相同,只有下列两点不同:
- 与匹配 DID 列表中的 DID 不同,该方法尝试会用 “CalledNum” 匹配 SIP 中继的”中继线号码“。
- 如果有多个匹配值,它不会拒绝呼叫,而是在多个匹配值之间进行随机呼叫。
呼叫来源识别建议
3CX 的 SI 匹配的目的是让来电的 INVITE 消息能被正确分配到对应的 SIP 中继。在本节 “呼叫来源识别匹配标准” 中我们页描述了可以有很多种匹配方法,但是作为建议,所有的 SIP 中继最好能使用一种下列匹配方式:
- “rinstance” 匹配参数
- 唯一的 “Call Source Identification” 标准匹配
如果 SIP 中继供应商支持 “rinstance” 参数,那么这就是 3CX 将来电呼叫分配到对应 SIP 中继的最佳选择。并且因为这个值对于每个 SIP Trunk 是唯一的,所以可以在 3CX 中添加同一个 SIP 供应商的多个实例而不会出错。该方法的限制是需要 SIP Trunk 供应商支持注册的方式,目前还不支持 IP-based 的对接方式。
对于只支持 IP-based 方式的 SIP 中继供应商,或者支持注册但是却不返回 “rinstance“参数的 SIP 中继来说,第二好的方式就是 “Call Source Identification“选项,因为它非常灵活,可以选择任意 SIP 字段与 SIP 中继中的静态参数进行匹配。比如注册的 FQDN 或者 IP 地址,又或者是手动输入的一个静态值(”Custom Field”)。
使用 “Call Source Identification“的一大问题是对于同一家 SIP 中继提供商的多个中继可能会被 3CX 禁止。这个问题可以用我们上面讲过的 “呼叫来源匹配标准“,根据供应商送过来的 INVITE 消息的区别,设计一个逻辑流程进行匹配。
另外需要注意的是,如果 “Call Source Identification” 选项和 “Strict SI” 都是开启的话,所有 SIP 中继中被分配的 DID 都需要在 SIP 中继设置 > “DIDs“中建好,如果没有做这步,SI 机制永远不会匹配该 SIP 中继。”Strict SI“功能也在屏幕上警告,如果开启该选项会关闭 SIP 中继捕获所有路由的功能。捕获所有路由功能将在本文章的后面介绍。
总而言之,SI 选项确保了 3CX 可以将对应 SIP 中继分配给每个 INVITE。在理想情况下,经过 SI 后只有一个 SIP 中继会匹配上。
呼入参数
当来电呼叫的 INVITE 经过上述 SI 的处理匹配到一个 SIP 中继后,3CX 会从 INVITE 消息中提取很多信息,其中包含:
- 被叫号码/目的地号码
- 来电者的主叫号码
- 来电者的名字
在 SIP 中继设置 > “呼入参数” 中可以配置参数,让 3CX 从 INVITE 消息中的特定 SIP 字段读取信息,并将它们储存为 “变量“。
“CalledNum” 变量
“CalledNum“变量存储被叫号码变量,在呼叫中决定路由的重要变量。来电的 INVITE 消息通常在不同 SIP 字段中有多种格式的被叫号码。比如我们可以在 “RURI: User Part” 或 “To: User Part” 字段中查找被叫号码。
“CallerName” 变量
“CallerName“变量存储来电者的名字(CNAM),3CX 将 SIP 中继提供商提供的来电者名称给 3CX 分机。一般来说系统会读取 “From: Display Name” 字段,但是也不一定。
如果 SIP 供应商不发送 CNAM,即使我将这里的值设置成来电号码(见下方),”CallerName“也不应该设置成空 SIP 字段。
“CallerNum” 变量
“CallerNum” 变量存储来电方的号码(CNUM 或 CLI),3CX 显示来电号码给分机,可以用在呼叫报告或者黑名单拒接等功能中。一般来说系统从 “From: User Part“字段读取,但也不一定。
呼叫路由
在前面我们介绍了一通 INVITE 呼叫进来,3CX 如何匹配 SIP 中继,如何提取 INVITE 信息,最后系统会根据这两个因素决定如何路由这些呼叫:
- SIP 中继通过 “SI” 流程分配到 INVITE 呼叫
- SIP 中继有一个 DID 匹配了 “CalledNum” 变量
流程图描述了 3CX 来电呼叫如何路由,下面我们解释细节:
当 “CalledNum” 匹配了 SIP 中继的 DID
3CX 第一步就是检查 SIP 中继里的 DID 列表中是否存在能匹配 “CalledNum” 的值。它需要精确匹配,因此 DID 列表中的号码格式必须与 “CalledNum” 变量的格式匹配。
如果找到匹配项,3CX 将继续检查是否为此 DID 配置了呼入规则。 如果有,则呼叫将路由到呼入规则定义的目标。 如果没有,3CX 执行下一步。
当 “CalledNum” 没有匹配到 SIP 中继 DID
如果 SIP 中继中没有能批到到 “CalledNum” 的 DID 的值,3CX 会将呼叫送到 SIP 中继配置的默认路由。SIP 中继的默认路由设置(”Catch All”)可以在 SIP 中继设置 > “常规” 标签页修改。