Asterisk/FreePBX E.164 FQTN 归一化器(可配置国家代码)

在我们之前的文章 FreePBX/Asterisk 规则:拆分 Telefonica/O2 ‘To:’ 头 中,我们详细介绍了如何确定来自 O2 SIP 中继的来电的 DID。

但是,生成的 DID 仍然可以采用以下格式之一,具体取决于呼叫者拨打的号码:

O2/Telefonica SIP 中继不会以任何方式归一化这些号码,但这会导致 FreePBX 入站路由匹配器出现问题。

例如,如果你为 0891234567 配置了入站路由,它只会在呼叫者完全拨打 0891234567 时匹配。如果呼叫者拨打 +49891234567,即使它映射到相同的电话号码,入站路由也不会匹配。

为了解决这个问题,我们可以使用 FreePBX E.164 FQTN 归一化器将传入号码归一化为 E.164 格式。

FreePBX 15 默认只提供 from-pstn-e164-us 归一化器,它硬编码为只支持美国号码,并且不包括 O2 特定的拆分规则(该规则应该适用于许多(如果不是大多数)其他 SIP 中继提供商)。

以下拨号计划配置(你可以添加到 /etc/asterisk/extensions_custom.conf)将传入号码归一化为 E.164 格式,并具有可配置的国家和区号(在文件顶部设置)。

extensions_custom.conf
[from-pstn-toheader-o2]
exten => _.,1,Set(COUNTRY_CODE=49)       ; Set the country code
exten => _.,n,Set(AREA_CODE=89)          ; Set the area code

; Split "To:" header, e.g. "08912345;telefonica=xyz@..." or "08912345@telefonica"
exten => _.,n,Set(TOHEADERNUM=${CUT(CUT(CUT(PJSIP_HEADER(read,To),\;,1),@,1),:,2)})

; Debug the original number
exten => _.,n,NoOp(Original TOHEADERNUM: ${TOHEADERNUM})

; Handle numbers without a prefix (short numbers) (except for numbers with "+" prefix)
exten => _.,n,ExecIf($["${TOHEADERNUM:0:1}" != "0" & "${TOHEADERNUM:0:1}" != "+"]?Set(TOHEADERNUM=+${COUNTRY_CODE}${AREA_CODE}${TOHEADERNUM}))

; Handle numbers starting with 00 => convert to +
exten => _.,n,ExecIf($["${TOHEADERNUM:0:2}" = "00"]?Set(TOHEADERNUM=+${TOHEADERNUM:2}))

; Handle numbers starting with just ONE zero (local numbers): 0891234 => +49891234
exten => _.,n,ExecIf($["${TOHEADERNUM:0:1}" = "0"]?Set(TOHEADERNUM=+${COUNTRY_CODE}${TOHEADERNUM:1}))

; Note: No need to handle numbers such as +498912345, already in E.164 FQTN format

; Debug the final normalized number
exten => _.,n,NoOp(Final TOHEADERNUM after normalization: ${TOHEADERNUM})

exten => _.,n,Goto(from-pstn,${TOHEADERNUM},1)

一旦你将此拨号计划启用为 SIP 中继的上下文,配置你的入站路由以使用 E.164 格式的 DID(例如 +49891234567),它们现在将匹配来自 O2 SIP 中继的传入号码,无论呼叫者使用什么格式拨打电话。


Check out similar posts by category: Asterisk, FreePBX