568 просмотров
от (250 баллов) в категории Тонкая настройка

Добрый день.

Пришлось создать новую тему, ибо нет ответа в старой, а я не поверю, что такое никто не реализовывал.

Суть: у меня от провайдера подключено 5 одноканальных SIP-номеров специально для звонков наружу теми сотрудниками, которым не нужен "прямой" номер (отдельные SIP-учетки). Для исходящих реализована конструкция с префиксами через "Router" (как в справке). Соответственно, поскольку все номера одноканальные, в стандартном исполнении только один "неПрямой" сотрудник может звонить в момент времени Х, для остальных - линия будет занята. Мне было необходимо, чтобы дефолтный маршрут умел перебирать "свободные" линии: при занятом первом номере исходящий кидался на второй, третий и тд.

Реализовать получилось двумя методами и у обоих есть свои изъяны. Методы описаны ниже. Гуру прошу подсказки, как от косяков избавиться. Мне без разницы, какой из способов использовать, важно удобство, работоспособность и отсутсвие недочетов.

В режиме "Добавлять в конец файла" отредактировал файл extensions. Добавил контекст-кастом, чтобы исходящие звонки распределялись между несколькими одноканальными номерами.

контекст, созданный системой через веб-морду:

[SIP-1573201970-22-outgoing]
exten => _X!,1,Set(number=${EXTEN:2})
    same => n,ExecIf($["${EXTEN}" != "${number}"]?Goto(${CONTEXT},${number},$[${PRIORITY} + 1]))
    same => n,ExecIf($["${number}x" == "x"]?Hangup())
    same => n,Set(ROUTFOUND=1)
    same => n,Gosub(${ISTRANSFER}dial,${EXTEN},1)
    same => n,ExecIf($["${EXTERNALPHONE}" == "${EXTEN}"]?Set(DOPTIONS=tk))
    same => n,GosubIf($["${DIALPLAN_EXISTS(SIP-1573201970-outgoing-custom,${EXTEN}),1}" == "1"]?SIP-1573201970-outgoing-custom,${EXTEN},1)
    same => n,Dial(SIP/SIP-1573201970/${number},600,${DOPTIONS}TeKM(dial_answer)b(dial_create_chan,s,1))
    same => n,ExecIf($["${ISTRANSFER}x" != "x"]?Gosub(${ISTRANSFER}dial_hangup,${EXTEN},1))
    same => n,ExecIf($["${DIALSTATUS}" = "ANSWER"]?Hangup())
    same => n,Set(pt1c_UNIQUEID=${EMPTY_VALUE})
    same => n,return

Вариант 1. использовал такую конструкцию:

[SIP-1573201970-outgoing-custom]
exten => _X!,1,Set(number=${EXTEN})
    same => n,Gosub(${ISTRANSFER}dial,${EXTEN},1)
    same => n,ExecIf($["${EXTERNALPHONE}" == "${EXTEN}"]?Set(DOPTIONS=tk))
    same => n,Dial(SIP/SIP-1573201970/${number}&SIP/SIP-1574069531/${number}&SIP/SIP-1574069611/${number}&SIP/SIP-1574069779/${number},600,${DOPTIONS}TeKM(dial_answer)b(dial_create_chan,s,1))
    same => n,ExecIf($["${ISTRANSFER}x" != "x"]?Gosub(${ISTRANSFER}dial_hangup,${EXTEN},1))
    same => n,ExecIf($["${DIALSTATUS}" = "ANSWER"]?Hangup())
    same => n,ExecIf($["${DIALSTATUS}" = "BUSY"]?Hangup())
    same => n,Set(pt1c_UNIQUEID=${EMPTY_VALUE})
    same => n,return

работает как задумано, на сброс звонка принимающим реагирует hangup, но: не пишутся звонки. т.е. инфа кто - кому звонил есть, но звонок не пишется. и, если звонить на мобильный, у звонящего нет гудков дозвона.

Вариант 2. попробовал такую конструкцию:

[SIP-1573201970-outgoing-custom]
exten => _X!,1,Set(number=${EXTEN})
    same => n,Gosub(${ISTRANSFER}dial,${EXTEN},1)
    same => n,ExecIf($["${EXTERNALPHONE}" == "${EXTEN}"]?Set(DOPTIONS=tk))
    same => n,Dial(SIP/SIP-1573201970/${number},600,${DOPTIONS}TeKM(dial_answer)b(dial_create_chan,s,1))
    same => n,ExecIf($["${ISTRANSFER}x" != "x"]?Gosub(${ISTRANSFER}dial_hangup,${EXTEN},1))
    same => n,ExecIf($["${DIALSTATUS}" = "ANSWER"]?Hangup())
    same => n,Dial(SIP/SIP-1574069531/${number},600,${DOPTIONS}TeKM(dial_answer)b(dial_create_chan,s,1))
    same => n,ExecIf($["${ISTRANSFER}x" != "x"]?Gosub(${ISTRANSFER}dial_hangup,${EXTEN},1))
    same => n,ExecIf($["${DIALSTATUS}" = "ANSWER"]?Hangup())
    same => n,Dial(SIP/SIP-1574069611/${number},600,${DOPTIONS}TeKM(dial_answer)b(dial_create_chan,s,1))
    same => n,ExecIf($["${ISTRANSFER}x" != "x"]?Gosub(${ISTRANSFER}dial_hangup,${EXTEN},1))
    same => n,ExecIf($["${DIALSTATUS}" = "ANSWER"]?Hangup())
    same => n,Dial(SIP/SIP-1574069779/${number},600,${DOPTIONS}TeKM(dial_answer)b(dial_create_chan,s,1))
    same => n,ExecIf($["${ISTRANSFER}x" != "x"]?Gosub(${ISTRANSFER}dial_hangup,${EXTEN},1))
    same => n,ExecIf($["${DIALSTATUS}" = "ANSWER"]?Hangup())
    same => n,Set(pt1c_UNIQUEID=${EMPTY_VALUE})
    same => n,return

