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 был полностью удовлетворён кодом?