В Интернете довольно много примеров настройки. Но ни один из них у меня не заработал как надо. Одной из проблем с которой я столкнулся было неправильное определение линии при входящем звонке. В свое время нигде не нашел мануал для решения этой проблемы. Поэтому решил выложить свою версию инструкции здесь. Заодно и шпаргалка для себя на будущее.

Настройка GoIP


«Configurations» — «Preferences»


GSM шлюз находится в локальной сети без доступа в Интернет. Настроим NTP сервер в локальной сети для раздачи времени. При перезагрузке GSM шлюз синхронизируется и правильно показывает текущее время. Можете пропустить этот шаг, тогда придется вручную выставлять время на шлюзе. Если есть выход в Интернет, то укажите один из публичных NTP серверов.

  • В Time Server пропишем IP адрес NTP сервера.
  • Укажем часовой пояс, у меня Time Zone: GMT+6.
  • Отключим Auto Reboot. С последней версией прошивки проблемы с зависанием GSM шлюза не наблюдаются.
  • Отключим IVR.

image

«Configurations» — «Network»


  • LAN Port — Static IP
  • IP address — укажем статический IP адрес шлюза

«Configurations» — «Basic VoIP»


Config Mode — Config by Line.

Для первого канала где «Line 1 Routing Prefix» укажем 1, для второго 2, третьего 3 и т.д.
Authentication ID: прописываем номер сим карты (у меня прописаны без 8/+7), например 9651234567
SIP Registrar Server: IP адрес SIP сервера (192.168.0.10)

    Line 1
    Authentication ID: 9651234567
    Password: пароль
    Routing Prefix: 1
    Sip Proxy: 
    SIP Registrar Server: 192.168.0.10:5160
    Phone Nymber: 9651234567
    Display Name: 9651234567

То же самое проделываем с остальными линиями.

image

«Configurations» — «Advance VoIP»


image

«Configurations» — «Call Out»


Для каждой линии указываем префикс, который приходит с Asterisk и будет удалятся на канале шлюза перед совершением исходящего звонка: например для для CH1 Dial Plan: 1:-1, CH2 Dial Plan: 2:-2 и т.д.

   Dial Plan: 1:-1

image

«Configurations» — «Call In»


В инструкциях по настройке рекомендуют для CID Forward Mode: выбрать Use CID as SIP Caller ID для правильного определения входящего номера. У меня выбрано Use Remote Party Id. Это было сделано для правильного определения линии, с которой пришел вызов. Входящий номер определяется правильно.

image

На этом закончили настройку GoIP.

Настройка FreePBX 14


«Подключения» — «Транки»


Выбираем «Добавить SIP (chan_sip) транк».

Вкладка «Общие»


image

Переходим на вкладку «Правила манипуляции набора номера»


Прописываем шаблоны. Указываем префиксы для каждого транка по порядку. Для первой линии 1, для второй 2 и т.д.

image

Вкладка «sip Общие настройки»


Исходящий

У Астериска для нескольких учетных записей использует один и тот же порт. Это создает проблему при определении линии с которой пришел вызов. При входящем звонке всегда используется последний зарегистрированный пир и как следствие неправильно определяется линия на GoIP с которой пришел вызов. Для правильного определения линии, на GoIP был выбран режим Use Remote Party Id, а на Астриске trustrpid=yes.

host=dynamic
username=7712020077
secret=Djfgkjgfd!!!!234%$^%#
type=friend
context=from-trunk-sip-9651234567-custom
trustrpid=yes

image

Входящий

in-9651234567

secret=Djfgkjgfd!!!!234%$^%#
type=user
context=from-trunk-sip-9651234567-custom

image

Далее создадим внутренние номера и группу вызова. Как это делается описывать не буду. В FreePBX это делается через меню «Приложения» — «Внутренние номера» и «Приложения» — «Группы вызова». Все довольно просто и интуитивно понятно.

«Подключения» — «Исходящая маршрутизация»


Выбираем «Добавить исходящий маршрут».

Вкладка «Настройки маршрута»


