8(499)-709-97-83
Работаем с 8:00 до 19:00

Изменение входящего CallerID в Asterisk (FreePBX)

  • 03 декабря 2014

В этой статье мы расскажем, как изменить входящий номер (CallerID) в FreePBX 12. В интернете есть несколько статей, которые рассказывают, как это сделать, но мы решили показать готовое решение и объяснить как это работает.

Задача: При входящем вызове необходимо удалить префикс 010, для получения корректного CallerID внутреннего номера. В нашем случае внутренние номера состоят из 4-х цифр. Так же такая задача будет интересна тем, у кого есть несколько VoIP операторов, которые передают по разному входящие CallerID. Например, оператор А присылает CallerID в формате 7XXXXXXXXXX, а оператор Б присылает CallerID в формате +7XXXXXXXXXX или 8XXXXXXXXXX. Для красоты отображения на телефонах, необходимо привести номера к одному стандарту.

На сайте FreePBX есть статья, о том как изменить входящий CallerID, но реализовать функционал у нас не получилось. Если говорить о "голом" Asterisk, то там все просто, делаем несколько масок в контексте и отправляем вызов дальше по правилу. Ниже пример обработки контекста "из удаленного офиса". Т.е. в первой строке мы удаляем три первых символа CallerID и далее делаем маршрутизацию вызова.

[from-external-office]
exten => _010XXXX,1,Set(CALLERID(num)=${CALLERID(num):3})
exten => _010XXXX,n,Dial(SIP/1010)

Но в FreePBX 12, такой сценарий работать не будет, т.к. в FreePBX достаточно сложная система контекстов и не во всякий контекст можно внести изменения.

Предположим, у нас есть транк до нашего удаленного офиса, через Web-интерфейс мы настроили FreePBX, оборудование зарегистрировалось на АТС, вызовы проходят. Теперь необходимо изменить CallerID. По логике, как и "голом" Asterisk нам необходимо изменить "входящий" контекст от транка (название транка в нашем случае External-office). Посмотрим, какой контекст создает FreePBX для данного транка. В файле extensions_additional.conf мы видим следующее:

[from-trunk-sip-external-office]
include => from-trunk-sip-external-office-custom
exten => _.,1,Set(GROUP()=OUT_2)
exten => _.,n,Goto(from-trunk,${EXTEN},1)

Но редактировать файл extensions_additional.conf нельзя, т.к. после перезагрузки FreePBX все настройки слетят. Как говорится в статье, с официального сайта FreePBX, необходимо создать Custom Context. Т.е. по сути все понятно, создаем свой собственный контекст в файле extensions_custom.conf, называем его from-trunk-sip-external-office-custom и прописываем в нем тоже, что и для "голого" Asterisk. Но когда все это сделано и вроде бы сделано правильно. Работать ничего не будет. Почему? Заходим в CLI Asterisk и выполняем команды:

[root@centos fbx]#rasterisk
centos*CLI> dialplan show from-trunk-sip-external-office
[ Context 'from-trunk-sip-external-office' created by 'pbx_config' ]
'_.' => 1. Set(GROUP()=OUT_2) [pbx_config]
2. Goto(from-trunk,${EXTEN},1) [pbx_config]
Include => 'from-trunk-sip-external-office-custom' [pbx_config]

-= 1 extension (2 priorities) in 1 context. =-

Т.е. вначале выполняются екстеншены, а только потом наш созданный контекст from-trunk-sip-external-offiсe-custom. В контексте from-trunk-sip-external-offiсe видим, что дальше он переводит вызов в контекст from-trunk (строка Goto(from-trunk,${EXTEN},1)). Описание контекста

from-trunk находится в файле extensions.conf. Ниже приведен пример файла extensions.conf.
;-------------------------------------------------------------------------------
; from-trunk:
;
; Context is really just an aliax of from-pstn
;
[from-trunk]
include => from-pstn
;-------------------------------------------------------------------------------

;-------------------------------------------------------------------------------
; from-pstn:
;
; Entry context for calls from the outside world to hit FreePBX
[from-pstn]
include => from-pstn-custom ; create this context in extensions_custom.conf to include customizations
include => ext-did
include => ext-did-post-custom
include => from-did-direct
include => ext-did-catchall ; THIS MUST COME AFTER ext-did
;-------------------------------------------------------------------------------

Видим, что контекст from-trunk далее переводит вызов в контекст from-pstn (строка include => from-pstn). В этом контексте мы видим заветное слово "custom" (строка include => from-pstn-custom). Т.е. в файле extensions_custom.conf нам необходимо создать свой собственный контекст from-pstn-custom. Для этого через текстовый редактор правим файл /etc/asterisk/extensions_custom.conf

[root@centos fbx]#nano /etc/asterisk/extensions_custom.conf

Там необходимо прописать следующее:

[from-pstn-custom]
exten => _X.,1,ExecIF($[${VALID_EXTEN(010-cid,${CALLERID(num)})}]?Gosub(010-cid,${CALLERID(num)},1))

[010-cid]
exten => _010XXXX,1,Set(CALLERID(num)=${CALLERID(num):3})
exten => _010XXXX,n,Set(CALLERID(ANI-all)=${CALLERID(num)})
exten => _010XXXX,n,Return()
exten => _X.,1,Set(CALLERID(num)=${CALLERID(num)})
exten => _X.,n,Set(CALLERID(ANI-all)=${CALLERID(num)})
exten => _X.,n,Return()

Некоторые пояснения по работе. Мы берем весь входящий поток CallerID и проверяем, соответствует ли он правилу: 7-цифр и начинается ли он с 010. Если да, то мы удаляем первые три цифры и возвращаемся в сценарий. Если нет, то оставляем CallerID в изначальном виде и возвращаемся в сценарий.

Строка "exten => _010XXXX,n,Set(CALLERID(ANI-all)=${CALLERID(num)})" необходима для изменения CallerID в CDR отчетах. Теперь об используемых операторах:

  • ExecIF - Выполнение программы по заданному условию
  • Valid_Exten - Функция проверяет существование заданного екстеншена
  • Set - Установка значения (или значений) переменной канала или функции
  • Gosub - Перейти к выполнению подпрограммы и вернуться
  • Return - Возврат из подпрограммы, выполненной по команде Gosub

Далее, согласно файлу extensions.conf, будет отрабатываться контекст ext-did, но это нас уже не интересует.

 

Если вы в статье нашли ошибки или несоответствия, мы будем благодарны, если вы напишите нам о них в комментариях.

 
Powered by SEO CMS ver.: 23.1 TOP 2 (opencartadmin.com)
 
Метки: CallerID, Asterisk, FreePBX