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

GotoIf LEN не работает

Добавлено: 15 июн 2022, 14:22
alennox
Доброго всем, где то ошибка на видном месте, не могу понять почему все время GotoIf вычисляет значение в false.
Звоню на внешний попадаю на голосовое меню, далее
нажимаю 55 перекидывает в i,1 тоже самое если нажать на 5.
вместо EXTEN пробовал CALLERID(num)
[ivr-main]
exten => s,1,Answer()
exten => s,2,Background(/etc/asterisk/ivr/hello)
exten => s,3,WaitExten(5)
exten => 4,1,GotoIf($["${LEN(${EXTEN})}" = "1"]?voda,s,1:i,1)
exten => 5,1,GotoIf($["${LEN(${EXTEN})}" = "1"]?vspisok,s,1:i,1)

Re: GotoIf LEN не работает

Добавлено: 15 июн 2022, 18:12
alennox
Астер при вводе 55 хватает первую и передает ее в нужный экстеншн, сравнивает и дает ложь, все верно. Надо заставить астер хватать все введенные цифры, как это сделать?

Re: GotoIf LEN не работает

Добавлено: 16 июн 2022, 05:50
alennox
Нажимаю 55 но астер забирает только первую цифру, на вторую не обращает внимание.
vspisok изменил название поэтому ошибка.

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

 Executing [8831@call-in:1] Goto("SIP/xxx-0000001b", "ivr,s,1") in new stack
    -- Goto (ivr,s,1)
    -- Executing [s@ivr:1] Answer("SIP/xxx-0000001b", "") in new stack
       > 0x7f5da401dae0 -- Strict RTP switching to RTP target address xxxx:45176 as source
    -- Executing [s@ivr:2] BackGround("SIP/xxx-0000001b", "/etc/asterisk/ivr/hello") in new stack
    -- <SIP/xxx-0000001b> Playing '/etc/asterisk/ivr/hello.slin' (language 'ru')
[Jun 16 08:20:41] DTMF[13028][C-0000001c]: channel.c:3980 __ast_read: DTMF begin '5' received on SIP/xxx-0000001b
[Jun 16 08:20:41] DTMF[13028][C-0000001c]: channel.c:3984 __ast_read: DTMF begin ignored '5' on SIP/xxx-0000001b
[Jun 16 08:20:41] DTMF[13028][C-0000001c]: channel.c:3866 __ast_read: DTMF end '5' received on SIP/xxx-0000001b, duration 100 ms
[Jun 16 08:20:41] DTMF[13028][C-0000001c]: channel.c:3955 __ast_read: DTMF end passthrough '5' on SIP/xxx-0000001b
    -- Executing [5@ivr:1] GotoIf("SIP/xxx-0000001b", "1?vspisok:i,1") in new stack
[Jun 16 08:20:41] NOTICE[13028][C-0000001c]: pbx.c:2980 pbx_extension_helper: No such label 'vspisok' in extension '5' in context 'ivr'
[Jun 16 08:20:41] WARNING[13028][C-0000001c]: pbx.c:8840 pbx_parseable_goto: Priority 'vspisok' must be a number > 0, or valid label
  == Spawn extension (ivr, 5, 1) exited non-zero on 'SIP/xxx-0000001b

Re: GotoIf LEN не работает

Добавлено: 16 июн 2022, 05:58
alennox
alennox писал(а):Доброго всем, где то ошибка на видном месте, не могу понять почему все время GotoIf вычисляет значение в false.
Звоню на внешний попадаю на голосовое меню, далее
нажимаю 55 перекидывает в i,1 тоже самое если нажать на 5.
вместо EXTEN пробовал CALLERID(num)
[ivr-main]
exten => s,1,Answer()
exten => s,2,Background(/etc/asterisk/ivr/hello)
exten => s,3,WaitExten(5)
exten => 4,1,GotoIf($["${LEN(${EXTEN})}" = "1"]?voda,s,1:i,1)
exten => 5,1,GotoIf($["${LEN(${EXTEN})}" = "1"]?vspisok,s,1:i,1)
Задача в том чтобы при наборе добавочного номера в голосовом меню откидывался неверный номер, мол если набрал не 5 а 55 или 543 то уходи на i
А получается чтобы не набрал после 5ки все равно идет дальше.

