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

Добрый день.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2.4 тыс. ответов

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

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

...