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

Здравствуйте.

Для начала, хочу сказать спасибо за продукт. При наличии головы и гугла все остальное настраивается почти "само")

По делу.

Мне провайдер отдает номера (20 штук) не транком, а отдельными одноканальными Учетками. Я хотел сделать так, чтобы при звонке наружу n-ным сотрудником, выбиралась любая свободная линия. Из Веб-интерфейса сделать не получилось, поэтому я добавил дополнительные строчки в диалплане напрямую в extension.conf -> Заменять полностью (в блоке, который был создан через веб-интерфейс). Проблема в том, что теперь внесение каких-либо правок через админку не вносит эти правки в сам файл (учитывая количество переменных, сам я такие запросы не напишу никогда), поэтому приходится ставить на файл режим "Не изменять", затем делать правки через ГУИ, копировать "дефолтный" файл к себе, искать в нем новые изменения, переписывать их в уже правленный конфиг. как можно понять, времени уходит порядочно на внесение только одного изменения, а если потом надо откатиться или еще изменить.

насколько я понимаю, в режиме "Добавлять в конец файла" одновременно срабатывают и правила, создаваемые через веб-интерфейс, и дополнительные "ручные" записи. Но прочел здесь, что если ниже я просто переопишу правило, которое уже есть в конфиге выше, то оно не сработает. Соответственно, вопрос: как можно добавить конкретные строки или переопределить полностью уже существующее правило исходящей маршрутизации ([SIP-123-11-outgoing]) в режиме "Добавлять в конец файла"?

пока писал вопрос, наткнулся на конструкцию перед приложением Dial

GosubIf($["${DIALPLAN_EXISTS(SIP-***-outgoing-custom,${EXTEN}),1}" == "1"]?SIP-***-outgoing-custom,${EXTEN},1)

 правильно ли я понял, что если существует план "SIP-***-outgoing-custom", то дальнейший маршрут перейдет в него? соответственно, если я в режиме "Добавлять в конец файла" запишу измененный план в блоке [SIP-***-outgoing-custom], оно и будет выполнено? 

как правильно его описать? также как и первоочередный (начиная с exten=>_X!...)? Ведь, согласно конструкции выше, аргументом в custom отдается изначально введенный номер и парсить его перед набором нужно по-новой. Функция "return" - это окончательный выход или возврат в предыдущую функцию?

Блин, понимаю, что вопросов задал больше чем один, прошу прощения.

Спасибо.

1 Ответ

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

Ознакомьтесь с инструкциями:

Это должно снять большинство вопросов. 

Приложение "Gosubif" отправляет  текущий канал в sub контекст. Этот контекст обязательно должен вызвать "return". 

Пример контекста:

[SIP-PROVIDER-49-outgoing-custom]
exten => _.!,1,NoOp(callerid settings)
    same => n,ExecIf($["${MIKO_CALLERID_NUM}x" != "x"]?Set(CALLERID(num)=${MIKO_CALLERID_NUM}))
    same => n,ExecIf($["${MIKO_CALLERID_NUM}x" != "x"]?Set(CALLERID(name)=${MIKO_CALLERID_NUM}))  
    same => n,return    
  • "SIP-PROVIDER" - это идентификатор провайдера (см. адресную строку браузера во время редактирования).
  • 49 - это идентификатор маршрута (см. адресную строку браузера во время редактирования). 

В принципе, Вам ничто не мешает в контексте "SIP-PROVIDER-49-outgoing-custom" выполнить "Goto" в свой контекст.

Ведь, согласно конструкции выше, аргументом в custom отдается изначально введенный номер и парсить его перед набором нужно по-новой

Тут у вас есть выбор. 

  • Можно кастомизировать outgoing контекст, тогда потребуется "парсить". 
  • Можно кастомизировать контекст провайдера, тогда все исходящие маршруты работают "как есть"

от (250 баллов)
редактировать от
Правильно ли я понял. Имея Дефолтное правило, созданное в веб-интерфейсе:

[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

я могу создать следующие два правила в режиме "Добавлять в конец файла":

[SIP-1573201970-outgoing-custom] (ошибся в имени)
exten => _X!,1,Goto(SIP-1573201970-outgoing-custom-1,${EXTEN},1)

[SIP-1573201970-outgoing-custom-1]
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,GotoIf($["${DIALSTATUS}" = "ANSWER"]?h:a)
    same => n(a),Dial(SIP/SIP-1574069531/${number},600,${DOPTIONS}TeKM(dial_answer)b(dial_create_chan,s,1))
    same => n,GotoIf($["${DIALSTATUS}" = "ANSWER"]?h:b)
    same => n(b),Dial(SIP/SIP-1574069611/${number},600,${DOPTIONS}TeKM(dial_answer)b(dial_create_chan,s,1))
    same => n,GotoIf($["${DIALSTATUS}" = "ANSWER"]?h:c)   
    same => n(c),Dial(SIP/SIP-1574069779/${number},600,${DOPTIONS}TeKM(dial_answer)b(dial_create_chan,s,1))
    same => n(h),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

и будет работать?
спасибо.
от (62.9 тыс. баллов)
Ваш контекст должен быть описан как "SIP-1573201970-outgoing-custom"
Описывать дополнительную секцию "[SIP-1573201970-22-outgoing]" не требуется
от (250 баллов)
Секция [SIP-1573201970-22-outgoing] создана системой через веб-интерфейс. из нее есть сдандартный Gosub в [SIP-1573201970-outgoing-custom], который должен вернуть return, как я понимаю, в точку, из которой он был вызван.
если схемотично:
FirstContex -> Gosub(CustomContex) -> return(FirstContex)

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

или нет?
от (62.9 тыс. баллов)
вернется.
потому либо выполните hangup() либо goto в свой контекст.
от (250 баллов)
перемещено от

Добрый день.

Решил не создавать новый вопрос.

Суть следующая. В режиме "Добавлять в конец файла" отредактировал файл 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

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

[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, но: не пишутся звонки. т.е. инфа кто - кому звонил есть, но звонок не пишется. и, если звонить на мобильный, у звонящего нет гудков дозвона.

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

[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 минут.

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

Спасибо

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

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

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

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

1.5 тыс. ответов

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

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

...