в этом случае гудки есть, звонки по разным линиям тоже работают. но. не могу понять как обработать статус BUSY. получается, что если принимающий сбросит вызов не отвечая, то вызов пойдет снова просто с другого номера. если вставить конструкцию DIALSTATUS=BUSY&Hangup, то не работает распределение линий. И запись звонка работает только для Первого позвонившего через этот контекст. Для остальных - только текстовая запись "кто-кому" с длительностью 59 минут.

подскажите, пожалуйста, в какую сторону копнуть.

Спасибо

1 Ответ

от (101 тыс. баллов)

Мне было необходимо, чтобы дефолтный маршрут умел перебирать "свободные" линии: при занятом первом номере исходящий кидался на второй, третий и тд.

Эта задача решается описанием одинакового шаблона для всех ваших маршрутов. 

Если вызов не прошел через первый, то пойдет через второй, далее через следующего и так далее...

То есть для всех 5ти маршрутов описываете одинаковое правило набора, к примеру "Номер начинается с 27", перед тем как начать звонок отсекаем 1 символ. Остальная часть номера состоит из 10ти цифр. 

от (250 баллов)
это реально рабочая конфигурация?

я думал по-поводу копий маршрутов на разных провайдерах, но почему-то решил, что если вызов не пройдет по первому из подходящих правил, то просто закончится, поскольку в "Исходящей маршрутизации" нет настройки "Если не подошло ни одно из правил" (как во "Входящей"), соответственно, он не идёт по всей цепочке правил. поэтому моя логика была проста - правило подошло, но линия занята - значит отбой, ведь по факту правило выполнилось.

надо будет проверить. если прокатит, значит правильно говорят: все гениальное - просто.

Спасибо.
от (101 тыс. баллов)

Это рабочий вариант. Вот скрин с нашей рабочей АТС:

Сначала вызов идет через Манго, в случае неудачи вызов направляется через GSM шлюз - это наш резервный канал. 

от (250 баллов)
изображение мелковато, но идею я уловил. надо, наверное, в вики подписать про эту возможность)

проверю, отпишусь.

спасибо
от (101 тыс. баллов)
Статью дополнил

https://wiki.mikopbx.com/outbound-routes

Кстати, подобное действует и для входящих маршрутов.

https://wiki.mikopbx.com/incoming-routes
от (250 баллов)
да, про "Входящую" я видел условия обработки правил. поэтому и подумал, что раз в Хелпе по "Исходящим" такого не написано, значит не предусмотрено)
от (250 баллов)

boffart, благодарю. такой принцип действительно работает, и не надо править конфиги. Одно НО. при сбросе трубки Принимающим (до поднятия), звонок у Звонящего не заканчивается, а повторно отправляется уже через следующую линию. Какой есть вариант пофиксить?

от (101 тыс. баллов)
решение пока не нашел.

пока только два статуса обрабатывается "ANSWER" и "НЕ ANSWER"
от (310 баллов)
А можно апну тему. Есть несколько транков и несколько одинаковых маршрутов через эти транки, если набрать клиенту и он сброси, то вызов пойдет через след. транк и так далее по количеству транков/маршрутов. Со стороны вызывающего это выглядит как обычный дозвон, а клиент уже пять раз скинул трубку.

Вроде кажется не правильным Busy Here как не удачу? Можно как-то штатными средствами это пофиксить?
На этом сайте можно бесплатно задать вопрос разработчикам MikoPBX и другим членам сообщества. Время ответа не регламентированно, но мы стараемся несколько раз в день заглядывать сюда. Для срочного решения проблем обращайтесь на платную линию поддержки

Популярные теги

askozia входящие-вызовы настройка провайдер запись-разговоров исходящие ivr маршрутизация очередь обновление входящие исходящие-звонки провайдеры транк маршрут очередь-вызовов запись askozia7 askozia6 ошибка переадресация перевод битрикс24 callerid установка голосовая-почта факс логи панель-телефонии-1с перевод-вызова ростелеком история-звонков mikopbx модуль настройка-провайдер релиз история почта перехват-вызова запись-разговора веб-интерфейс битрикс gsm звонок nat goip интеграция диалплан внешние-номера pjsip нерабочее-время bitrix24 ascozia аон мобильный редактор asterisk sip лицензия телефонная-книга маршруты провайдеров время голосовая voicemail cdr вызовы разговоров панель #mikopbx журнал-звонков web-интерфейс донабор переадресация-мобильный zabbix beeline monitoring регистрация тишина fax smtp номер мультифон мегафон не-работает askozia-5 распределение билайн настройка-исходящие-исходящих-вызов-вызовов железо префиксы статистика альтернативный оповещения звонков dtmf cisco парковка перехват

2.3 тыс. вопросов

2 тыс. ответов

5.6 тыс. комментариев

26.9 тыс. пользователей

...