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

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

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

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

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

Сообщение BorisTheBlade » 29 окт 2017, 19:33

Написание и тестирование заняло минут 15 :) Хоть в казино иди :)


Код: выделить все
[incoming]
exten => 1,1,Set(__FOO=${CHANNEL})
exten => 1,n,Dial(SIP/200,30,G(g100^go^1))

[g100]
exten => go,1,Goto(play_customer,1)
exten => go,n,Goto(play_operator,1)

exten => play_customer,1,Noop(${FOO})
exten => play_customer,n,Wait(200)
exten => play_customer,n,Hangup()
exten => play_customer,n(play),Playback(hello-world)
exten => play_customer,n,Playback(hello-world)
exten => play_customer,n,Noop(${SHARED(operator)})
exten => play_customer,n,Bridge(${SHARED(operator)})

exten =>play_operator,1,Noop(${FOO})
exten =>play_operator,n,Playback(good-evening)
exten =>play_operator,n,Set(SHARED(operator,${FOO})=${CHANNEL})
exten =>play_operator,n,ChannelRedirect(${FOO},g100,play_customer,play)
exten =>play_operator,n,Wait(200)
exten =>play_operator,n,Hangup()



Есть ньюансы с c отбоем, но тут уже сами смотрите.
BorisTheBlade
 
Сообщений: 167
Зарегистрирован: 14 фев 2011, 15:24

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

Сообщение Felt » 29 окт 2017, 19:44

Нашел, что 13-й Астериск вылетает в макросе поднятия трубки оператором на строчке:
Код: выделить все
[macro-test2-dial-takeup]
...
same => n,Bridge(${chan})

видать это не совсем корректно бриджевать каналы в дочернем макросе.


Кстати, эти две инородные строчки:
Код: выделить все
same => n,System(echo "Channel: Local/100@test2a\nMaxRetries: 1\nRetryTime: 5\nWaitTime: 20\nContext: test2b\nExtension: 100\nPriority: 1\nSet: chan=${chan}\nArchive: yes\n" > /tmp/file.call)
same => n,System(mv /tmp/file.call /var/spool/asterisk/outgoing/)

можно заменить одной командой:
Код: выделить все
same => n,Originate(Local/${chan:4}@test2a,exten,test2b,100,1)

а вместо :
Код: выделить все
same => n,Bridge(${chan})

в test2a и использовать:
Код: выделить все
same => n,Bridge(SIP/${EXTEN})

Так мы передадим канал не в виде переменной, а как номер exten. Да и избавимся от вызова не самых быстрых системных функций.
Проверил - работает.

[Показать] Спойлер:
[incoming]
exten => provider,1,Set(__chan=${CHANNEL})
same => n,dial(SIP/50,,M(test2-dial-takeup))

[macro-test2-dial-takeup]
exten => s,1,noop(macros answer, ${chan})
same => n,Originate(Local/${chan:4}@test2a,exten,test2b,100,1)
same => n,Background(hello)
same => n,Background(hello)
same => n,Background(hello)
same => n,Background(hello)
same => n,Background(hello)
same => n,Bridge(${chan})

[test2a]
exten => _X.,1,NoOp(test2a)
same => n,Answer()
same => n,Bridge(SIP/${EXTEN})
same => n,Hangup()

[test2b]
exten => _X.,1,NoOp(test2b)
same => n,Answer()
same => n,playback(tt-monkeys)
same => n,Hangup()
Последний раз редактировалось Felt 29 окт 2017, 19:54, всего редактировалось 3 раз(а).
Felt
 
Сообщений: 66
Зарегистрирован: 25 фев 2017, 16:52

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

Сообщение Felt » 29 окт 2017, 19:48

BorisTheBlade писал(а):Написание и тестирование заняло минут 15 :) Хоть в казино иди :)


Код: выделить все
[incoming]
exten => 1,1,Set(__FOO=${CHANNEL})
exten => 1,n,Dial(SIP/200,30,G(g100^go^1))

[g100]
exten => go,1,Goto(play_customer,1)
exten => go,n,Goto(play_operator,1)

exten => play_customer,1,Noop(${FOO})
exten => play_customer,n,Wait(200)
exten => play_customer,n,Hangup()
exten => play_customer,n(play),Playback(hello-world)
exten => play_customer,n,Playback(hello-world)
exten => play_customer,n,Noop(${SHARED(operator)})
exten => play_customer,n,Bridge(${SHARED(operator)})

exten =>play_operator,1,Noop(${FOO})
exten =>play_operator,n,Playback(good-evening)
exten =>play_operator,n,Set(SHARED(operator,${FOO})=${CHANNEL})
exten =>play_operator,n,ChannelRedirect(${FOO},g100,play_customer,play)
exten =>play_operator,n,Wait(200)
exten =>play_operator,n,Hangup()



Есть ньюансы с c отбоем, но тут уже сами смотрите.


Когда мне в пятницу предложили такой вариант с G, то я тоже захлопал в ладоши от радости.

Но оказалось такой вариант не работает в extensions.lua, т.к. в диалпланах на LUA нет приоритета 2. Поэтому в [g100] одна половина вызова придёт, а вторая нет (проверено)!

Да и в классическом диалпане с G негладко: отбой странный, зомби-каналы у меня вылезли, в CDR бардак начался, неправильный учет времени разговора - слишком много кривых нюансов, недостатки перевешивают результат.
Felt
 
Сообщений: 66
Зарегистрирован: 25 фев 2017, 16:52

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

Сообщение BorisTheBlade » 29 окт 2017, 21:14

