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

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

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

По делу.

Мне провайдер отдает номера (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 Ответ

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

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

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

Приложение "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 контекст, тогда потребуется "парсить". 
  • Можно кастомизировать контекст провайдера, тогда все исходящие маршруты работают "как есть"

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

[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

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

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

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

Добрый день.

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

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

...