VIDEOCHAT  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

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

Проблемы Asterisk без вэб-оболочек и их решения

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

Razor2k
Сообщения: 9
Зарегистрирован: 14 май 2018, 10:47

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

Сообщение Razor2k »

Добрый день.
Есть следующий код:

Код: Выделить всё

[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сек дольше. Но все таки хочется понять, возможно ли при проигрывании оповещения совершать какие-то вычисления, или нет?
ded
Сообщения: 15625
Зарегистрирован: 26 авг 2010, 19:00

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

Сообщение ded »

Google >>> Asterisk+cidlookup
Razor2k
Сообщения: 9
Зарегистрирован: 14 май 2018, 10:47

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

Сообщение Razor2k »

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-АТС.", а мне надо ускорить, а не замедлить...
ded
Сообщения: 15625
Зарегистрирован: 26 авг 2010, 19:00

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

Сообщение ded »

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

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

Сообщение Razor2k »

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
BorisTheBlade
Сообщения: 167
Зарегистрирован: 14 фев 2011, 14:24

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

Сообщение BorisTheBlade »

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.Проверяем выставлены ли необходимые переменные, те закончил ли скрипт работу ну и дальше как обычно.
ded
Сообщения: 15625
Зарегистрирован: 26 авг 2010, 19:00

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

Сообщение ded »

А почему через System. а не AGI(somescript) ?
Razor2k
Сообщения: 9
Зарегистрирован: 14 май 2018, 10:47

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

Сообщение Razor2k »

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, 10:47

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

Сообщение Razor2k »

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.
BorisTheBlade
Сообщения: 167
Зарегистрирован: 14 фев 2011, 14:24

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

Сообщение BorisTheBlade »

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

Razor2k,
я даже пример 'правильного' system написал и &) вкорячил не пожалел.
Ответить
© 2008 — 2024 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH