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

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

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

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

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

Сообщение Felt » 23 окт 2017, 17:57

Задача: при входящем звонке в момент поднятия трубки оператором нужно проиграть НЕСКОЛЬКО файлов оператору и НЕСКОЛЬКО файлов клиенту. В идеале одновременно, но буду рад и последовательному.

Решение 1
Можно просто проиграть оператору ОДИН файл, а после этого обоим одинаковый другой файл, но тоже ОДИН:
Код: выделить все
    channel["LIMIT_PLAYAUDIO_CALLER"]:set("yes")
    channel["LIMIT_PLAYAUDIO_CALLEE"]:set("yes")
    channel["LIMIT_CONNECT_FILE"]:set("client1")
    app.dial("SIP/50,60,L(9999999)A(operator1)")

Если с логикой еще можно стерпеться, то с количеством файлов никак не могу - нужно именно несколько отдельных файлов клиенту и несколько других файлов оператору.

Решение 2
Можно через макрос добиться проигрывания НЕСКОЛЬКИХ файлов оператору и ОДИН файл клиенту.
Код: выделить все
function test_dial_takeup(ctx, ext)
    app.background("operator1")
    app.background("operator2")
    app.background("operator3")
    app.background("operator4")
    app.background("operator5")
end
...
...
    channel["LIMIT_PLAYAUDIO_CALLER"]:set("yes")
    channel["LIMIT_PLAYAUDIO_CALLEE"]:set("yes")
    channel["LIMIT_CONNECT_FILE"]:set("client1")
    app.dial("SIP/50,60,M(test-dial-takeup)L(9999999)")

Тут почти как нужно, оператору играем сколько хотим файлов. Правда в этом время клиент просто ждет слушая гудки - это минус.
Но клиенту мы по прежнему играем только ОДИН файл! Как сделать несколько?
Пробовал указывать несколько файлов через символы , ^ | &, но ничего не помогло (считает эти спец.символы за часть имени файла и не находит его).

Решения 3, 4 и 5
Пробовал несколько вариантов через Originate и ChanSpy:
Код: выделить все
app.Originate("Local/50@test,app,Playback,operator1")

и так:
Код: выделить все
app.Originate("SIP/50,app,Playback,operator1")

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

Код: выделить все
app.ChanSpy("SIP/" .. ext .. ",BEq")

При ChanSpy речь произносится обоим, но при этом и голос слышится. А мне нужно, чтобы речь людей не была слышна друг другу до проигрывания нескольких файлов.

Можно попробовать создать call-файл. Но что-то не догоняю саму суть - с какой командой?
Чую, что нужно сунуть ногу к клиенту (пока не соединенному с оператором) и проговорить файлы.
И хотелось бы избежать параллельных звонков, они мусорят всюду. Хотелось бы как-то нативно и логично: одной стороне вызвать одни Playback'и, другой стороне другие и после этого сбриджевать абонентов.

Как, толкните меня в правильное русло, весь мозг выел себе уже :)
Felt
 
Сообщений: 66
Зарегистрирован: 25 фев 2017, 16:52

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

Сообщение ded » 23 окт 2017, 21:57

Если возможно - не надо ael, lua, pyton, perl, etc.
Через call file так: сначала одно плечо, как только Answer - начинает проговаривать оператору и строит второе плечо - клиенту, начинает проговаривать ему.

Channel: Local/operator@talk_op
Extension:50
Context: talk_customer
Retry:1
Код: выделить все
[talk_op]
exten => operator,1,Dial(SIP/provider/${DIALEDNUMBER},,A(operator1,operator2,operator3))

