Voipnotes
Услуги
  • 3CX Phone System
    • Купить IP АТС - 3CX Phone System
Ещё
    Задать вопрос
    +7 (499) 113-65-73
    Заказать звонок
    sale@voipnotes.ru
    г. Москва 2-й Михайловский проезд 9
    +7 (499) 113-65-73
    Заказать звонок
    Voipnotes
    Услуги
    • 3CX Phone System
      • Купить IP АТС - 3CX Phone System
      Voipnotes
      Услуги
      • 3CX Phone System
        • Купить IP АТС - 3CX Phone System
        Voipnotes
        Voipnotes
        • Услуги
          • Назад
          • Услуги
          • 3CX Phone System
            • Назад
            • 3CX Phone System
            • Купить IP АТС - 3CX Phone System
        • +7 (499) 113-65-73
        sale@voipnotes.ru
        г. Москва 2-й Михайловский проезд 9
        • Главная
        • Блог
        • Изменение входящего CallerID в Asterisk (FreePBX)

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

        Изменение входящего CallerID в Asterisk (FreePBX)
        3 Декабря 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, но это нас уже не интересует.

         

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

        Нужна консультация?

        Наши специалисты ответят на любой интересующий вопрос

        Задать вопрос
        Поделиться
        Назад к списку
        © 2021 Все права защищены.
        +7 (499) 113-65-73
        Заказать звонок
        sale@voipnotes.ru
        г. Москва 2-й Михайловский проезд 9
        Политика конфиденциальности
        Версия для печати
        © 2021 Все права защищены.
        Заказать звонок
        Написать сообщение