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

Macro, Goto и екстенш i

Проблемы Asterisk без вэб-оболочек и их решения

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

Ответить
rioakaanhell
Сообщения: 16
Зарегистрирован: 26 мар 2014, 17:35

Macro, Goto и екстенш i

Сообщение rioakaanhell »

День был добрый.

Вот такой вот возник вопрос:

В описании Goto есть такие строки:
If the location that is put into the channel information is bogus, and asterisk cannot
find that location in the dialplan,
then the execution engine will try to find and execute the code in the 'i' (invalid)
extension in the current context. If that does not exist, it will try to execute the
'h' extension. If either or neither the 'h' or 'i' extensions have been defined, the
channel is hung up, and the execution of instructions on the channel is terminated.
Собственно есть некий Макрос:

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


[macro-test]
exten => s,1,NoOp()
same => n,----[Назначаем переменные и всякое такое]----

same => n,Goto(ext-${MACRO_EXTEN},1)

same => n(backnoexist),NoOp()
same => n,Dial(SIP/${MACRO_EXTEN},${DIALTIMEOUT},XxTtr)

same => n(back),NoOp()
same => n, --- [тут тоже некий диалплан]---
same => n(end),NoOp()

exten => ext-123,1,NoOp()
same => n,Set(CDR(userfield)=test)
same => n,Dial(SIP/${MACRO_EXTEN},${DIALTIMEOUT},XxTtr)
same => n,Goto(s,back)

exten => i,1,NoOp()
same => n,Goto(s,backnoexist)


Объясню чего добаиваюсь:
при наборе добавочного вызывается макрос, выполняется некий общий диалплан. Затем совершается переход на екстеншн, в котором может быть описан индивидуальный кусочек для определенного екстеншена и возвращется на определенную мету в екстеншене s.

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

Почему так? Свойства работы Goto не распространяются на макросы? Или там есть какие-то особенности?


П.С. Если набрать добавочный 123, то все отлично работает: переходит на ext-123 обрабатывает его, возвращается в s доделывает его, выходит из Макроса.
Если набрать, предположим 124, то переходит на ext-124, не находит его, не пытается найти i, а просто выходит из Макроса.


Спасибо.
ded
Сообщения: 15625
Зарегистрирован: 26 авг 2010, 19:00

Re: Macro, Goto и екстенш i

Сообщение ded »

Новый синтаксис same => сильно затуманивает картинку. Перепишите ваш макрос традиционным видом,

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

[macro-test]
exten => s,1,NoOp()
exten => s,n,Set(MACRO_EXTEN=${ARG1})
exten => s,n,Goto(ext-${MACRO_EXTEN},1)

exten => s,n(backnoexist),NoOp(${MACRO_EXTEN})
exten => ext-${MACRO_EXTEN},n,Dial(SIP/${MACRO_EXTEN},${DIALTIMEOUT},XxTtr)
и поймёте, почему ext-124 не обрабатывался.
virus_net
Сообщения: 2337
Зарегистрирован: 05 июн 2013, 08:12
Откуда: Москва

Re: Macro, Goto и екстенш i

Сообщение virus_net »

В Asterisk 1.8 он точно завершает выполнение MACRO и выходит НЕ отрабатывая i.

https://wiki.asterisk.org/wiki/display/ ... Extensions
i: Invalid entry extension
If Asterisk can't find an extension in the current context that matches the digits dialed during the Background() or WaitExten() applications, it will send the call to the i extension. You can then handle the call however you see fit.
С макрсами не все так просто. Там есть ограничения, например с тем же WaitExten.
Так же вот ещё пример: http://www.voip-info.org/wiki/view/Asterisk+cmd+Macro
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER:
Note 2

Note that key presses within a macro will cause a jump to the calling context and WILL NOT jump to the appropriate extension within the macro context. This is a shame and means code becomes a lot more complex. By way of example, with the following dial plan, the caller hears "One" and not "Two".

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

[default]
; Call starts at s,1 here

exten => s,1,Macro(examplemacro,ARG1,...ARGx)
exten => s,n,Goto(1)

; When caller presses '1' inside the macro, we jump here instead
; of within the macro. Bummer.
exten => 1,1,SayDigits(1)
exten => 1,n,Hangup

[macro-examplemacro]
; ARGx - whatever you want

exten => s,1,Set(TIMEOUT(response)=5)
; Ask the caller to press '1'.
exten => s,n,Background(pressone)

; You would expect this extension to be jumped to
; when the caller presses '1'. It isn't.
exten => 1,1,SayDigits(2)

exten => t,1,Goto(s,1)
Выходом может стать goto из макроса в контекст и вот там заюзать i.
мой SIP URI sip:virus_net@asterisk.ru
bitname.ru - Домены .bit (namecoin) .emc .coin .lib .bazar (emercoin)

ENUMER - звони бесплатно и напрямую.
Ответить
© 2008 — 2024 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH