В Интернете довольно много примеров настройки. Но ни один из них у меня не заработал как надо. Одной из проблем с которой я столкнулся было неправильное определение линии при входящем звонке. В свое время нигде не нашел мануал для решения этой проблемы. Поэтому решил выложить свою версию инструкции здесь. Заодно и шпаргалка для себя на будущее.
«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.
«Подключения» — «Транки»
Выбираем «Добавить 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 библиотеки. А также отдельную статью по созданию своего смс сервера.
- Чулан*
Начнём с того, что Сибирьтелеком — крупнейший оператор фиксированной связи в СФО в Кемерово предоставляет VoIP с сигнализацией SIP только для абонентов подключенных по ETTH (оптика). Та ещё песня получить такое соединение. Однако здесь опишу опыт настройки SIP-транка между Asterisk из коробки TrixBox и их чудесным железом, которое называется IskraTel SI3000.
Входящие вызовы
оказалось настроить проще. Изначально в TrixBox конфиг SIP-peer содержит следующее: А чтобы звонки приходили естественно необходимо зарегистрировать свой номер на своём IP-адресе у провайдера. Для этого надо достать бумажный конверт с паролем доступа к SIP! (Да, да чтобы получить доступ к защищённой по всем статьям услуге надо съездить в офис и получить бумажные конверты на каждый городской номер 🙂 и указать строку регистрации: где здесь и далее: [гор_номер] — городской номер, в Кемерово ещё 6-значный; [пароль] — пароль; это данные из бумажного конверта.Второй раз после «/» [гор_номер] обязателен, иначе у провайдера регистрируется экстеншн «s», что не есть правильно с точки зрения дальнейшей маршрутизации вызова внутри Asterisk. По всей видимости этого достаточно чтобы входящие из города стали попадать на IP вашего Asterisk, но этого недостаточно чтобы он их принял! Ведь peer (то есть провайдер) не регистриться у вас, как вы у него, поэтому надо в настройках SIP-peer добавить строку:
insecure=invite
После этого Asterisk без вопросов принимает входящие вызовы.
Исходящие вызовы
настроить удалось после нескольких опытов…
Опыт 1.
С приведённым выше конфигом на наши INVITE сервер отпинывает следующим:
SIP/2.0 480 Temporarily Unavailable
Звоним провайдеру и он говорит: «вот мы сравниваем ваш INVITE с тем, который нормально обрабатывается и видим отличие». В ваших пакетах приходит какой-то короткий номер 2395 в строке:
From: «2395» <sip>;tag=as55eb5[гор_номер]@10.25.0.50></sip>
Давайте его уберём. Не вопрос, дорогой провайдер, сделаем это следующим способом (для FreePBX в TrixBox) укажем Outbound Caller ID в настройках SIP-trunk в виде:
Outbound Caller ID <[гор_номер]>
либо в sip.conf строка:
callerid=[гор_номер]
Опыт 2.
После указанных изменений вновь делаем попытку позвонить на городской номер, наши INVITE сервер отпинывает следующим:
SIP/2.0 480 Temporarily Unavailable
Звоним провайдеру и он говорит: «вот мы сравниваем ваш INVITE с тем, который нормально обрабатывается и видим отличие. В ваших пакетах приходит какой-то странный атрибут:
a=fmtp:101 0-16
INVITE sip:316544@10.0.25.2 SIP/2.0 [skipped] Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY Supported: replaces, timer Content-Type: application/sdp Content-Length: 266 v=0o=root 529554116 529554116 IN IP4 10.25.0.50 s=Asterisk PBX 1.6.0.9-samy-r27 c=IN IP4 10.25.0.50 t=0 0 m=audio 10258 RTP/AVP 8 101 a=rtpmap:8 PCMA/8000 a=rtpmap:101 telephone-event/8000a=fmtp:101 0-16 a=silenceSupp:off — — — — a=ptime:20 a=sendrecv
Давайте его уберём.И вновь „Не вопрос, дорогой провайдер“, сделаем это следующим способом. Достаточно в настройках SIP-peer указать тип передачи DTMF в виде:
dtmfmode=info
После этого второй „не медийный“ поток с кодом кодека „101 telephone-event/8000“ не направляется к этому пиру. Это я узнал из RFC-3261 и как оказалось позже роли не играет!..
Опыт 3.
После указанных изменений вновь делаем попытку позвонить на городской номер, наши INVITE сервер отпинывает следующим:
SIP/2.0 480 Temporarily Unavailable
И в третий раз Звоним провайдеру и он говорит: „вот мы сравниваем ваш INVITE с тем, который нормально обрабатывается и видим отличие. В ваших пакетах приходит какой-то неправильный атрибут
o=root 529554116 529554116 IN IP4 10…
(см. INVITE выше). У других наших клиентов в этом поле приходит [гор_номер]. Должно быть как у всех“. читаем маны, доки, форумы и т.д. ищем как это сделать в Asterisk. И находим что это рулится только в секции [general] файла sip.conf обычного Asterisk, то есть для всех SIP-пиров и юзеров параметром:
sdpowner=-
в файле sip_general_custom.conf в TrixBox (точнее в FreePBX). Указываем именно „-“, т.к. в стандарте (RFC tools.ietf.org/html/rfc4566#section-5.2) должен быть указан владелец (owner), либо „-“ если система не поддерживает идентификаторы. Указать [гор_номер] как „советует“ провайдер не возможно, в силу указанной выше причины (секция [general]).
Опыт 4.
После указанных изменений вновь делаем попытку позвонить на городской номер, наши INVITE сервер отпинывает следующим:
SIP/2.0 480 Temporarily Unavailable
И в четвёрный раз звоним провайдеру и он говорит: „вот мы сравниваем ваш INVITE с тем, который нормально обрабатывается и видим отличие. В поле “From:» после @ вы указываете свой IP-адрес, а в вызовах которые нормально обрабатываются нашей АТС приходит IP-адрес НАШЕЙ АТС (!) 10.0.25.2. Что делать? Опять гуглим, маним, и т.д. и т.п. и находим ещё один параметр конфигурации SIP-пиров отвечающий как раз за этот адрес в поле «From:» — fromdomain:
fromdomain (peer) (This allows you to set the domain in the From: field of the SIP header. It may be required by some providers for authentication: fromdomain=my.hostname.tld — врезка из Книги«Asterisk The Future of Telephony»)
Как раз то, что требует от нас уважаемый провайдер! Прописываем на каждом SIP-пире (если у нас несколько гор. номеров) этот параметр и… внимание!!!.. (барабанная дробь!!!) ЗАРАБОТАЛО!!!! На всё-про-всё у меня ушло 3 рабочих дня, практически без отвлечения на другие задачи. Ну да, эту запись в блог я тоже в процессе поисков записывал :-)<sip><sip><sip> ИТОГО Оказалось что изменения в «Опыт 2» не играют роли для исходящих вызовов, т.е. строка@10.25.0.50>@10.0.25.2>@10.25.0.50>
dtmfmode=info
Важна только для DTMF. Таким образом у меня в настройках SIP-пира получилось следующее:и обязательно нужно выставлять Caller ID именно городской номер (см. Опыт 1), иначе Asterisk выдаёт туда местный номер, что не есть правильно :-). PS: для работы DTMF надо добавить
dtmfmode=inband
Другие варианты передачи DTMF SI3000 в случае кемеровского Сибирьтелекома не понимает.</sip></sip></sip>Используемые источники:
- https://habr.com/post/464765/
- https://habr.com/sandbox/17082/