#python #asterisk #agi
#python #звездочка #agi
Вопрос:
Я пытаюсь перевести вызов «на удержание» в asterisk с помощью скрипта python AGI, функция проверит, доступен ли пользователь, когда он будет доступен, asterisk наберет номер пользователя, если его нет, скрипт должен подождать 10 секунд, прежде чем снова проверять доступность, и набрать, когда пользователь будет доступен. Однако я столкнулся с небольшой проблемой: использование time.sleep(10)
функции прерывает вызов, когда пользователь недоступен, я полагаю, это связано с тем, что поток, в котором выполняется скрипт, переходит в спящий режим, а asterisk думает, что скрипт завершен, и прерывает вызов. Удаление time.sleep()
дает мне то, что я хочу, без временного интервала.
agi = AGI()
agi.verbose("python agi started")
place_call_on_hold("SIP/6001")
def place_call_on_hold(s):
agi.verbose("entered place_call_on_hold function")
while True:
status = agi.get_variable('DEVICE_STATE(%(redirect)s)'%{'redirect':s})
agi.verbose(status)
if status == 'NOT_INUSE':
agi.verbose("Info: place_call_on_hold: calling the number")
agi.appexec("Dial",s)
else:
agi.verbose("Info: place_call_on_hold: sleeping for 10 sec")
time.sleep(10)
Есть ли способ подождать 10 секунд без использования sleep()
функции или как я могу убедиться, что вызов не завершится до того, как time.sleep
произойдет резервное копирование?
Комментарии:
1. У
while()
цикла нет условия остановки?2. останавливаться не нужно, либо вызывающий абонент вешает трубку, и скрипт останавливается, либо вызов перенаправляется абоненту.
3. Должно быть условие, которое проверяет КАНАЛ (состояние).
4. @arheops я не уверен, понимаю ли я, что вы имеете в виду.
5. НИКОГДА не используйте бесконечный цикл в agi. Он будет зацикливаться и потреблять ваш процессор в любой версии asterisk выше 1.4
Ответ №1:
почему бы не попробовать разницу во времени до состояния и после состояния что-то вроде этого
import time
start = time.time()
end = time.time()
while (end-start) < 10:
end = time.time()
print(start, end, end-start)
Комментарии:
1. Спасибо за ответ, но это будет то же самое, что удалить sleep (), потому что он все равно будет повторять цикл при каждом тике. Я исправил свою проблему, просто вызвав функцию ожидания Asterisk (10).
Ответ №2:
Я исправил свою проблему, просто вызвав функцию Asterisk Wait (10) вместо time.sleep (10).
Комментарии:
1. Вы можете принять свой собственный ответ, чтобы закрыть вопрос.
2. я не могу принять его в течение 2 дней после публикации (осталось 22 часа, прежде чем я смогу его принять)