Нетривиальная Задача С Обратным Вызовом + Did В Asterisk

Здравствуйте, уважаемые хабровцы и любители звездочек! Хочу поделиться интересной проблемой и решением ее.

Итак, вот условия задачи.

У нас есть: - модифицированный дистрибутив Elastix 2.3 - звездочка 1.8.13.1 - Бесплатная АТС 2.8.1 — 24 номера с SIP подключением и 30 каналов — ~40 различных ООО в составе холдинга Текущая задача: — сделать услугу обратного звонка на каждый DID номер (и соответственно с каждого ООО) Казалось бы, «это бесплатная АТС — там все мышкой делается».

Это не совсем правда.



Первый шаг.

Осознание проблемы.

Для настройки я использую веб-интерфейс elastix. Мне он очень нравится.

Зайдите в АТС-> Конфигурация АТС-> Обратный вызов и заполните данные для обратного звонка.

Заходим в раздел IVR, выбираем нужное меню и настраиваем, например, наш обратный звонок на «9».

Проверяю - все работает. Звонили с 28-хх-гг - звонок вернулся с 28-хх-гг То же самое сделал для IVR на номер 28-хх-хх - звонок вернулся с 28-хх-гг Согласитесь, как-то нелогично, когда звонишь заказать продукты, а тебе перезванивают с номера какого-то завода.

И таких организаций у меня довольно много.

Отсюда и текущая задача: необходимо, чтобы при звонке на 28-хх-хх звонок возвращался с номера 28-хх-хх.



Шаг второй.

Поиск решения через веб-интерфейс elastix/FreePBX

Я вам скажу сразу.

Возможно оно и существует, но я его не нашел.



Шаг третий.

Непосредственный просмотр файлов конфигурации

Контекст обратного вызова находится в файле Extensions_additional.conf.
  
  
  
  
  
   

[callback] include => callback-custom exten => 1,1,Set(CALL=${CALLERID(number)}) exten => 1,n,Set(DESTINATION=ivr-5.s.1) exten => 1,n,Set(SLEEP=1) exten => 1,n,System(/var/lib/asterisk/bin/callback ${CALL} ${DESTINATION} ${SLEEP} &) exten => 1,n,Hangup

Видим, что вызов осуществляется из PHP-скрипта /var/lib/asterisk/bin/callback Просмотрев его, мы узнаем, что вызов осуществляется из Локального канала, и идет по правилам исходящих маршрутов (Outbound Routes).

И вот после рабочего дня случайных мыслей мне пришла в голову идея - сделать необходимые DID на основе префиксов при дозвоне с обратного звонка.



Шаг четвертый.

Решение проблемы

Для наглядности приведу следующую логическую схему:
  • Вводим наш номер 28-хх-хх для номера 28-хх-хх в Исходящих маршрутах в поле префикса
  • звонок поступает с 55-ху-хх на 28-хх-хх
  • передать 55-xy-xx и 28-xx-xx в скрипт обратного вызова
  • наберите номер в формате 28xxxx55xyxx
  • Asterisk забивает номер 28xxxx55xyxx в Outbound Routes и отсекает 28xxxx, набирая 55xyxx с номера 28xxxx
  • ВЫГОДА!
Техническая сторона оказалась достаточно «сложной».

Как вы знаете, FreePBX перезаписывает Extensions_additional.conf при каждом его сохранении.

Добавлен новый пользователь через Интернет — примените контексты по-другому.

Решением этой проблемы является использование файла Extensions_override_freepbx.conf, но у меня он никогда не работал.

На его изучение я потратил не больше часа — ведь решение главной проблемы уже витало где-то в воздухе.

Я инстинктивно понял, что причина, скорее всего, в том, что на сервере уже многое переписано.

Давайте посмотрим на контекст [обратный вызов] Нам нужно передать DID в переменную CALL. Через callback-custom это делать бесполезно — переменная все равно будет переназначена ниже в основном контексте.

И тут я вспомнил полезная статья .

Добавьте контекст [callback-az], созданный путем копирования [callback] в Extensions_custom.conf, и добавьте FROM_DID в переменную CALL.

[callback-az] exten => 1,1,Set(CALL=${FROM_DID}${CALLERID(number)}) exten => 1,n,Set(DESTINATION=ivr-5.s.1) exten => 1,n,Set(SLEEP=1) exten => 1,n,Set(DESC='callb_CRT') exten => 1,n,System(/var/lib/asterisk/bin/callback ${CALL} ${DESTINATION} ${SLEEP} ${DESC} &)

Замечу, что телефоны моих операторов отображают звонящего просто — « Перезвонить " Забегаем вперед, это вызвало панику - ведь они обслуживают кучу организаций и хотят посмотреть, откуда поступил звонок.

Это логично, с этим не поспоришь.

Поэтому в приведенном выше контексте я добавил текстовую переменную DESC и отправил ее в скрипт обратного вызова.

Это устраивало всех.

Далее модифицируем сам скрипт /var/lib/asterisk/bin/callback — как уже говорилось, это простой PHP-скрипт. Я думаю, все уже поняли, что будет дальше.

Ищем

$callback_number = $args[0]; $callback_destination = $args[1]; $pause_seconds = $args[2];

Вставьте ниже

$callback_desc = $args[3];

Ищем

$callerid = "Callback"

заменить

$callerid = $callback_desc;

Готовый.

Далее вам нужно правильно сделать вызов контекста.

Позвольте мне вспомнить вышесказанное полезная статья и картинки к нему.

У Elastix нет модуля Пользовательские направления , поэтому переходим непосредственно во FreePBX. Он расположен по адресу:

ip-add/admin

Логин и пароль стандартные и легко гуглятся.

Мы делаем это следующим образом:

Нетривиальная задача с обратным вызовом + DID в Asterisk

Позволь мне объяснить.

Первая цифра «1» в строке обратный вызов-az,1,1 это номер обратного вызова из контекста [callback-az] — у нас будет несколько обратных вызовов в контексте (по 1 на каждый DID).

Вторая «1» — номер приоритета.

Ну и последний штрих - указываем в IVR наш DID на цифру 9 - наш Custom Destination

Нетривиальная задача с обратным вызовом + DID в Asterisk

И это делается для каждого DID и обратного вызова Не забудьте добавить префикс к исходящим маршрутам! Я не буду об этом говорить, но это именно то, что вы легко можете сделать с помощью мышки.



Заключение

Я не считаю себя гуру Asterisk. Я уверен, что кто-то знает, как сделать это лучше и правильнее.

Я нашел свой путь и хочу поделиться им с сообществом.

Спасибо всем.

Теги: #asterisk #сделал #обратный вызов #asterisk #Разработка систем связи

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.