Про ньюансы с отбоем, имел ввиду что отбой будет в контексте г100, а не в инкоминг.
Зомбей у меня нет(версия астериска 13.16.0), посмотрел код с Г выше, не удивительно что зомби, в той мешанине отладить вообще что-то сложно будет. Если wait правильно расставить зомби пропадут я думаю и там.
В CDR три записи, наверное можно и с этим сделать что-нибудь - я не заморачивался, просто пруф оф концепт проверил.
То что в луа нет приоритетов, дело хозяйское, но на приоритетах очень много кода строится обычно, как без этого я хз.
BorisTheBlade
 
Сообщений: 167
Зарегистрирован: 14 фев 2011, 15:24

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

Сообщение Felt » 29 окт 2017, 21:22

Да, про отбой в левом контексте я понял о чем вы.

Когда начал изучать Астериск несколько лет назад - мне сразу идея с приоритетами не показалась удачной. Магические числа - зло в разработке. Почему приоритет 2? Или иногда 100? Нехорошая практика зашивать цифры в код.

Ладно, похоже проще через sox продолжать склеивать wav-файлы, раз такая кривость в Астериске из-за такого пустяка.

Но если у кого-то появится рабочая идея - буду признателен.

Пока все решения имеют побочные эффекты худшие, чем быстрое склеивание sox. Но и sox так же неправильно использовать как приоритет 2, плодить каналы, прыжки по контекстам, создавать call-файлы, нарушать последовательность и логичность кода.
Felt
 
Сообщений: 66
Зарегистрирован: 25 фев 2017, 16:52

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

Сообщение BorisTheBlade » 29 окт 2017, 21:49

Есть такая штука как метки:
Код: выделить все
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)})
BorisTheBlade
 
Сообщений: 167
Зарегистрирован: 14 фев 2011, 15:24

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

Сообщение Felt » 30 окт 2017, 10:40

Ваша идея оказалась пока лучше всех. Ошибок нет, зомби нет.

Единственное записей в CDR в 2 раза больше обычного: причем одна из них NO ANSWER. Непонятно как будет реагировать 1С на такие нововведения, будем адаптироваться если такой способ приживётся.
Felt
 
Сообщений: 66
Зарегистрирован: 25 фев 2017, 16:52

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

Сообщение Felt » 30 окт 2017, 11:15

Если длина роликов разная (а она и будет разная), то нужно дать сигнал оператору, что пора говорить.
Пробую это сделать опцией L или p команды bridge - Asterisk вылетает по-разному.
1. То якобы нет таблицы extensions

2. То тысячи таких одинаковых сообщений:
Код: выделить все
[2017-10-30 14:10:54] ERROR[8924]: astobj2.c:131 INTERNAL_OBJ: FRACK!, Failed assertion bad magic number 0x0 for object 0x2ccac80 (0)
Got 12 backtrace records
#0: [0x620441] /usr/sbin/asterisk(__ast_assert_failed+0x8d) [0x620441]
#1: [0x45fa33] /usr/sbin/asterisk() [0x45fa33]
#2: [0x45faa2] /usr/sbin/asterisk(__ao2_lock+0x2b) [0x45faa2]
#3: [0x4bded4] /usr/sbin/asterisk() [0x4bded4]
#4: [0x4c046a] /usr/sbin/asterisk(ast_read+0x1d) [0x4c046a]
#5: [0x46a68f] /usr/sbin/asterisk() [0x46a68f]
#6: [0x61cfe9] /usr/sbin/asterisk() [0x61cfe9]

Адреса строк меняются даже в пределах одной секунды вывода этих ошибок.

3. То просто молча - хлоп и нет Астериска в памяти.

Иногда это случается не с первого раза, а со второго или пятого звонка. Прям весь сыпется ошибками, если самому бриджевать каналы, особенно с доп. опциями.


ded писал, что в опции A можно задавать несколько имён файлов:
Код: выделить все
dial(SIP/50,,A(hello,hello,hello))

но у меня выдаёт ошибку, воспринимая это за единый файл:
Код: выделить все
[2017-10-30 14:22:15] WARNING[10138][C-00000002]: file.c:774 ast_openstream_full: File hello,hello,hello does not exist in any format
[2017-10-30 14:22:15] WARNING[10138][C-00000002]: file.c:1247 ast_streamfile: Unable to open hello,hello,hello (format (alaw)): No such file or directory
Felt
 
Сообщений: 66
Зарегистрирован: 25 фев 2017, 16:52

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

Сообщение Vlad1983 » 30 окт 2017, 12:33

Код: выделить все
dial(SIP/50,,A(hello&hello&hello))
ЛС: @rostel
Vlad1983
 
Сообщений: 4251
Зарегистрирован: 09 авг 2011, 11:51

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

Сообщение Felt » 30 окт 2017, 19:26

Не помогло, та же история:
Код: выделить все
    -- Executing [9333333333@incoming:1] dial("SIP/9333333333-00000032", "SIP/50,,A(hello&hello&hello)")
...
[2017-10-30 22:23:48] WARNING[6606][C-00000012]: file.c:774 ast_openstream_full: File hello&hello&hello does not exist in any format
[2017-10-30 22:23:48] WARNING[6606][C-00000012]: file.c:1247 ast_streamfile: Unable to open hello&hello&hello (format (alaw)): No such file or directory
[2017-10-30 22:23:48] ERROR[6606][C-00000012]: app_dial.c:2870 dial_exec_full: error streaming file 'hello&hello&hello' to callee
Felt
 
Сообщений: 66
Зарегистрирован: 25 фев 2017, 16:52

Пред.След.

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

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

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

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