Добрый день.
Пришлось создать новую тему, ибо нет ответа в старой, а я не поверю, что такое никто не реализовывал.
Суть: у меня от провайдера подключено 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 минут.
подскажите, пожалуйста, в какую сторону копнуть.
Спасибо