374 просмотров
от (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 Ответ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1.3 тыс. ответов

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

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

...