В Интернете довольно много примеров настройки. Но ни один из них у меня не заработал как надо. Одной из проблем с которой я столкнулся было неправильное определение линии при входящем звонке. В свое время нигде не нашел мануал для решения этой проблемы. Поэтому решил выложить свою версию инструкции здесь. Заодно и шпаргалка для себя на будущее.
GSM шлюз находится в локальной сети без доступа в Интернет. Настроим NTP сервер в локальной сети для раздачи времени. При перезагрузке GSM шлюз синхронизируется и правильно показывает текущее время. Можете пропустить этот шаг, тогда придется вручную выставлять время на шлюзе. Если есть выход в Интернет, то укажите один из публичных NTP серверов.
![image](https://habrastorage.org/webt/6a/kc/6x/6akc6xubnik10uyesyyeuetrcuw.jpeg)
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)
То же самое проделываем с остальными линиями.
![image](https://habrastorage.org/webt/8s/8y/p3/8s8yp3ly8kpzcuffvvhgqucc6aa.jpeg)
![image](https://habrastorage.org/webt/uw/b8/2n/uwb82nunhvrxbbgxifnaa1l3dyu.jpeg)
Для каждой линии указываем префикс, который приходит с Asterisk и будет удалятся на канале шлюза перед совершением исходящего звонка: например для для CH1 Dial Plan: 1:-1, CH2 Dial Plan: 2:-2 и т.д.
![image](https://habrastorage.org/webt/cj/rg/yn/cjrgynmpqsmux0-esqf-rfw2wxq.jpeg)
В инструкциях по настройке рекомендуют для CID Forward Mode: выбрать Use CID as SIP Caller ID для правильного определения входящего номера. У меня выбрано Use Remote Party Id. Это было сделано для правильного определения линии, с которой пришел вызов. Входящий номер определяется правильно.
![image](https://habrastorage.org/webt/zy/a2/os/zya2oswrpqr_jbrbwpssb14-vcs.jpeg)
На этом закончили настройку GoIP.
Выбираем «Добавить SIP (chan_sip) транк».
![image](https://habrastorage.org/webt/rb/if/yp/rbifypqzucee2g2cflhi0ha3_oe.jpeg)
Прописываем шаблоны. Указываем префиксы для каждого транка по порядку. Для первой линии 1, для второй 2 и т.д.
![image](https://habrastorage.org/webt/ud/eq/x1/udeqx164u6kx3a3rk5jx5yidw8c.jpeg)
У Астериска для нескольких учетных записей использует один и тот же порт. Это создает проблему при определении линии с которой пришел вызов. При входящем звонке всегда используется последний зарегистрированный пир и как следствие неправильно определяется линия на GoIP с которой пришел вызов. Для правильного определения линии, на GoIP был выбран режим Use Remote Party Id, а на Астриске trustrpid=yes.
![image](https://habrastorage.org/webt/o2/0m/9j/o20m9jyzsotrxn8osqkmarw8pzc.jpeg)
![image](https://habrastorage.org/webt/2b/-l/us/2b-lusewyxlogecbsayvgynlch0.jpeg)
Далее создадим внутренние номера и группу вызова. Как это делается описывать не буду. В FreePBX это делается через меню «Приложения» — «Внутренние номера» и «Приложения» — «Группы вызова». Все довольно просто и интуитивно понятно.
Выбираем «Добавить исходящий маршрут».
Укажем название маршрута, например all_line. Далее укажем по порядку транки через которые будут совершаться исходящие вызовы.
![image](https://habrastorage.org/webt/ut/o3/sa/uto3sahdz0fsnutbjp6ddjzsroc.jpeg)
Здесь прописываем шаблоны для исходящих номеров.
![image](https://habrastorage.org/webt/bi/gl/os/biglos628mkrb_b1vh1ge4vfmww.jpeg)
Остальные вкладки оставляем по умолчанию. На этом настройка исходящего маршрута завершена. Можно попробовать совершить вызов.
Здесь может возникнуть проблема, что звонки будут уходить через транки в том порядке, в каком они указаны в маршруте. Что в свою очередь приведет к тому, что единицы на первых линиях будут уходить больше чем на тех, которые идут за ними. Для решения этой задачи можно переписать правила для исходящего маршрута с помощью extensions_override_freepbx.conf.
В зависимости от количества линии, можно использовать рандом. Для двух линии например 1,2. Я использую такой код
Добавить входящий маршрут.
Указываем его описание, например — «inbound».
Далее выбираем последний пункт «Установить направление», в котором выбираем конечную точку маршрута. В моем случае я указал группу вызова чтобы звонки поступали любому свободному оператору.
На самом деле у меня более сложная логика. С помощью AGI скрипта входящий номер ищу в базе данных, если нашел, то отправлю его оператору за которым он закреплен. До поступления звонка на sip клиент через jabber отправляю сообщение оператору с информацией о клиенте. Если номер не найден в базе, то звонок поступает в группу.
![image](https://habrastorage.org/webt/um/ni/h7/umnih7qnfkwjgqwvxj7tcurrzga.jpeg)
На этом настройка завершена. Можно пробовать звонить и принимать звонки.
Многие не любят настраивать 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.
![image](https://habrastorage.org/webt/6a/kc/6x/6akc6xubnik10uyesyyeuetrcuw.jpeg)
«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](https://habrastorage.org/webt/8s/8y/p3/8s8yp3ly8kpzcuffvvhgqucc6aa.jpeg)
«Configurations» — «Advance VoIP»
![image](https://habrastorage.org/webt/uw/b8/2n/uwb82nunhvrxbbgxifnaa1l3dyu.jpeg)
«Configurations» — «Call Out»
Для каждой линии указываем префикс, который приходит с Asterisk и будет удалятся на канале шлюза перед совершением исходящего звонка: например для для CH1 Dial Plan: 1:-1, CH2 Dial Plan: 2:-2 и т.д.
Dial Plan: 1:-1
![image](https://habrastorage.org/webt/cj/rg/yn/cjrgynmpqsmux0-esqf-rfw2wxq.jpeg)
«Configurations» — «Call In»
В инструкциях по настройке рекомендуют для CID Forward Mode: выбрать Use CID as SIP Caller ID для правильного определения входящего номера. У меня выбрано Use Remote Party Id. Это было сделано для правильного определения линии, с которой пришел вызов. Входящий номер определяется правильно.
![image](https://habrastorage.org/webt/zy/a2/os/zya2oswrpqr_jbrbwpssb14-vcs.jpeg)
На этом закончили настройку GoIP.
Настройка FreePBX 14
«Подключения» — «Транки»
Выбираем «Добавить SIP (chan_sip) транк».
Вкладка «Общие»
![image](https://habrastorage.org/webt/rb/if/yp/rbifypqzucee2g2cflhi0ha3_oe.jpeg)
Переходим на вкладку «Правила манипуляции набора номера»
Прописываем шаблоны. Указываем префиксы для каждого транка по порядку. Для первой линии 1, для второй 2 и т.д.
![image](https://habrastorage.org/webt/ud/eq/x1/udeqx164u6kx3a3rk5jx5yidw8c.jpeg)
Вкладка «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](https://habrastorage.org/webt/o2/0m/9j/o20m9jyzsotrxn8osqkmarw8pzc.jpeg)
Входящий
in-9651234567
secret=Djfgkjgfd!!!!234%$^%#
type=user
context=from-trunk-sip-9651234567-custom
![image](https://habrastorage.org/webt/2b/-l/us/2b-lusewyxlogecbsayvgynlch0.jpeg)
Далее создадим внутренние номера и группу вызова. Как это делается описывать не буду. В FreePBX это делается через меню «Приложения» — «Внутренние номера» и «Приложения» — «Группы вызова». Все довольно просто и интуитивно понятно.
«Подключения» — «Исходящая маршрутизация»
Выбираем «Добавить исходящий маршрут».
Вкладка «Настройки маршрута»
Укажем название маршрута, например all_line. Далее укажем по порядку транки через которые будут совершаться исходящие вызовы.
![image](https://habrastorage.org/webt/ut/o3/sa/uto3sahdz0fsnutbjp6ddjzsroc.jpeg)
Переходим на вкладку «Правила набора»
Здесь прописываем шаблоны для исходящих номеров.
![image](https://habrastorage.org/webt/bi/gl/os/biglos628mkrb_b1vh1ge4vfmww.jpeg)
Остальные вкладки оставляем по умолчанию. На этом настройка исходящего маршрута завершена. Можно попробовать совершить вызов.
Здесь может возникнуть проблема, что звонки будут уходить через транки в том порядке, в каком они указаны в маршруте. Что в свою очередь приведет к тому, что единицы на первых линиях будут уходить больше чем на тех, которые идут за ними. Для решения этой задачи можно переписать правила для исходящего маршрута с помощью 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](https://habrastorage.org/webt/um/ni/h7/umnih7qnfkwjgqwvxj7tcurrzga.jpeg)
На этом настройка завершена. Можно пробовать звонить и принимать звонки.
Заключение
Многие не любят настраивать FreePBX, а ставят голый Астериск. У меня был нулевой опыт работы с IP-телефонией, поэтому в свое время выбор пал на FreePBX. Проблем с правкой конфигов у меня не возникло. Любые изменения можно внести с помощью конфиг файлов extensions_custom.conf и extensions_override_freepbx.conf. Разобраться не так уж и сложно. У нас небольшой колл-центр. GoIP показал себя с лучшей стороны. Единственное не устроил их родной смс сервер. Поэтому был написан свой собственный, который поддерживает отправку и прием смс сообщении, а также показывает статус доставки смс. У нас получился полноценный заменитель телефона.
В качестве sip клиента используем веб телефон написанный на основе JsSip бибилиотеки, отлично работает в Firefox 68 и Chrome 76. Если будет время напишу более подробную инструкцию по применению JsSip библиотеки. А также отдельную статью по созданию своего смс сервера.
Ovoshlook
Один порт у 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 — тоже лишнее.