В Интернете довольно много примеров настройки. Но ни один из них у меня не заработал как надо. Одной из проблем с которой я столкнулся было неправильное определение линии при входящем звонке. В свое время нигде не нашел мануал для решения этой проблемы. Поэтому решил выложить свою версию инструкции здесь. Заодно и шпаргалка для себя на будущее.
GSM шлюз находится в локальной сети без доступа в Интернет. Настроим NTP сервер в локальной сети для раздачи времени. При перезагрузке GSM шлюз синхронизируется и правильно показывает текущее время. Можете пропустить этот шаг, тогда придется вручную выставлять время на шлюзе. Если есть выход в Интернет, то укажите один из публичных NTP серверов.
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)
То же самое проделываем с остальными линиями.
Для каждой линии указываем префикс, который приходит с Asterisk и будет удалятся на канале шлюза перед совершением исходящего звонка: например для для CH1 Dial Plan: 1:-1, CH2 Dial Plan: 2:-2 и т.д.
В инструкциях по настройке рекомендуют для CID Forward Mode: выбрать Use CID as SIP Caller ID для правильного определения входящего номера. У меня выбрано Use Remote Party Id. Это было сделано для правильного определения линии, с которой пришел вызов. Входящий номер определяется правильно.
На этом закончили настройку GoIP.
Выбираем «Добавить SIP (chan_sip) транк».
Прописываем шаблоны. Указываем префиксы для каждого транка по порядку. Для первой линии 1, для второй 2 и т.д.
У Астериска для нескольких учетных записей использует один и тот же порт. Это создает проблему при определении линии с которой пришел вызов. При входящем звонке всегда используется последний зарегистрированный пир и как следствие неправильно определяется линия на GoIP с которой пришел вызов. Для правильного определения линии, на GoIP был выбран режим Use Remote Party Id, а на Астриске trustrpid=yes.
Далее создадим внутренние номера и группу вызова. Как это делается описывать не буду. В FreePBX это делается через меню «Приложения» — «Внутренние номера» и «Приложения» — «Группы вызова». Все довольно просто и интуитивно понятно.
Выбираем «Добавить исходящий маршрут».
Укажем название маршрута, например all_line. Далее укажем по порядку транки через которые будут совершаться исходящие вызовы.
Здесь прописываем шаблоны для исходящих номеров.
Остальные вкладки оставляем по умолчанию. На этом настройка исходящего маршрута завершена. Можно попробовать совершить вызов.
Здесь может возникнуть проблема, что звонки будут уходить через транки в том порядке, в каком они указаны в маршруте. Что в свою очередь приведет к тому, что единицы на первых линиях будут уходить больше чем на тех, которые идут за ними. Для решения этой задачи можно переписать правила для исходящего маршрута с помощью extensions_override_freepbx.conf.
В зависимости от количества линии, можно использовать рандом. Для двух линии например 1,2. Я использую такой код
Добавить входящий маршрут.
Указываем его описание, например — «inbound».
Далее выбираем последний пункт «Установить направление», в котором выбираем конечную точку маршрута. В моем случае я указал группу вызова чтобы звонки поступали любому свободному оператору.
На самом деле у меня более сложная логика. С помощью AGI скрипта входящий номер ищу в базе данных, если нашел, то отправлю его оператору за которым он закреплен. До поступления звонка на sip клиент через jabber отправляю сообщение оператору с информацией о клиенте. Если номер не найден в базе, то звонок поступает в группу.
На этом настройка завершена. Можно пробовать звонить и принимать звонки.
Многие не любят настраивать FreePBX, а ставят голый Астериск. У меня был нулевой опыт работы с IP-телефонией, поэтому в свое время выбор пал на FreePBX. Проблем с правкой конфигов у меня не возникло. Любые изменения можно внести с помощью конфиг файлов extensions_custom.conf и extensions_override_freepbx.conf. Разобраться не так уж и сложно. У нас небольшой колл-центр. GoIP показал себя с лучшей стороны. Единственное не устроил их родной смс сервер. Поэтому был написан свой собственный, который поддерживает отправку и прием смс сообщении, а также показывает статус доставки смс. У нас получился полноценный заменитель телефона.
В качестве sip клиента используем веб телефон написанный на основе JsSip бибилиотеки, отлично работает в Firefox 68 и Chrome 76. Если будет время напишу более подробную инструкцию по применению JsSip библиотеки. А также отдельную статью по созданию своего смс сервера.
Настройка GoIP
«Configurations» — «Preferences»
GSM шлюз находится в локальной сети без доступа в Интернет. Настроим NTP сервер в локальной сети для раздачи времени. При перезагрузке GSM шлюз синхронизируется и правильно показывает текущее время. Можете пропустить этот шаг, тогда придется вручную выставлять время на шлюзе. Если есть выход в Интернет, то укажите один из публичных NTP серверов.
- В Time Server пропишем IP адрес NTP сервера.
- Укажем часовой пояс, у меня Time Zone: GMT+6.
- Отключим Auto Reboot. С последней версией прошивки проблемы с зависанием GSM шлюза не наблюдаются.
- Отключим IVR.
«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
То же самое проделываем с остальными линиями.
«Configurations» — «Advance VoIP»
«Configurations» — «Call Out»
Для каждой линии указываем префикс, который приходит с Asterisk и будет удалятся на канале шлюза перед совершением исходящего звонка: например для для CH1 Dial Plan: 1:-1, CH2 Dial Plan: 2:-2 и т.д.
Dial Plan: 1:-1
«Configurations» — «Call In»
В инструкциях по настройке рекомендуют для CID Forward Mode: выбрать Use CID as SIP Caller ID для правильного определения входящего номера. У меня выбрано Use Remote Party Id. Это было сделано для правильного определения линии, с которой пришел вызов. Входящий номер определяется правильно.
На этом закончили настройку GoIP.
Настройка FreePBX 14
«Подключения» — «Транки»
Выбираем «Добавить SIP (chan_sip) транк».
Вкладка «Общие»
Переходим на вкладку «Правила манипуляции набора номера»
Прописываем шаблоны. Указываем префиксы для каждого транка по порядку. Для первой линии 1, для второй 2 и т.д.
Вкладка «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
Входящий
in-9651234567
secret=Djfgkjgfd!!!!234%$^%#
type=user
context=from-trunk-sip-9651234567-custom
Далее создадим внутренние номера и группу вызова. Как это делается описывать не буду. В FreePBX это делается через меню «Приложения» — «Внутренние номера» и «Приложения» — «Группы вызова». Все довольно просто и интуитивно понятно.
«Подключения» — «Исходящая маршрутизация»
Выбираем «Добавить исходящий маршрут».
Вкладка «Настройки маршрута»
Укажем название маршрута, например all_line. Далее укажем по порядку транки через которые будут совершаться исходящие вызовы.
Переходим на вкладку «Правила набора»
Здесь прописываем шаблоны для исходящих номеров.
Остальные вкладки оставляем по умолчанию. На этом настройка исходящего маршрута завершена. Можно попробовать совершить вызов.
Здесь может возникнуть проблема, что звонки будут уходить через транки в том порядке, в каком они указаны в маршруте. Что в свою очередь приведет к тому, что единицы на первых линиях будут уходить больше чем на тех, которые идут за ними. Для решения этой задачи можно переписать правила для исходящего маршрута с помощью 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 отправляю сообщение оператору с информацией о клиенте. Если номер не найден в базе, то звонок поступает в группу.
На этом настройка завершена. Можно пробовать звонить и принимать звонки.
Заключение
Многие не любят настраивать FreePBX, а ставят голый Астериск. У меня был нулевой опыт работы с IP-телефонией, поэтому в свое время выбор пал на FreePBX. Проблем с правкой конфигов у меня не возникло. Любые изменения можно внести с помощью конфиг файлов extensions_custom.conf и extensions_override_freepbx.conf. Разобраться не так уж и сложно. У нас небольшой колл-центр. GoIP показал себя с лучшей стороны. Единственное не устроил их родной смс сервер. Поэтому был написан свой собственный, который поддерживает отправку и прием смс сообщении, а также показывает статус доставки смс. У нас получился полноценный заменитель телефона.
В качестве sip клиента используем веб телефон написанный на основе JsSip бибилиотеки, отлично работает в Firefox 68 и Chrome 76. Если будет время напишу более подробную инструкцию по применению JsSip библиотеки. А также отдельную статью по созданию своего смс сервера.