Пожалуйста, войдите здесь. Часто задаваемые вопросы О нас
Задайте Ваш вопрос

gotoif определенное количество раз.

0

Здравствуйте уважаемые гуру. Есть внешний скрипт который инициирует исходящий звонок. Вопрос как в диалплане указать количество попыток прохождения данного условия. Сейчас если длительность звонка из таблицы cdr duration = 10 тогда выполняется 3 команда, а если нет то возвращается к первому, как сделать так чтобы этих похождений по первой команде тобишь по (exten => _X.,1,Dial(SIP/SVD/${EXTEN}) )было определенное количество раз.

exten => _X.,1,Dial(SIP/SVD/${EXTEN})
exten => _X.,2,GotoIf($["${CDR(duration)}" = "10"]?3:1)
exten => _X.,3,NoOp(${EXTEN} ${DIALSTATUS} ${CDR(duration)} ${ANSWEREDTIME})

после двух попыток прохождения условия если не равно 10 секунд дальше не идет и значению duration присваивается автоматически значение 30, после этого естественно условие верно и попытки дозвонится до абонента прекращаются. Кусочек лога.

-- Executing [**@TestUNISTIM:1] Dial("Local/**@TestUNISTIM-a67a;2", "SIP/SVD/**") in new stack
== Using SIP RTP TOS bits 184
== Using SIP RTP CoS mark 5
-- Called SIP/SVD/**
-- SIP/SVD-00000000 is ringing
-- SIP/SVD-00000000 is making progress passing it to Local/**@TestUNISTIM-a67a;2
-- Got SIP response 503 "Service Unavailable" back from 178.16.158.38:5060
-- SIP/SVD-00000000 is circuit-busy
== Everyone is busy/congested at this time (1:0/1/0)
-- Executing [8**@TestUNISTIM:2] GotoIf("Local/**@TestUNISTIM-a67a;2", "0?3:1") in new stack
-- Goto (TestUNISTIM,**,1)
-- Executing [8**@TestUNISTIM:1] Dial("Local/**@TestUNISTIM-a67a;2", "SIP/SVD/**") in new stack
== Using SIP RTP TOS bits 184
== Using SIP RTP CoS mark 5
-- Called SIP/SVD/89047665033
-- SIP/SVD-00000001 is ringing
-- SIP/SVD-00000001 is making progress passing it to Local/**@TestUNISTIM-a67a;2
-- Got SIP response 503 "Service Unavailable" back from 178.16.158.38:5060
-- SIP/SVD-00000001 is circuit-busy
== Everyone is busy/congested at this time (1:0/1/0)
-- Executing [**@TestUNISTIM:2] GotoIf("Local/**@TestUNISTIM-a67a;2", "0?3:1") in new stack
-- Goto (TestUNISTIM,**,1)
-- Executing [**@TestUNISTIM:1] Dial("Local/**@TestUNISTIM-a67a;2", "SIP/SVD/**") in new stack
== Using SIP RTP TOS bits 184
== Using SIP RTP CoS mark 5
-- Called SIP/SVD/**
== Spawn extension (TestUNISTIM, **, 1) exited non-zero on 'Local/**@TestUNISTIM-a67a;2'
удалить закрыть спам изменить тег редактировать

спросил 2013-01-31 13:26:26 +0400

ruslan.zabirov Gravatar ruslan.zabirov flag of Russian Federation
304 8 1 8

1 Ответ

0

если надо считать количество диалов то введите счетчик для него, если время звонка то считайте время не через CDR(duration)...

exten => s,1,Set(TH=${MATH(40+1)})
exten => s,n(loop),Set(START_TIME=${EPOCH})
exten => s,n,Dial(.....)
exten => s,n,Set(STOP_TIME=${EPOCH})
exten => s,n,Set(DELTA_TIME=${MATH(${STOP_TIME}-${START_TIME})})
exten => s,n,GotoIf($[${DELTA_TIME} < ${TH}] ?loop)
ссылка удалить спам редактировать

ответил 2013-01-31 13:53:13 +0400

komrad123 Gravatar komrad123
3810 5 3 44

обновил 2013-01-31 14:08:58 +0400

Comments

а можно вас попросить расписать что есть что?

ruslan.zabirov ( 2013-01-31 13:58:36 +0400 )редактировать

банальное вычисление времени прошедшего со старта до завершения работы Dial, и проверка его с заданным порогом...

komrad123 ( 2013-01-31 14:09:56 +0400 )редактировать

MATH не обязательно. вот так тоже работает $[ ${STOPTIME} - ${STARTTIME} ]. и вы забыли wait поставить,в результате данный диалплан завесит астериск на 40 секунд. ен завидую я вашим пользователям.

meral ( 2013-01-31 15:56:47 +0400 )редактировать

чей то оно завесит ? будет звонить пока длина звонка не будет больше 41 секунды... А вообще у меня там не Dial воригинале.

komrad123 ( 2013-01-31 16:02:29 +0400 )редактировать

патамуша. будет конгестион и зависнет сервер нафик. wait(0.1) должен быть во всех loop в диалплане.

meral ( 2013-01-31 18:18:21 +0400 )редактировать

конгестион какбы не проверкой длительности звонка отлавливают про которую вопрошают в оригинальном вопросе.

komrad123 ( 2013-01-31 18:28:03 +0400 )редактировать

ну да. но тут ведь вопрос в том,что в нештатном случае(отлуп сразу от транка ибо он unreachable) предложенный вами диалплан забивает логи и ложит сервер.

meral ( 2013-01-31 19:47:22 +0400 )редактировать

Ваш ответ

Please start posting your answer anonymously - your answer will be saved within the current session and published after you log in or create a new account. Please try to give a substantial answer, for discussions, please use comments and please do remember to vote (after you log in)!
[скрыть предварительный просмотр]

Закладки и информация

Добавить закладку
1 закладка

подписаться на rss ленту новостей

Статистика

Задан: 2013-01-31 13:26:26 +0400

Просмотрен: 1,953 раз

Обновлен: Jan 31 '13

Проект компании "АТС Дизайн"
Asterisk® и Digium® являются зарегистрированными торговыми марками компании Digium, Inc., США.
IP АТС Asterisk распространяется под лицензией GNU GPL.