Страница 1 из 2

Set(DYNAMIC_FEATURES=) для одного плеча - как?

Добавлено: 18 янв 2016, 14:56
postscripter
Первоначально DYNAMIC_FEATURES = apprecord#MyFeature1 (global_custom.conf). Звонок приходит from trunk, выполняется следующий код:

[from-pstn-custom]
exten => _X.,1,Set(DYNAMIC_FEATURES=)
или
exten => _X.,1,Set(__DYNAMIC_FEATURES=)


Переменная устанавливается для входящего канала, но горячие клавиши отваливаются у обоих (кроме ##, она работает). Почему так? Как сделать правильно? И как запретить горячие клавиши удалённому абоненту, когда звонок наоборот, выходит в мир?

Re: Set(DYNAMIC_FEATURES=) для одного плеча - как?

Добавлено: 18 янв 2016, 16:31
gosha
посмотреть в features.conf настройки вашей фичи:

<ActivateOn>[/<ActivatedBy>]

Re: Set(DYNAMIC_FEATURES=) для одного плеча - как?

Добавлено: 18 янв 2016, 16:49
awsswa

Re: Set(DYNAMIC_FEATURES=) для одного плеча - как?

Добавлено: 18 янв 2016, 18:33
postscripter
ActivateOn/ActivatedBy
*0,self/both, активировать могут оба, выполнение на стороне активировавшего, так и задумано.
Хочется изменить поведение именно в случае звонков извне, т.е. прибить все хоткеи для того плеча, которое - транк.


awsswa, у вас читаю:
peer/both, ... Опция both - Играет обеим сторонам
Хотя на самом деле
both - means that the application can be performed by both caller and callee
Вводите в заблуждение :) Но проблема не в этом, конечно....

Re: Set(DYNAMIC_FEATURES=) для одного плеча - как?

Добавлено: 18 янв 2016, 18:45
postscripter
А, вкурил.. Вы предлагаете сделать две feature, чтобы при звонке с транка каждый раз ставить в dynamic_features ту, которая "self/callee", а при звонке на транк -- "self/caller"? Мутно конечно, но можно попробовать.

Re: Set(DYNAMIC_FEATURES=) для одного плеча - как?

Добавлено: 19 янв 2016, 08:08
virus_net
Ещё можно просто GotoIf`ом обойтись в Macro фичи.
Проверять или по длине номера или по наличию собственной переменной, которую указать у нужных внутренних номеров в sip.conf.
По длине номера:

Код: Выделить всё

exten => s,1,Verbose(1,Run feature ${CHANNEL})
exten => s,n,GotoIf($["${LEN(${CALLERID(num)})}" > "10"]?step1:cancel)
exten => s,n(step1),n,....
exten => s,n(cancel),Verbose(1, Cancel)
exten => s,n,MacroExit()
По переменной:

Код: Выделить всё

[111](locuser)
...
setvar=myConstant=1

Код: Выделить всё

exten => s,n,GotoIf($["${myConstant}" = "1"]?step1:cancel)

Re: Set(DYNAMIC_FEATURES=) для одного плеча - как?

Добавлено: 19 янв 2016, 08:44
postscripter
Проверять или по длине номера
Для исходящих не получится, CALLERID(num) заменяется на внешний номер транка при звонке.
Для входящих... А SIP-оператор разве не может передать какой-нибудь левый номер?

Про setvar любопытно, я думал то же самое макросом сделать. Но
setvar = variable=value : Channel variable to be set for all calls from this peer/user.
Т.е. для входящих не сработает. И есть подозрения, что первый же трансфер эту переменную сбросит (и правильно сделает).

Пока есть такая идея:


[macro-check-devinfo-context]
exten => s,1,Noop(Who am I?)
same => n,Macro(dumpvars)
same => n,Gotoif(${devinfo_context}?the_end)
same => n,Set(devinfo_context=${ODBC_CHECK_CONTEXT(${CALLERID(num)})})
same => n(the_end),MacroExit()


Вызывать этот макрос при совершении любого звонка, а также непосредственно в тех местах, где нужно идентифицировать абонента. Чисто по прикидкам:
1) При звонке с номера 123 переменная получает его контекст из базы.
2) При выходе в транк callerid меняется, но переменная остаётся.
3) При трансфере переменная обнуляется, но и callerid восстанавливается, а значит, следующий вызов макроса восстановит переменную.

Но надо тестить. И ещё беспокоит честность провайдера. Ведь если придёт вызов с callerid=100 (служба поддержки, например), будет неприятно.
Ещё можно просто GotoIf`ом обойтись в Macro фичи.
Если фича самописная, а если стандартная типа *1 = начать запись, опять переписывать на свою? Должен быть более правильный способ, чем переопределять все стандартные фичи, имхо.

Re: Set(DYNAMIC_FEATURES=) для одного плеча - как?

Добавлено: 19 янв 2016, 09:50
postscripter
Так-с... Макрос работает неплохо, но я его включаю так:

[AnyUsers]
exten => s,n,Macro(check-devinfo-context)
exten => _X.,1,Macro(check-devinfo-context)

И получаю опять паузу при наборе, от которой так долго избавлялся, т.к. _X. - это любой номер....

Re: Set(DYNAMIC_FEATURES=) для одного плеча - как?

Добавлено: 19 янв 2016, 10:28
virus_net
postscripter писал(а):Для исходящих не получится, CALLERID(num) заменяется на внешний номер транка при звонке.
postscripter, это был пример идеи как это можно реализовать. Что проверять, номер или не номер и на соответствие чему - это дело ваше.
postscripter писал(а):А SIP-оператор разве не может передать какой-нибудь левый номер?
если вы ему это позволяете, не проверяете по шаблону на входе, то безусловно ответ "ДА"
postscripter писал(а):Т.е. для входящих не сработает
а) если не выставлять в соответствующем пире для входящих, то нет.
б) так вам же это и нужно, чтобы при вызове извне не работало
postscripter писал(а):И есть подозрения, что первый же трансфер эту переменную сбросит
Есть поговорка: "Когда кажется - креститься надо" ;) Переменная не сбросится. Проверить это можно за несколько минут.

Re: Set(DYNAMIC_FEATURES=) для одного плеча - как?

Добавлено: 19 янв 2016, 12:44
postscripter
это был пример идеи как это можно реализовать
Почему, пример. Это единственный и очевидный вариант, кроме $Caller id и $Ampuser других переменных-то нет. Можно установить свои, я это пытаюсь сделать макросом, но получаю вышеописанную проблему.
если вы ему это позволяете, не проверяете по шаблону на входе
Согласен :)
так вам же это и нужно, чтобы при вызове извне не работало
Согласен :)))

Меня немножко напрягает прописывать в sip_custom.conf одно и то же для каждого абонента (шаблонов freepbx не делает). Плюс есть ещё dahdi. Можно ввести маркер как-то по-другому?