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

Выполнение операций при проигрывании приветствия

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

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

Выполнение операций при проигрывании приветствия

Сообщение Razor2k » 14 май 2018, 12:31

Добрый день.
Есть следующий код:
Код: выделить все
[orders_info]
exten => s,1,Answer()
same => n,Playback('greeting') ; Приветствуем клиента (~3сек)
same => n,Set(OUR_CLIENT=${ODBC_OUR_CLIENT(${CALLERID(num)})}) ; Узнаем есть ли номер телефона в БД (~2сек)

Хочется его оптимизировать, чтобы выполнение запроса к БД было в то же время, когда клиент слушает приветствие (время выполнения запроса ~2сек). Если оставить так, как есть, то клиент слушает тишину во время выполнения запроса, от которой необходимо избавиться. В данном случае можно конечно перенести вычисления перед Answer, но тогда клиент будет ждать поднятие трубки на эти 2сек дольше. Но все таки хочется понять, возможно ли при проигрывании оповещения совершать какие-то вычисления, или нет?
Razor2k
 
Сообщений: 9
Зарегистрирован: 14 май 2018, 11:47

Re: Выполнение операций при проигрывании приветствия

Сообщение ded » 14 май 2018, 12:53

Google >>> Asterisk+cidlookup
ded
 
Сообщений: 15801
Зарегистрирован: 26 авг 2010, 19:00

Re: Выполнение операций при проигрывании приветствия

Сообщение Razor2k » 14 май 2018, 13:29

ded писал(а):Google >>> Asterisk+cidlookup

Это совсем не то.
Во-первых у меня чистый asterisk.
Во-вторых у меня идет упор именно на тот факт, можно ли использовать то время, когда воспроизводится приветствие, на запрос к базе, либо выполнение какого-то внешнего скрипта.
А cidlookup переводит CID в имя, что мне не нужно и еще не понятно, как он сработает, если запрос к БД будет такого вида:
Код: выделить все
SELECT name FROM phonebook WHERE number LIKE '%[NUMBER]%' AND SLEEP(5)=0

SLEEP(5)=0 специально ввел для того, чтобы запрос быстрее, чем 5 сек не выполнялся

P.S. В описании модуля нашел, что "Процесс поиска имени входящего абонента (name lookup), который запускает данный модуль, может замедлить работу Вашей IP-АТС.", а мне надо ускорить, а не замедлить...
Razor2k
 
Сообщений: 9
Зарегистрирован: 14 май 2018, 11:47

Re: Выполнение операций при проигрывании приветствия

Сообщение ded » 14 май 2018, 13:56

То, то...
Razor2k писал(а):Во-первых у меня чистый asterisk.
Это разве что-то меняет?
Люди уже написали код, самый полный, который вы можете просто скопировать себе и оптимизировать по своему разумению, чем изобретать велосипед.
ded писал(а):А cidlookup переводит CID в имя, что мне не нужно и еще не понятно, как он сработает
Вот как? Вы уже показываете, что не знаете предмет, поэтому непонятно. CID состоит из двух компонентов: CALLERID(name) & CALLERID(num).
Razor2k писал(а):P.S. В описании модуля нашел, что "Процесс поиска имени входящего абонента (name lookup), который запускает данный модуль, может замедлить работу Вашей IP-АТС.",
..если её ресурсы скромны. Дополню: если база имён содержит over 10 billion records. Вы такую базу пишете?
Этот текст описывал работу Астериск на процессоре Atom или Celeron. Я очень сомневаюсь, что у вас такие.
ded
 
Сообщений: 15801
Зарегистрирован: 26 авг 2010, 19:00

Re: Выполнение операций при проигрывании приветствия

Сообщение Razor2k » 14 май 2018, 14:42

Razor2k писал(а):..если её ресурсы скромны. Дополню: если база имён содержит over 10 billion records. Вы такую базу пишете?

Я же привел в первоначальном вопросе специально цифры, что мой запрос выполняется на SQL сервере около 2сек, и не важно насколько оптимизирован запрос, какая ширина канала до SQL сервера и какие мощности у сервера с asterisk и SQL сервера. Важно, что время работы функции 2сек и хочется эти 2 секунды потратить параллельно с приветствием, а не плюсовать их до или после приветствия. Плюс я сделал акцент, что запрос к БД может быть заменен на выполнение какого-либо внешнего shell-скрипта.
Вы даете ответы на второстепенные факты, которыми я дополняю основной вопрос, а основной оставляете почему-то без ответа.
И самое главное непонятно даже с использованием этого плагина - запрос уходит параллельно с проигрыванием приветствия, или последовательно?
Из того, что нашел по CID Lookup - это то, что он добавляет простенький диалплан типа такого:
Код: выделить все
exten => cidlookup_5,1,Set(CURLOPT(httptimeout)=7)
exten => cidlookup_5,n,Set(CALLERID(name)=${CURL(http...)})
exten => cidlookup_5,n,NoOp(${CALLERID(name)})
exten => cidlookup_5,n,Return()

который к моему вопросу никак не относится, либо я что-то не так понимаю, что такое волшебное делает этот cidlookup
Razor2k
 
Сообщений: 9
Зарегистрирован: 14 май 2018, 11:47

Re: Выполнение операций при проигрывании приветствия

Сообщение BorisTheBlade » 14 май 2018, 14:43

Razor2k,
1.запускаем скрипт через System.(передаем в качестве параметров id канала, номер и тд)
System(((/usr/bin/php -f /var/lib/asterisk/agi-bin/somescript.php ${CHANNEL} ${CALLERID(num)})&)&)
Скрипт производит вычисления и через AMI выставляет нужные переменные канала
https://www.voip-info.org/asterisk-mana ... ion-setvar
2.Паралельно играем приветствие, тк System запускает скрипт отдельным потоком.
3.Проверяем выставлены ли необходимые переменные, те закончил ли скрипт работу ну и дальше как обычно.
BorisTheBlade
 
Сообщений: 167
Зарегистрирован: 14 фев 2011, 15:24

Re: Выполнение операций при проигрывании приветствия

Сообщение ded » 14 май 2018, 15:08

А почему через System. а не AGI(somescript) ?
ded
 
Сообщений: 15801
Зарегистрирован: 26 авг 2010, 19:00

Re: Выполнение операций при проигрывании приветствия

Сообщение Razor2k » 14 май 2018, 15:10

BorisTheBlade писал(а):2.Паралельно играем приветствие, тк System запускает скрипт отдельным потоком.

К сожалению, это не так.
Вот такой диалплан:
Код: выделить все
exten => s,1,NoOp("test-ivr")
same => n,Verbose(${STRFTIME(%T)})
same => n,System(/bin/sleep 5)
same => n,Verbose(${STRFTIME(%T)})
same => n,Answer
same => n,Playback(greeting)
same => n,Hangup

Вот такой результат:
Код: выделить все
Executing [s@test-ivr:1] NoOp("SIP/razor-00002943", ""test-ivr"") in new stack
    -- Executing [s@test-ivr:2] Verbose("SIP/razor-00002943", "Mon May 14 18:06:12 2018") in new stack
Mon May 14 18:06:12 2018
    -- Executing [s@test-ivr:3] System("SIP/razor-00002943", "/bin/sleep 5") in new stack
    -- Executing [s@test-ivr:4] Verbose("SIP/razor-00002943", "Mon May 14 18:06:17 2018") in new stack
Mon May 14 18:06:17 2018
    -- Executing [s@test-ivr:5] Answer("SIP/razor-00002943", "") in new stack
    -- Executing [s@test-ivr:6] Playback("SIP/razor-00002943", "greeting") in new stack
    -- <SIP/razor-00002943> Playing 'greeting.alaw' (language 'ru')
Razor2k
 
Сообщений: 9
Зарегистрирован: 14 май 2018, 11:47

Re: Выполнение операций при проигрывании приветствия

Сообщение Razor2k » 14 май 2018, 15:26

ded писал(а):А почему через System. а не AGI(somescript) ?

Диалплан:
Код: выделить все
[test-ivr]
exten => s,1,NoOp("test-ivr")
same => n,Verbose(${STRFTIME(%T)})
same => n,AGI(test,5)
same => n,Verbose(${STRFTIME(%T)})
same => n,Answer
same => n,Playback(greeting)
same => n,Verbose(${STRFTIME(%T)})
same => n,Hangup

скрипт:
Код: выделить все
/var/lib/asterisk/agi-bin# cat ./test
#!/bin/bash

sleep $1

Результат:
Код: выделить все
    -- Executing [s@test-ivr:1] NoOp("SIP/razor-000029bc", ""test-ivr"") in new stack
    -- Executing [s@test-ivr:2] Verbose("SIP/razor-000029bc", "Mon May 14 18:19:25 2018") in new stack
Mon May 14 18:19:25 2018
    -- Executing [s@test-ivr:3] AGI("SIP/razor-000029bc", "test,5") in new stack
    -- Launched AGI Script /var/lib/asterisk/agi-bin/test
    -- <SIP/razor-000029bc>AGI Script test completed, returning 0
    -- Executing [s@test-ivr:4] Verbose("SIP/razor-000029bc", "Mon May 14 18:19:30 2018") in new stack
Mon May 14 18:19:30 2018
    -- Executing [s@test-ivr:5] Answer("SIP/razor-000029bc", "") in new stack
    -- Executing [s@test-ivr:6] Playback("SIP/razor-000029bc", "greeting") in new stack
    -- <SIP/razor-000029bc> Playing 'greeting.alaw' (language 'ru')
    -- Executing [s@test-ivr:7] Verbose("SIP/razor-000029bc", "Mon May 14 18:19:34 2018") in new stack
Mon May 14 18:19:34 2018
    -- Executing [s@test-ivr:8] Hangup("SIP/razor-000029bc", "") in new stack

Времена 18:19:25, 18:19:30, 18:19:34, итоговое время работы диалплана 9 секунд, а хотелось бы уложиться в 5.
Razor2k
 
Сообщений: 9
Зарегистрирован: 14 май 2018, 11:47

Re: Выполнение операций при проигрывании приветствия

Сообщение BorisTheBlade » 14 май 2018, 15:39

ded, думаю это просто вопрос привычки.
Если через AGI и PHP, все равно нужно детачить скрипт, тк PHP не может в паралельное выполнение.

Razor2k,
я даже пример 'правильного' system написал и &) вкорячил не пожалел.
BorisTheBlade
 
Сообщений: 167
Зарегистрирован: 14 фев 2011, 15:24

След.

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

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

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

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