Здравствуйте, уважаемые хабровцы и любители звездочек! Хочу поделиться интересной проблемой и решением ее.
Итак, вот условия задачи.
У нас есть: - модифицированный дистрибутив 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.
Видим, что вызов осуществляется из PHP-скрипта /var/lib/asterisk/bin/callback Просмотрев его, мы узнаем, что вызов осуществляется из Локального канала, и идет по правилам исходящих маршрутов (Outbound Routes).[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
И вот после рабочего дня случайных мыслей мне пришла в голову идея - сделать необходимые 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
Логин и пароль стандартные и легко гуглятся.
Мы делаем это следующим образом:
Позволь мне объяснить.
Первая цифра «1» в строке обратный вызов-az,1,1 это номер обратного вызова из контекста [callback-az] — у нас будет несколько обратных вызовов в контексте (по 1 на каждый DID).
Вторая «1» — номер приоритета.
Ну и последний штрих - указываем в IVR наш DID на цифру 9 - наш Custom Destination
И это делается для каждого DID и обратного вызова
Не забудьте добавить префикс к исходящим маршрутам! Я не буду об этом говорить, но это именно то, что вы легко можете сделать с помощью мышки.
Заключение
Я не считаю себя гуру Asterisk. Я уверен, что кто-то знает, как сделать это лучше и правильнее.Я нашел свой путь и хочу поделиться им с сообществом.
Спасибо всем.
Теги: #asterisk #сделал #обратный вызов #asterisk #Разработка систем связи
-
Каррер, Пауль
19 Oct, 24 -
Люди, Которые Спасли 1968 Год
19 Oct, 24 -
Путь Жаворонка 2: На Краю Радуги
19 Oct, 24 -
Ресурсономика И Многомерные Деньги - Часть 2
19 Oct, 24 -
Стереоскопический Эффект На 3D-Картах
19 Oct, 24