У нашій попередній публікації Правило FreePBX/Asterisk для розбиття заголовка ‘To:’ Telefonica/O2 ми детально описали, як визначати DID для вхідних дзвінків із SIP-транків O2.
Однак отриманий DID все ще може мати один із таких форматів, залежно від того, який номер набирає абонент:
12345670891234567+498912345670049891234567
SIP-транки O2/Telefonica ніяк не нормалізують ці номери, але це викликає проблеми з механізмом зіставлення вхідних маршрутів 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 і має настроювані коди країни та зони (у верхній частині файлу).
[from-pstn-toheader-o2]
exten => _.,1,Set(COUNTRY_CODE=49) ; Встановити код країни
exten => _.,n,Set(AREA_CODE=89) ; Встановити код зони
; Розбити заголовок "To:", напр. "08912345;telefonica=xyz@..." або "08912345@telefonica"
exten => _.,n,Set(TOHEADERNUM=${CUT(CUT(CUT(PJSIP_HEADER(read,To),\;,1),@,1),:,2)})
; Дебаг початкового номера
exten => _.,n,NoOp(Початковий TOHEADERNUM: ${TOHEADERNUM})
; Обробити номери без префікса (короткі номери) (окрім номерів із префіксом "+")
exten => _.,n,ExecIf($["${TOHEADERNUM:0:1}" != "0" & "${TOHEADERNUM:0:1}" != "+"]?Set(TOHEADERNUM=+${COUNTRY_CODE}${AREA_CODE}${TOHEADERNUM}))
; Обробити номери, що починаються з 00 => перетворити на +
exten => _.,n,ExecIf($["${TOHEADERNUM:0:2}" = "00"]?Set(TOHEADERNUM=+${TOHEADERNUM:2}))
; Обробити номери, що починаються лише з ОДНОГО нуля (локальні номери): 0891234 => +49891234
exten => _.,n,ExecIf($["${TOHEADERNUM:0:1}" = "0"]?Set(TOHEADERNUM=+${COUNTRY_CODE}${TOHEADERNUM:1}))
; Примітка: Не потрібно обробляти номери на кшталт +498912345, вони вже у форматі E.164 FQTN
; Дебаг фінального нормалізованого номера
exten => _.,n,NoOp(Фінальний TOHEADERNUM після нормалізації: ${TOHEADERNUM})
exten => _.,n,Goto(from-pstn,${TOHEADERNUM},1)Після того, як ви увімкнете цей діалплан як контекст для ваших SIP-транків, налаштуйте вхідні маршрути так, щоб їхні DID були у форматі E.164 (напр. +49891234567), і тепер вони будуть зіставлятися з вхідними номерами з SIP-транків O2, незалежно від формату, який абонент використав для набору номера.