VIDEOCHAT  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

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

Новичком считается только что прочитавший «Астериск - будущее телефонии»
http://asterisk.ru/knowledgebase/books
и пытающийся сделать большее

Модераторы: april22, Zavr2008

alennox
Сообщения: 86
Зарегистрирован: 28 июн 2021, 07:05

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

Сообщение 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)
alennox
Сообщения: 86
Зарегистрирован: 28 июн 2021, 07:05

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

Сообщение alennox »

Астер при вводе 55 хватает первую и передает ее в нужный экстеншн, сравнивает и дает ложь, все верно. Надо заставить астер хватать все введенные цифры, как это сделать?
alennox
Сообщения: 86
Зарегистрирован: 28 июн 2021, 07:05

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

Сообщение 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
alennox
Сообщения: 86
Зарегистрирован: 28 июн 2021, 07:05

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

Сообщение 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ки все равно идет дальше.
Vlad1983
Сообщения: 4251
Зарегистрирован: 09 авг 2011, 11:51

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

Сообщение Vlad1983 »

WaitExten всегда переходит по наибольшему совпадению в текущем контексте
нет вариантов больше 5 - при попытке ввести 55 находится соответствие с первой же посылкой

посмотрите на Read
ЛС: @rostel
alennox
Сообщения: 86
Зарегистрирован: 28 июн 2021, 07:05

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

Сообщение alennox »

посмотрел, все тоже самое, если есть цифра 5 в правилах, а ты набираешь 546, то астер не обращает на них внимание и сразу отправляет в 5
exten => 5,1,GotoIf($["${LEN(${EXTEN})}" = "1"]?vspisok,s,1:i,1)
Получается ты позвонил, попал на голосовое меню, набрал 53432344 и тебя все равно переключили на 5
Аватара пользователя
Wapo
Сообщения: 795
Зарегистрирован: 02 мар 2011, 17:53

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

Сообщение Wapo »

При IVR-ах следует избегать конструкций типа:

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

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

В вашем случае я бы отказался от WaitExten, а использовал Read()
alennox
Сообщения: 86
Зарегистрирован: 28 июн 2021, 07:05

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

Сообщение alennox »

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

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

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

Сообщение 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)
Аватара пользователя
Zavr2008
Сообщения: 2211
Зарегистрирован: 27 янв 2011, 00:35
Контактная информация:

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

Сообщение 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)
Российские E1 шлюзы Alvis. Модернизация УПАТС с E1,Подключение к ИС "Антифрод" E1 PRI/SS#7 УВР Телестор, Грифин и др..
Ответить
© 2008 — 2024 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH