Исходящие через несколько одноканальных номеров

319 просмотров
спросил 20 Дек, 19 от Mordent (210 баллов) в категории Тонкая настройка

Добрый день.

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

Суть: у меня от провайдера подключено 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 Ответ

+1 голос
ответил 20 Дек, 19 от boffart (52,140 баллов)

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

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

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

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

оставил комментарий 20 Дек, 19 от Mordent (210 баллов)
это реально рабочая конфигурация?

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

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

Спасибо.
оставил комментарий 20 Дек, 19 от boffart (52,140 баллов)

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

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

оставил комментарий 20 Дек, 19 от Mordent (210 баллов)
изображение мелковато, но идею я уловил. надо, наверное, в вики подписать про эту возможность)

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

спасибо
оставил комментарий 20 Дек, 19 от boffart (52,140 баллов)
Статью дополнил

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

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

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

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

оставил комментарий 24 Дек, 19 от boffart (52,140 баллов)
решение пока не нашел.

пока только два статуса обрабатывается "ANSWER" и "НЕ ANSWER"
Добро пожаловать на сайт MikoPBX Q&A, где вы можете задавать вопросы и получать ответы от других членов сообщества.

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

askozia провайдер запись-разговоров настройка ivr входящие-вызовы маршрут маршрутизация askozia6 провайдеры очередь запись askozia7 факс очередь-вызовов транк исходящие-звонки обновление переадресация веб-интерфейс ascozia история мобильный интеграция перехват-вызова провайдеров логи редактор разговоров goip аон callerid установка маршруты диалплан тишина smtp gsm панель-телефонии-1с перевод-вызова звонок nat лицензия панель askozia-5 переадресация-мобильный префиксы телефонная-книга голосовая почта парковка перевод vmware мультифон мегафон донабор настройка-провайдер статистика время голосовая-почта перехват вызовов номер asterisk skype ssh 2 web-интерфейс дополнительный-диск распределение проброс-портов настройка-исходящие-исходящих-вызов-вызовов подменю goip4 отправка-факса железо grandstream релиз beeline digium bruteforce взлом приложение исходящие fax web cdr времени pickup вызовы yealink ростелеком mango 8 шлюз количество не-слышно-звук перенос_конфигурации запись-разговора

1,433 вопросов

1,245 ответов

2,984 комментариев

1,891 пользователей

...