Re: GotoIf LEN не работает

Добавлено: 16 июн 2022, 07:37
Vlad1983
WaitExten всегда переходит по наибольшему совпадению в текущем контексте
нет вариантов больше 5 - при попытке ввести 55 находится соответствие с первой же посылкой

посмотрите на Read

Re: GotoIf LEN не работает

Добавлено: 16 июн 2022, 09:40
alennox
посмотрел, все тоже самое, если есть цифра 5 в правилах, а ты набираешь 546, то астер не обращает на них внимание и сразу отправляет в 5
exten => 5,1,GotoIf($["${LEN(${EXTEN})}" = "1"]?vspisok,s,1:i,1)
Получается ты позвонил, попал на голосовое меню, набрал 53432344 и тебя все равно переключили на 5

Re: GotoIf LEN не работает

Добавлено: 16 июн 2022, 10:51
Wapo
При IVR-ах следует избегать конструкций типа:

exten => 1,1,Goto(office1)
exten => 123,1,Dial(SIP/123)

Проверка на размер ввода - ваще ерунда т.е. вы проверяете ${EXTEN} в жестком ЭКСТЕНЕ 5, ну а на все остальное остается exten => i,1,Playback(неверно)

В вашем случае я бы отказался от WaitExten, а использовал Read()

Re: GotoIf LEN не работает

Добавлено: 16 июн 2022, 11:09
alennox
Таких конструкций нет, согласен это плохо.
Как же тогда эту 5 ку зажать? Нужно чтобы при наборе 56345 срабатывал exten => i,1,Playback(неверно)
а он отрабатывает когда нажимаю всё кроме 5ХХХХХХХ.
Тоесть нужно ожидание ввода или шаблон какой то типа _5Х

А если у тебя есть несколько уровней в голосовом меню, типа нажмите 5 чтобы прослушать все подразделения,
а потом нажмите 1 -пто, 2 -бух, 3- изо и тд.
Получается нажимаешь 51 при звонке на IVR и сразу попадаешь в ПТО, а нужно было не туда.
То есть должна быть какая то защита от перемещения в многоуровневом голосовом меню при наборе 511 или 522

Re: GotoIf LEN не работает

Добавлено: 16 июн 2022, 13:05
alennox
Стало немного лучше после Read
Подскажите пожалуйста как лучше устроить сравнение и перевод на контекст, сделал как ниже, но это криво
и тут всегда будет срабатывать 3я строчка. Если ввести 2, на 4ую строку астер не пойдет.

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

[ivr]
exten => s,1,Answer()
exten => s,2,Read(var,/etc/asterisk/ivr/hello,4,,3,5)
exten => s,n,GotoIf($["${var}" = "1"]?pto,s,1:i,1)
exten => s,n,GotoIf($["${var}" = "2"]?voda,s,1:i,1)

Re: GotoIf LEN не работает

Добавлено: 16 июн 2022, 13:08
Zavr2008
Уважаемый Wapo прав:
exten => 4,1,GotoIf($["${LEN(${EXTEN})}" = "1"]?voda,s,1:i,1)
уже сразу только 4 там будет, а не 411 итп.

Вы можете просто вот что сделать:

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

exten => 4,1,Goto(voda,s,1)
exten => _4XX.,1,Goto(ivr-main,i,1)
exten => 5,1,GotoIf($["${LEN(${EXTEN})}" = "1"]?vspisok,s,1:i,1)
exten => _5XX.,1,Goto(spisok,s,1)