[talk_customer]
exten => 50,1,Dial(SIP/${EXTEN},,A(customer1,customer2,customer3)


Call file создаём в /var/spool/asterisk/tmp и потом копируем (или перемещаем) в /var/spool/asterisk/outgoing
ded
 
Сообщений: 15817
Зарегистрирован: 26 авг 2010, 19:00

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

Сообщение Felt » 23 окт 2017, 22:16

Спасибо за попытку помочь!

Наверное у вас опечатка и нужно так?
Код: выделить все
[talk_op]
exten => operator,1,Dial(SIP/${EXTEN},,A(operator1,operator2,operator3))

[talk_customer]
exten => 50,1,Dial(SIP/provider/${DIALEDNUMBER},,A(customer1,customer2,customer3)


Но всё-равно я не понял в какой момент мне создавать колл-файлы? В макросе, когда оператор поднял трубку? Зачем тогда их два создавать?

Разжуйте, пожалуйста, чуть подробнее, не догоняю.
Felt
 
Сообщений: 66
Зарегистрирован: 25 фев 2017, 16:52

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

Сообщение ded » 23 окт 2017, 23:02

Не, разжёвывать - не могу.
Про call files достаточно уже много написано в сети, просто читайте.
Считайте что я уже всё разжевал и разложил по разным местам.
ded
 
Сообщений: 15817
Зарегистрирован: 26 авг 2010, 19:00

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

Сообщение Felt » 24 окт 2017, 07:46

Call-файлы и их содержимое - не проблема. Я сторонник не call-файлов, а подключаться и давать команды по AMI (можно прямо из диалплана используя тот же LUA, не передавая управление другим языкам, всё в одном месте). Хотя тестировать через call-файлы наверное удобнее.

Я не могу понять суть вашей реализации. Не пойму, как таким способом мы сунем ноги во входящий звонок? Мне казалось нужно зная каналы как-то хитро сделать Playback в них.

Приеду в офис попробую вашу хитрую схему.

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

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

Сообщение ded » 24 окт 2017, 10:35

Что команда originate из командной строки, что из AMI, что call file - это, по сути, одно и то же.
Я код из головы писал, не тестировал. У Вас есть возможность попробовать и так, и эдак.
ded
 
Сообщений: 15817
Зарегистрирован: 26 авг 2010, 19:00

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

Сообщение Felt » 25 окт 2017, 10:26

Перепробовал по-разному, ничего не вышло.

Создал в /etc/asterisk/test.call:
Код: выделить все
Channel: Local/50@talk_op
Extension:50
Context: talk_customer
Retry:1
Priority: 1
Archive: yes


Кусок диалплана (переведенного из LUA в классический conf, могут быть мелкие ошибки):
Код: выделить все
[incoming]
exten => _X.,1,dial(SIP/50,60,M(test-dial-takeup))

[macro-test-dial-takeup]
exten => s,1,noop(Подняли трубку, копируем test.call)
same => n,system("cp /etc/asterisk/test.call /var/spool/asterisk/outgoing/test.call")

[talk_op]
exten => _X.,1,noop(talk_op)
same => n,Dial(SIP/50,,A(operator1))

[talk_customer]
exten => _X.,1,noop(talk_customer)
same => n,Dial(SIP/provider/9333333333,,A(customer1))


Пробовал и такой вариант:
Код: выделить все
[talk_op]
exten => _X.,1,noop(talk_op)
same => n,Dial(SIP/provider/9333333333,,A(operator1))

[talk_customer]
exten => _X.,1,noop(talk_customer)
same => n,Dial(SIP/50,,A(customer1))


Соединение происходит сразу же, никому никакой текст не произносится.
Даже почему-то не входит в контексты talk_op и talk_customer.

После звонка в /var/spool/asterisk/outgoing_done содержимое test.call такое:
Код: выделить все
Channel: Local/50@talk_op
Extension: 50
Context: talk_customer
Retry: 1
Priority: 1
Archive: yes
Status: Expired


Лог:
Код: выделить все
[2017-10-25 13:00:19] VERBOSE[30496][C-00000064] app_dial.c: Called SIP/50
[2017-10-25 13:00:21] VERBOSE[30496][C-00000064] app_dial.c: SIP/50-000000e1 is ringing
[2017-10-25 13:00:22] VERBOSE[30496][C-00000064] app_dial.c: SIP/50-000000e1 answered SIP/provider-000000e0
[2017-10-25 13:00:22] VERBOSE[30496][C-00000064] pbx_lua.c: Executing [s@macro-test-dial-takeup:1] noop("SIP/50-000000e1", "Подняли трубку, копируем test.call")
про копирование test.call в логе ничего нет, т.к. он копируется средствами LUA без прямого участия Asterisk (но файл точно копируется)
[2017-10-25 13:00:22] NOTICE[6578]: pbx_spool.c:541 scan_service: Queued call to Local/50@talk_op expired without completion after 0 attempts
[2017-10-25 13:00:22] VERBOSE[30517][C-00000064] bridge_channel.c: Channel SIP/50-000000e1 joined 'simple_bridge' basic-bridge <229c2f73-6ccf-4dcf-9ed7-718bdcca9afd>
[2017-10-25 13:00:22] VERBOSE[30496][C-00000064] bridge_channel.c: Channel SIP/provider-000000e0 joined 'simple_bridge' basic-bridge <229c2f73-6ccf-4dcf-9ed7-718bdcca9afd>
[2017-10-25 13:00:22] VERBOSE[30517][C-00000064] res_rtp_asterisk.c: 0x7f655c070fe0 -- Probation passed - setting RTP source address to 192.168.0.143:5014
[2017-10-25 13:00:22] VERBOSE[30496][C-00000064] res_rtp_asterisk.c: 0x7f65c004c7b0 -- Probation passed - setting RTP source address to 80.75.132.66:43948
[2017-10-25 13:00:30] VERBOSE[30517][C-00000064] bridge_channel.c: Channel SIP/50-000000e1 left 'simple_bridge' basic-bridge <229c2f73-6ccf-4dcf-9ed7-718bdcca9afd>
[2017-10-25 13:00:30] VERBOSE[30496][C-00000064] bridge_channel.c: Channel SIP/provider-000000e0 left 'simple_bridge' basic-bridge <229c2f73-6ccf-4dcf-9ed7-718bdcca9afd>
[2017-10-25 13:00:30] VERBOSE[30496][C-00000064] pbx.c: Spawn extension (incoming, provider, 1) exited non-zero on 'SIP/provider-000000e0'
Felt
 
Сообщений: 66
Зарегистрирован: 25 фев 2017, 16:52

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

Сообщение ded » 25 окт 2017, 10:56

Попробуйте без копирования, без макроса, упростите тест насколько возможно.
то что команда Dial(SIP/50,,A(operator1)) вызывает SIP/50 и проигрывает файл operator1 - факт.
Из этого факта и исходите.
Если Вы будете ставить опыты, результаты которых не будете тут публиковать, а будете анализировать самостоятельно, то Вы просто быстрее придёте к результату.
ded
 
Сообщений: 15817
Зарегистрирован: 26 авг 2010, 19:00

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

Сообщение Felt » 25 окт 2017, 12:25

Попробуйте без копирования, без макроса, упростите тест насколько возможно.

Так уже упрощено до минимального.
А как без макроса, если мне нужно проиграть текст при поднятии трубки оператором? Без макроса произнесется сразу же при входящем вызове.

то что команда Dial(SIP/50,,A(operator1)) вызывает SIP/50 и проигрывает файл operator1 - факт.
Из этого факта и исходите.

Согласен, это факт. Но я не понимаю как мне проиграть несколько файлов другой стороне так же.

Если Вы будете ставить опыты, результаты которых не будете тут публиковать, а будете анализировать самостоятельно, то Вы просто быстрее придёте к результату.

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

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

Сообщение Repz » 25 окт 2017, 12:51

Удачно совпало, я тоже сейчас подобным занимаюсь))