Укажем название маршрута, например all_line. Далее укажем по порядку транки через которые будут совершаться исходящие вызовы.

image

Переходим на вкладку «Правила набора»


Здесь прописываем шаблоны для исходящих номеров.

image

Остальные вкладки оставляем по умолчанию. На этом настройка исходящего маршрута завершена. Можно попробовать совершить вызов.

Здесь может возникнуть проблема, что звонки будут уходить через транки в том порядке, в каком они указаны в маршруте. Что в свою очередь приведет к тому, что единицы на первых линиях будут уходить больше чем на тех, которые идут за ними. Для решения этой задачи можно переписать правила для исходящего маршрута с помощью extensions_override_freepbx.conf.

В зависимости от количества линии, можно использовать рандом. Для двух линии например 1,2. Я использую такой код

    [outrt-sets](!)
    exten => _.,50,Set(a_rand_num=${RAND(1,2)});
        same => n,GotoIf($["${a_rand_num}"<"2"]?${n}+1:${n}+2)
        same => n,GotoIf($["${GROUP_COUNT(OUT_1)}">="${OUTMAXCHANS_1}"]?${n}+1:out-1-cust)
        ...

    [outrt](outrt-sets) ; all_line
        exten => _+7XXXXXXXXXX,3,Goto(50)
        exten => _8XXXXXXXXXX,3,Goto(50)

«Подключения» — «Входящая маршрутизация»


Добавить входящий маршрут.

Вкладка «Общие»


Указываем его описание, например — «inbound».

Далее выбираем последний пункт «Установить направление», в котором выбираем конечную точку маршрута. В моем случае я указал группу вызова чтобы звонки поступали любому свободному оператору.

На самом деле у меня более сложная логика. С помощью AGI скрипта входящий номер ищу в базе данных, если нашел, то отправлю его оператору за которым он закреплен. До поступления звонка на sip клиент через jabber отправляю сообщение оператору с информацией о клиенте. Если номер не найден в базе, то звонок поступает в группу.

image

На этом настройка завершена. Можно пробовать звонить и принимать звонки.

Заключение


Многие не любят настраивать FreePBX, а ставят голый Астериск. У меня был нулевой опыт работы с IP-телефонией, поэтому в свое время выбор пал на FreePBX. Проблем с правкой конфигов у меня не возникло. Любые изменения можно внести с помощью конфиг файлов extensions_custom.conf и extensions_override_freepbx.conf. Разобраться не так уж и сложно. У нас небольшой колл-центр. GoIP показал себя с лучшей стороны. Единственное не устроил их родной смс сервер. Поэтому был написан свой собственный, который поддерживает отправку и прием смс сообщении, а также показывает статус доставки смс. У нас получился полноценный заменитель телефона.
В качестве sip клиента используем веб телефон написанный на основе JsSip бибилиотеки, отлично работает в Firefox 68 и Chrome 76. Если будет время напишу более подробную инструкцию по применению JsSip библиотеки. А также отдельную статью по созданию своего смс сервера.

Комментарии (1)


  1. Ovoshlook
    24.08.2019 09:31

    Один порт у asterisk к проблеме определения входящего вызова не имеет никакого отношения: проблема в том что, если девайс в sip.conf описан как friend, а в поле from приходит source number того, кто звонит вместо имени девайса, который написан в [...] в sip.conf то asterisk будет соотносить входящие по IP:PORT с которого прилетел звонок, а так как у GoIP в вашем случае он один и тот же для всех — asterisk отождествит входящий с первой попавшейся линией.

    В Вашем случае вы просто передаете номер звонящего в Remote-Party-ID хедере и asterisk его оттуда читает.

    На самом деле самое простое решение вашей проблемы — изменить в advanced voip настройку порта Для каждой линии. То есть линию 1 повесить на порт 5060, линию 2 — на порт 5061 и т.д. А на asterisk использовать тип peer, так как авторизация вам тут не нужна вообще, а goip на сколько я помню умеет работать в режиме IP2IP.

    Ну и 2 девайса (in и out ) в настройке asterisk — тоже лишнее.