ВидеоКонф(ВКС)  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

Звонит клиент. Как ему проиграть НЕСКОЛЬКО файлов при ответе

Проблемы и их решения Asterisk как такового

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

Re: Звонит клиент. Как ему проиграть НЕСКОЛЬКО файлов при от

Сообщение Felt » 01 ноя 2017, 12:30

Интересно, а опции b и B нельзя притянуть в этой задаче?

Код: выделить все
[default]

exten => callee_channel,1,NoOp()
same => n,Log(NOTICE, I'm called on channel ${CHANNEL} prior to it starting the dial attempt)
same => n,Return()

exten => called_channel,1,NoOp()
same => n,Log(NOTICE, I'm called on outbound channel ${CHANNEL} prior to it being used to dial someone)
same => n,Return()

exten => _X.,1,NoOp()
same => n,Dial(PJSIP/alice,,b(default^called_channel^1)B(default^callee_channel^1))
same => n,Hangup()


b( context^exten^priority ) - Before initiating an outgoing call, Gosub to the specified location using the newly created channel. The Gosub will be executed for each destination channel.
context
exten
priority( params )
arg1[^arg1...]
argN

B( context^exten^priority ) - Before initiating the outgoing call(s), Gosub to the specified location using the current channel.
context
exten
priority( params )
arg1[^arg1...]
argN


Из-за вылетания Астериска решил обновиться до последнего и обнаружил, что в 15-м Астериске macro пришло в немилость, теперь оно в разделе Deprecated. Перешли полностью на GoSub, что в общем-то более правильно (хотя возможно еще правильнее было бы macro сделать более функциональным, чем делать GoSub).
Felt
 
Сообщений: 66
Зарегистрирован: 25 фев 2017, 16:52

Re: Звонит клиент. Как ему проиграть НЕСКОЛЬКО файлов при от

Сообщение Felt » 01 ноя 2017, 14:31

BorisTheBlade писал(а):Есть такая штука как метки:
Код: выделить все
exten => s,1,Goto(sudapodowel)
exten => s,n,Hangup()
exten => s,n(sudapodowel), Noop(suda podowel :))

Хотя Goto считается дурным тоном, но диалплан астериска все же не С++.

Да нет на самом деле никакой проблемы:
Вот код без приоритетов и зомбей, хотя что делать с СДР ума не приложу :)
Получилось даже проще чем до того:

Код: выделить все
[incoming]
exten => 1,1,Set(__chan=${CHANNEL})
exten => 1,n,dial(SIP/200,,M(test2-dial-takeup))

[macro-test2-dial-takeup]
exten => s,1,noop(macros answer, ${chan})

exten => s,n,Set(SHARED(oper,${chan})=${CHANNEL})
exten => s,n,ChannelRedirect(${chan},play,cust,1)
exten => s,n,ChannelRedirect(${CHANNEL},play,oper,1)

[play]
exten => oper,1,Background(hello)
exten => oper,n,Wait(300)

exten => cust,1,Noop()
exten => cust,n,Background(tt-monkeys)
exten => cust,n,Bridge(${SHARED(oper)})


Следуя рекомендациям отказа от Macro в пользу GoSub изменил в вашем коде в dial параметр M на U:
Код: выделить все
[incoming]
exten => _X.,1,Set(__chan=${CHANNEL})
same => n,dial(SIP/50,,U(test-dial-takeup))

[test-dial-takeup]
exten => s,1,noop(Подняли трубку)

same => n,Set(SHARED(oper,${chan})=${CHANNEL})
same => n,ChannelRedirect(${chan},talk_customer,200,1)
same => n,ChannelRedirect(${CHANNEL},talk_op,100,1)
;same => n,Return() --> ВОПРОС ЗДЕСЬ! <--

[talk_customer]
exten => _X.,1,Background(hello)
same => n,Wait(300)

[talk_op]
exten => _X.,1,Noop()
same => n,Background(tt-monkeys)
same => n,Bridge(${SHARED(oper)})


Без Return() выдаёт некрасивые предупреждения, но работает как положено:
Код: выделить все
    -- Executing [s@test-dial-takeup:1] noop("SIP/50-00000001", "Подняли трубку")
    -- Executing [s@test-dial-takeup:3] ChannelRedirect("SIP/50-00000001", "SIP/provider-00000000,talk_customer,200,1")
    -- Executing [s@test-dial-takeup:4] ChannelRedirect("SIP/50-00000001", "SIP/50-00000001,talk_op,100,1")
[2017-11-01 16:56:14] NOTICE[5853][C-00000001]: app_stack.c:1080 gosub_run: Surrogate/SIP/50-00000001 Abnormal 'Gosub(test-dial-takeup,s,1)' exit.  Popping routine return locations.
[2017-11-01 16:56:14] WARNING[5853][C-00000001]: app_stack.c:938 balance_stack: No Gosub stack allocated.



С Return() выдаёт другие некрасивые предупреждения и при этом оператор сразу после поднятия трубки отключается:
Код: выделить все
    -- Executing [s@test-dial-takeup:1] noop("SIP/50-00000001", "Подняли трубку")
    -- Executing [s@test-dial-takeup:3] ChannelRedirect("SIP/50-00000001", "SIP/provider-00000000,talk_customer,200,1")
    -- Executing [s@test-dial-takeup:4] ChannelRedirect("SIP/50-00000001", "SIP/50-00000001,talk_op,100,1")
    -- Executing [100@talk_op:1] Return("SIP/50-00000001", "")
[2017-11-01 17:09:04] ERROR[6981][C-00000003]: pbx_lua.c:1415 exec: Could not find extension  in context office
  == Spawn extension (office, , 1) exited non-zero on 'SIP/50-00000001'
  == Spawn extension (test-dial-takeup, s, 1) exited non-zero on 'Surrogate/SIP/50-00000001'
[2017-11-01 17:09:04] NOTICE[6978][C-00000001]: app_stack.c:1080 gosub_run: Surrogate/SIP/50-00000001 Abnormal 'Gosub(test-dial-takeup,s,1)' exit.  Popping routine return locations.
[2017-11-01 17:09:04] WARNING[6978][C-00000001]: app_stack.c:938 balance_stack: No Gosub stack allocated.


Т.е. судя по тексту "Executing [100@talk_op:1] Return("SIP/50-00000001", "")" Return срабатывает в перенаправленном канале уже в контексте talk_op. И это видимо ему не нравится.


Глядя на ошибку "Could not find extension in context office" и "office, , 1" решил добавить для интереса возврат непустого значения, чтобы он хоть что-то попробовал найти.
С Return(s) вылетает Астериск напрочь:
Код: выделить все
    -- Executing [s@test-dial-takeup:1] noop("SIP/50-00000001", "Подняли трубку")
    -- Executing [s@test-dial-takeup:3] ChannelRedirect("SIP/50-00000001", "SIP/provider-00000000,talk_customer,200,1")
    -- Executing [s@test-dial-takeup:4] ChannelRedirect("SIP/50-00000001", "SIP/50-00000001,talk_op,100,1")
ats-asterisk-1017*CLI>
Disconnected from Asterisk server
Asterisk cleanly ending (0).
Executing last minute cleanups


Подскажите, как сделать корректно, чтобы Asterisk был полностью удовлетворён кодом?
Felt
 
Сообщений: 66
Зарегистрирован: 25 фев 2017, 16:52

Пред.

Вернуться в Конфигурация и настройка Asterisk

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 27

© 2008 — 2024 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH