Звонок в Asterisk через 8, +7 или 7, замена +7 на 8

В последнее время несколько раз ко мне обращались с просьбой настроить возможность звонить в asterisk не только через 8, но и используя префикс 7 или +7. Чаще всего такая просьба связана с использованием sip клиентов на мобильных телефонах, где часто в записной книге номера записаны через +7. Но при этом некоторые sip провайдеры принимают звонки только начинающиеся с 8, либо только с 7. В таком случае нам нужно самим настроить замену 7 на 8 в астериск или наоборот.

Онлайн-курс по устройству компьютерных сетей

На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Я возьму за основу dialplan из моей статьи про настройку asterisk. Но в целом это не принципиально, вы легко сможете изменить нужные строки и подстроить под свой план набора. Главное - понять смысл.

Вы звоните в мир по следующему правилу:

exten => _XXX.,1,Dial(SIP/${EXTEN}@397945)

Если ваш провайдер принимает звонки в любых форматах, то вам ничего редактировать не надо. Маска XXX. допускает любой набор - 8, 7 или +7. Но часто бывает так, что провайдер принимает только один конкретный тип набора, а на остальные отвечает, что неправильно набран номер или просто не звонит. В таком случае нам нужно сделать замену неправильного набора на правильный у себя в астериске. Делается это так:

exten => _8XX.,1,Dial(SIP/${EXTEN}@397945)
exten => _7XX.,1,Dial(SIP/8${EXTEN:1}@397945)
exten => _+7X.,1,Dial(SIP/8${EXTEN:2}@397945)

Первой строкой мы звоним без изменения номера. Во второй строке мы убираем первый символ и добавляем в начало 8. В третьей - убираем 2 первых символа и добавляем 8.

Если вам необходимо наоборот, заменить в астериск 8 на 7, то можно воспользоваться такими правилами:

exten => _8XX.,1,Dial(SIP/7${EXTEN:1}@397945)
exten => _7XX.,1,Dial(SIP/${EXTEN}@397945)
exten => _+7X.,1,Dial(SIP/${EXTEN:1}@397945)

В первом случае заменяем 8 на 7, во втором ничего не делаем, в третьем просто убираем +.

Для отладки и тестирования работы voip я рекомендую сервис Zadarma. Плюс его в том, что после регистрации вы получите настройки пира для внутренней сети оператора. И внутри этой сети вы можете бесплатно звонить. Например, я одного пира регистрирую на sip клиенте смартфона и с него звоню на второй аккаунт, пир от которого настроен в астериске. Таким образом эмулирую внешний звонок. Удобно отлаживать различные конфигурации звонков, не требуя платного подключения.

Другие материалы по asterisk:

Углубленный онлайн-курс по MikroTik.

Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.

Помогла статья? Подписывайся на telegram канал автора

Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.

Автор Zerox

Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству. Если вам интересно узнать обо мне побольше, то можете послушать интервью. Запись на моем канале - https://t.me/srv_admin/425 или на сайте в контактах.

25 комментариев

  1. Вячеслав

    Может это не совсем в тему, но может кому пригодится
    При входящем звонке я делаю примерно так:

    [from-pstn-custom]
    exten => _X.,1,GoSub(sub-pstn-custom,s,1(${EXTEN}))

    [sub-pstn-custom]
    exten => s,1,NoOp(--- Incoming ring from number "${CALLERID(num)}" ---)
    same => n,NoOp(--- Redirection number "${CALLERID(RDNIS)}" ---)
    same => n,NoOp(--- Dialed number "${CALLERID(DNID)}" ---)
    ;Повторяем первую строку [from-trunk]
    same => n,Set(__DIRECTION=INBOUND)
    ; Проверяем формат номера
    same => n,SET(CIDLEN=${LEN(${CALLERID(num)})})
    same => n,Goto(s,fix${CIDLEN})
    same => n,Return()
    ; меняем +7 на 8
    same => n(fix12),NoOp(${CALLERID(num):0:2})
    same => n,ExecIf($["${CALLERID(num):0:2}" = "+7" ])?Set(CALLERID(num)=8${CALLERID(num):-10}))
    same => n,NoOp(--- Replaced number "${CALLERID(num)}" ---)
    same => n,Return()
    ; добавляем 8
    same => n(fix10),NoOp(${CALLERID(num)})
    same => n,Set(CALLERID(num)=8${CALLERID(num)}))
    same => n,NoOp(--- Replaced number "${CALLERID(num)}" ---)
    same => n,Return()
    ; меняем 7 на 8
    same => n(fix11),NoOp(${CALLERID(num):0:2})
    same => n,ExecIf($["${CALLERID(num):0:1}" = "7" ])?Set(CALLERID(num)=8${CALLERID(num):1}))
    same => n,NoOp(--- Replaced number "${CALLERID(num)}" ---)
    same => n,Return()

  2. добрый день , не совсем понимаю как настроить dial plan на телефонах grandstream.

    Нужно, чтобы при наборе кода 114( код доступа на внешние звонки, не предприятие), мог звонить на сотовые и меж город. Например

    114-(82144) 2-66-66 город ( без кода города звонок проходит)

    или

    114-8-917 хх-хх-ххх

    В данный момент при наборе голосовое оповещение"не правильно набран номер"

    Спасибо!

  3. Коллега, доброе время суток, в не подскажете по такому вопросу - все подмены прописал, все работает хорошо. Но с одним не могу разобраться как можно прописать так, чтобы при звонке с одного добавочного ( например 333, только с него ) при наборе остальных 3ех значных добавочных перед номером добавлялся 1 знак 9 ( например вместо 332 набиралось 9332 ) Со всех остальных номеров набор должен быть обычным трехзначным. Нужно для хитрой переадресации только с этого номера и в АТС занесены оба типа номеров. Облазил Custom Context... А вот как это через диалплан сделать не пойму... Заранее спасибо и простите за туповатый вопрос...

    • Не вижу тут никакой проблемы. Пишите правило добавления цифры в диалплане для номера 333 выше правила для остальных 3хх номеров. И все. Dialplan по порядку читается. Как только номер 333 попадает под правило, оно выполняется. Остальные номера 3хх будут обрабатываться следующим правилом.

      • Я понимаю. У меня в голове затык именно с добавлением, как в данном случае оно выглядит? Третьи сутки настройки вынули из головы тривиальные знания...

      • Немного выспавшись и почитав, понял, что надо примерно так -

        exten => _XXX,n,Set(CALLERID(num)=9${EXTEN})

        Но вот остался момент, в PBX при редактировании extensions_custom.conf он тупо игнорирует эту строку.

      • Все, решил))
        exten => _XXX,1,Set(CALLERID(num)=9${CALLERID(num)})
        exten => _XXX,2,Goto(9${EXTEN},1)

        Теперь осталось привязаться его в одному добавочному!

        • Сделать надо так:
          1. Для номера 333 в настройках пира указать отдельный контекст, куда скопировать все настройки для остальных номеров 3хх, заменив только значение context.

          [333]
          context=call-from-333

          2. В dialplan добавить новый контекст, в самом начале написать правило добавление цифры при звонке на номера 3хх

          [call-from-333]
          exten => _3XX,1,Dial(SIP/9${EXTEN}@397945)
          Примерно так, настройки зависят от вашей конфигурации.

          Дальше все настройки как для остальных трехсотых. И все.

          • Да! Спасибо. Уже начал писать отдельный контекст как раз!

          • А чем отличается
            [call-from-333]
            exten => _3XX,1,Dial(SIP/9${EXTEN}@397945)
            от моих двух строк?

            • Всем :) У тебя caller id в первой строке заменяется. Не знаю, насколько это актуально для тебя. Во второй строке идет ссылка куда-то, скорее всего на dial. То есть в таком виде это не законченная настройка, должна быть еще строка с самим звонком.

              Я же просто привел пример конкретно звонка с изменением номера.

  4. Александр

    Правильно это делается вот так:
    exten => _+7xxxxxxxxxx,1,GoTo(8${EXTEN:2},1)
    exten => _7xxxxxxxxxx,1,GoTo(8${EXTEN:1},1)
    exten => _8xxxxxxxxxx,1,Dial(${EXTEN},,)

    Это если провайдер хочет только с 8 принимать вызовы.

    • Чем это лучше того, что предложено в статье? Я еще со времен института и изучения c++ усвоил, что goto лучше не использовать, если можно не использовать. Сейчас даже не помню, почему.

      • Александр

        Тем, что не нужно прописывать Dial для каждого префикса. Единый Dial

        • Понял смысл. Сразу не уловил. В общем случае так действительно удобнее, хотя и не критично.

    • На одну строчку меньше.
      exten = _+7XXXXXXXXXX,1,Goto(${EXTEN:2},1)
      exten = _[78]XXXXXXXXXX,1,Goto(${EXTEN:1},1)
      exten = _XXXXXXXXXX,1,Dial(SIP/SERVER/8${EXTEN},30)

  5. Добрый день, спасибо еще раз за все статьи.. У меня провайдер предлагает внешний набор номера через 08495...
    Врятли это для кого то станет открытием, но чтобы убрать ноль в моём случае, у меня два правила звонка на внешние номера.
    exten => _8XX.,1,Dial(SIP/08${EXTEN:1}@21116)
    exten => _XXX.,1,Dial(SIP/${EXTEN}@21116)

  6. Здравствуйте, а как допустим подставить для городских номеров префикс из кода города? Что бы народ мог набирать короткие городские номера без 7 ??

  7. Да действительно, работает. Спасибо!

  8. Мне нужен выход через 8 получается я оставляю одну строку
    exten => _7XX.,1,Dial(SIP/8${EXTEN:1}@896145)

    • "то нормально звонит на внешний номер но только ч\з 7 Не пойму где я накосячил."
      Из этой строки я делаю вывод, что провайдеру нужно отдавать номер с 7 в начале. Соответственно и все правила должны настроены на 7. То есть должно быть вот так:
      exten => _8XX.,1,Dial(SIP/7${EXTEN:1}@896145)
      exten => _7XX.,1,Dial(SIP/${EXTEN}@896145)
      exten => _+7X.,1,Dial(SIP/${EXTEN:1}@896145)

  9. Добавил себе в dialplan следующие строки:

    ;Звонок на внешний номер

    exten => _XXX.,1,Dial(SIP/${EXTEN}@896145)
    exten => _8XX.,1,Dial(SIP/${EXTEN}@896145)
    exten => _7XX.,1,Dial(SIP/8${EXTEN:1}@896145)
    exten => _+7X.,1,Dial(SIP/8${EXTEN:2}@896145)

    Говорит что направление не существует, без разница ч\з 7 или 8 набирать номер. Когда оставляю одну строку:
    exten => _XXX.,1,Dial(SIP/${EXTEN}@896145)

    то нормально звонит на внешний номер но только ч\з 7 Не пойму где я накосячил.

    • Так вам надо менять на 7 в начале, а вы в диалплане все меняете на 8. Надо наоборот менять 8 на 7.

  10. Доброе.
    Попробуйте freepbx - http://schmoozecom.com/distro-download.php Отличное готовое решение.

    P.s. 13 Asterix - LTS . Рекомендую исп-ть его во freepbx.

    • С freepbx я хорошо знаком, но сам предпочитаю ванильный астериск. Мне с ним быстрее и проще.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.
Используешь Telegram? Подпишись на канал автора →
This is default text for notification bar