вот для понимания :
входящий на 77 и originate на номер 930, у каждого свой playback, дальше собираем вместе через ConfBridge.

exten => 77,1,NoOp(Privet)
exten => 77,2,System(/usr/sbin/asterisk -rx "originate SIP/930 extension 111@originate")
same => n,Playback(demo-echotest)
same => n,ConfBridge(1234)
same => n,Hangup()

[originate]
exten => 111,1,NoOp(Privet)
same => n,Playback(cannot-complete-as-dialed)
same => n,Playback(followme/sorry)
same => n,ConfBridge(1234)
same => n,Hangup()

зы
[Показать] Спойлер:
-- Executing [77@phones:1] NoOp("SIP/230-00000045", "Privet") in new stack
-- Executing [77@phones:2] System("SIP/230-00000045", "/usr/sbin/asterisk -rx "originate SIP/930 extension 111@originate"") in new stack
-- Remote UNIX connection
== Using SIP RTP CoS mark 5
-- Remote UNIX connection disconnected
-- Called 930
-- Executing [77@phones:3] Playback("SIP/230-00000045", "demo-echotest") in new stack
-- <SIP/230-00000045> Playing 'demo-echotest.ulaw' (language 'ru')
-- SIP/930-00000046 is ringing
-- SIP/930-00000046 answered
-- Executing [111@originate:1] NoOp("SIP/930-00000046", "Privet") in new stack
-- Executing [111@originate:2] Playback("SIP/930-00000046", "cannot-complete-as-dialed") in new stack
-- <SIP/930-00000046> Playing 'cannot-complete-as-dialed.ulaw' (language 'ru')
-- Executing [111@originate:3] Playback("SIP/930-00000046", "followme/sorry") in new stack
-- <SIP/930-00000046> Playing 'followme/sorry.ulaw' (language 'ru')
-- Executing [77@phones:4] ConfBridge("SIP/230-00000045", "1234") in new stack
-- <SIP/230-00000045> Playing 'confbridge-join.ulaw' (language 'ru')
-- <CBAnn/1234-00000006;1> Playing 'confbridge-join.gsm' (language 'en')
-- Channel SIP/230-00000045 joined 'softmix' base-bridge <417d91cc-66f8-4981-9103-5c95f00f6756>
-- Executing [111@originate:4] ConfBridge("SIP/930-00000046", "1234") in new stack
-- <SIP/930-00000046> Playing 'confbridge-join.ulaw' (language 'ru')
-- <CBAnn/1234-00000006;1> Playing 'confbridge-join.gsm' (language 'en')
-- Channel SIP/930-00000046 joined 'softmix' base-bridge <417d91cc-66f8-4981-9103-5c95f00f6756>
-- Channel SIP/930-00000046 left 'softmix' base-bridge <417d91cc-66f8-4981-9103-5c95f00f6756>
-- <CBAnn/1234-00000006;1> Playing 'confbridge-leave.gsm' (language 'en')
-- Channel SIP/230-00000045 left 'softmix' base-bridge <417d91cc-66f8-4981-9103-5c95f00f6756>
-- <CBAnn/1234-00000006;1> Playing 'confbridge-leave.gsm' (language 'en')
Repz
 
Сообщений: 169
Зарегистрирован: 04 мар 2015, 12:35

След.

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

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

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

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