Страница 1 из 2

Прогресс-серийное искание в asterisk

Добавлено: 14 май 2014, 18:01
RamonSantiago
Есть стандартное решение из книжки:

same => n,Dial(LOCAL/90000101@incoming_ext1&LOCAL/90010202@incoming_ext1&LOCAL/90020303@incoming_ext1&LOCAL/90030404@incoming_ext1)
same => n,HangUp()

exten => _900XXXXX,1,Wait(${EXTEN:3:2})
same => n,Dial(LOCAL/${EXTEN:5}@internal-outgoing,,t)
same => n,hangup()

Но в случае отсутствия первых абонентов (101,202) звонок раздастся у абонента 303 только через 20 сек. Хочется убрать паузу перед переходом к следующему абоненту, если текущий не доступен.

Прошу поделиться велосипедом или толкнуть в правильном направлении.

Re: Прогресс-серийное искание в asterisk

Добавлено: 15 май 2014, 00:07
zzuz
Избавьте от непонятной строки
exten => _900XXXXX,1,Wait(${EXTEN:3:2})
Ваше жонглирование цифрами безусловно впечатляет , но это только усложняет Вам жизнь.

Re: Прогресс-серийное искание в asterisk

Добавлено: 15 май 2014, 18:11
RamonSantiago
zzuz писал(а):Избавьте от непонятной строки
exten => _900XXXXX,1,Wait(${EXTEN:3:2})
Ваше жонглирование цифрами безусловно впечатляет , но это только усложняет Вам жизнь.
Тогда остальной текст теряет смысл...
Вопрос собственно в другом, как сделать прогресс-серийное искание в астериск на подобие классической атс?
Тоесть нужно звонить скажем секретарю, если нет ответа звоним секретарю и менеджерам, если не отвечают, добавляем еще кого-то...
Для такой задачи есть 2 стандартных решения:
1) вариант описан выше.
Плюсы: Происходит один вызов с последовательным подключением абонентов, а значит пропушенный звонок бкдет у всех один и не будет эфекта множества вызовов.
Минусы: Если первые в списке абоненты отключены, то первый реальный звонок в офисе раздасться через продолжительное время ожидания звонящего.

2)
exten => 111,1,Noop()
same => Dial(SIP/101,15)
same => Dial(SIP/101$SIP/102,15)
same => Dial(SIP/101$SIP/102&SIP103,120)
------//--------
same => hangup()

Минусы: Впринципе это хороший вариант, но есть 2 нюанса, во первых между звонками есть хоть и не большая, но пауза и во вторых у первого абонента будет куча пропущеных вызовов, что не соответствует действительности.
Плюсы: если абонент 101 и 102 не зарегистрированы в сети, звонок сразу попадет абоненту 103.

Как то сумбурно получилось, но надеюсь смысл понятен.
Мне кажется задача объединения обоих способов не нова и достаточно стандартна, однако мне найти решение пока не удалось...
В принципе можно написать внешний скрипт, но очень хочется решить все средствами диалплана. дабы максимально сохранить читабельность...
Заранее благодарен за помощь.

Re: Прогресс-серийное искание в asterisk

Добавлено: 15 май 2014, 21:15
Vlad1983

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

exten => group1,1,NoOp(=====================group1=========================)
    same => n,Set(RETRIES=0)
    same => n,Set(MAX_RETRIES=3)
    same => n(start),GotoIF($[${RETRIES}=${MAX_RETRIES}]?new-metod,unwork,1) ; уходим по числу повторов
    same => n,Set(AGENT_EXT=NO)
    same => n,ExecIF($["${DEVICE_STATE(SIP/505)}"="NOT_INUSE"]?Set(AGENT_EXT=${AGENT_EXT}&SIP/505))
    same => n,ExecIF($["${DEVICE_STATE(SIP/503)}"="NOT_INUSE"]?Set(AGENT_EXT=${AGENT_EXT}&SIP/503))
    same => n,ExecIF($["${DEVICE_STATE(SIP/405)}"="NOT_INUSE"]?Set(AGENT_EXT=${AGENT_EXT}&SIP/405))
    same => n,ExecIF($["${DEVICE_STATE(SIP/403)}"="NOT_INUSE"]?Set(AGENT_EXT=${AGENT_EXT}&SIP/403))
    same => n,ExecIF($["${AGENT_EXT}" != "NO"]?Dial(${AGENT_EXT:3},10,tm(moh))) ; если есть хотя бы один не занятый номер звоним
    same => n,Set(AGENT_EXT=NO) ; ни одна тетенька не взяла трубку или не было свободных. добавляем кучку новых 
    same => n,ExecIF($["${DEVICE_STATE(SIP/505)}"="NOT_INUSE"]?Set(AGENT_EXT=${AGENT_EXT}&SIP/505))
    same => n,ExecIF($["${DEVICE_STATE(SIP/503)}"="NOT_INUSE"]?Set(AGENT_EXT=${AGENT_EXT}&SIP/503))
    same => n,ExecIF($["${DEVICE_STATE(SIP/405)}"="NOT_INUSE"]?Set(AGENT_EXT=${AGENT_EXT}&SIP/405))
    same => n,ExecIF($["${DEVICE_STATE(SIP/403)}"="NOT_INUSE"]?Set(AGENT_EXT=${AGENT_EXT}&SIP/403))
    same => n,ExecIF($["${DEVICE_STATE(SIP/404)}"="NOT_INUSE"]?Set(AGENT_EXT=${AGENT_EXT}&SIP/404))
    same => n,ExecIF($["${DEVICE_STATE(SIP/402)}"="NOT_INUSE"]?Set(AGENT_EXT=${AGENT_EXT}&SIP/402))
    same => n,ExecIF($["${DEVICE_STATE(SIP/401)}"="NOT_INUSE"]?Set(AGENT_EXT=${AGENT_EXT}&SIP/401))
    same => n,ExecIF($["${DEVICE_STATE(SIP/502)}"="NOT_INUSE"]?Set(AGENT_EXT=${AGENT_EXT}&SIP/502))
    same => n,ExecIF($["${AGENT_EXT}" != "NO"]?Dial(${AGENT_EXT:3},15,tm(moh)))
    same => n,MusicOnHold(moh,5)
    same => n,Set(RETRIES=${MATH(${RETRIES}+1)}) ; увеличиваем счетчик циклов прогона говна по трубам
    same => n,Goto(start) 
переделать под wait самостоятельно

Re: Прогресс-серийное искание в asterisk

Добавлено: 19 май 2014, 14:27
RamonSantiago
Спасибо, получилось что-то вроде:

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

[wait_exten]
;============================================================

exten => _900XXXXX,1,Wait(${EXTEN:3:2})
        same => n,Verbose(1,"Вызываем ${EXTEN:5}")
        same => n,Dial(LOCAL/${EXTEN:5}@internal-outgoing,,t)
        same => n,hangup()

;============================================================
[incoming_ext1]
;============================================================

exten => _X.,1,NoOp()
        same => n,Verbose(1,"Звонок от ${CALLERID(NUM)} на ${EXTEN}")
        same => n,Set(pause=00)
        same => n,Set(AGENT_EXT=NO)
        same => n,Verbose(1,"DEVICE_STATE for Extension 101 is ${DEVICE_STATE(SIP/101)}")
        same => n,ExecIf($[${DEVICE_STATE(SIP/101)}=NOT_INUSE]?Set(AGENT_EXT=${AGENT_EXT}&LOCAL/900${pause}101@wait_exten))
        same => n,ExecIf($[${DEVICE_STATE(SIP/101)}=NOT_INUSE]?Set(pause=$[${pause}+15]))
        same => n,Verbose(1,"DEVICE_STATE for Extension 202 is ${DEVICE_STATE(SIP/202)}")
        same => n,ExecIf($[${DEVICE_STATE(SIP/202)}=NOT_INUSE]?Set(AGENT_EXT=${AGENT_EXT}&LOCAL/900${pause}202@wait_exten))
        same => n,ExecIf($[${DEVICE_STATE(SIP/202)}=NOT_INUSE]?Set(pause=$[${pause}+15]))
        same => n,Verbose(1,"DEVICE_STATE for Extension 303 is ${DEVICE_STATE(SIP/303)}")
        same => n,ExecIf($[${DEVICE_STATE(SIP/303)}=NOT_INUSE]?Set(AGENT_EXT=${AGENT_EXT}&LOCAL/900${pause}303@wait_exten))
        same => n,ExecIf($[${DEVICE_STATE(SIP/303)}=NOT_INUSE]?Set(pause=$[${pause}+15]))
        same => n,Verbose(1,"DEVICE_STATE for Extension 404 is ${DEVICE_STATE(SIP/404)}")
        same => n,ExecIf($[${DEVICE_STATE(SIP/404)}=NOT_INUSE]?Set(AGENT_EXT=${AGENT_EXT}&LOCAL/900${pause}404@wait_exten))
        same => n,ExecIf($[${DEVICE_STATE(SIP/404)}=NOT_INUSE]?Set(pause=$[${pause}+15]))
        same => n,Verbose(1,"DEVICE_STATE for Extension 505 is ${DEVICE_STATE(SIP/505)}")
        same => n,ExecIf($[${DEVICE_STATE(SIP/505)}=NOT_INUSE]?Set(AGENT_EXT=${AGENT_EXT}&LOCAL/900${pause}505@wait_exten))
        same => n,Dial(${AGENT_EXT:3})
        same => n,HangUp()

exten => s,1,NoOp()
        same => n,Verbose("Тревога, сюда попадать никто не должен")
        same => n,HangUp()

exten => h,1,NoOp()
        same => n,ExecIf($[${DIALSTATUS}!=CONGESTION]?Verbose(1,Звонок окончен со статусом ${DIALSTATUS}))
        same => n,Verbose(1,"Звонок завершен")
Вдруг кому еще пригодится.

Re: Прогресс-серийное искание в asterisk

Добавлено: 19 май 2014, 14:34
Vlad1983
наводка для оптимизации: вместо Set можно использовать MSet

Re: Прогресс-серийное искание в asterisk

Добавлено: 20 май 2014, 12:42
RamonSantiago
Спасибо! С MSet получилось так:

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

;============================================================
[wait_exten]
;============================================================

exten => _900XXXXX,1,Wait(${EXTEN:3:2})
        same => n,Verbose(1,"Вызываем ${EXTEN:5}")
        same => n,Dial(LOCAL/${EXTEN:5}@internal-outgoing,,t)
        same => n,hangup()

;============================================================
[incoming_ext1]
;============================================================

exten => _X.,1,NoOp()
        same => n,Verbose(1,"Звонок от ${CALLERID(NUM)} на ${EXTEN}")
        same => n,Set(pause=00)
        same => n,Set(AGENT_EXT=NO)
        same => n,Verbose(1,"DEVICE_STATE for Extension 101 is ${DEVICE_STATE(SIP/101)}")
        same => n,ExecIf($["${DEVICE_STATE(SIP/101)}" = "NOT_INUSE"]?MSet(AGENT_EXT=${AGENT_EXT}&LOCAL/900${pause}101@wait_exten,pause=$[${pause}+15]))
        same => n,Verbose(1,"DEVICE_STATE for Extension 202 is ${DEVICE_STATE(SIP/202)}")
        same => n,ExecIf($["${DEVICE_STATE(SIP/202)}" = "NOT_INUSE"]?MSet(AGENT_EXT=${AGENT_EXT}&LOCAL/900${pause}202@wait_exten,pause=$[${pause}+15]))
        same => n,Verbose(1,"DEVICE_STATE for Extension 303 is ${DEVICE_STATE(SIP/303)}")
        same => n,ExecIf($["${DEVICE_STATE(SIP/303)}" = "NOT_INUSE"]?MSet(AGENT_EXT=${AGENT_EXT}&LOCAL/900${pause}303@wait_exten,pause=$[${pause}+15]))
        same => n,Verbose(1,"DEVICE_STATE for Extension 404 is ${DEVICE_STATE(SIP/404)}")
        same => n,ExecIf($["${DEVICE_STATE(SIP/404)}" = "NOT_INUSE"]?MSet(AGENT_EXT=${AGENT_EXT}&LOCAL/900${pause}404@wait_exten,pause=$[${pause}+15]))
        same => n,Verbose(1,"DEVICE_STATE for Extension 505 is ${DEVICE_STATE(SIP/505)}")
        same => n,ExecIf($["${DEVICE_STATE(SIP/505)}" = "NOT_INUSE"]?Set(AGENT_EXT=${AGENT_EXT}&LOCAL/900${pause}505@wait_exten))
        same => n,ExecIf($["${AGENT_EXT}" != "NO"]?Dial(${AGENT_EXT:3}))
        same => n,HangUp()

exten => s,1,NoOp()
        same => n,Verbose("Тревога, сюда попадать никто не должен")
        same => n,HangUp()

exten => h,1,NoOp()
        same => n,ExecIf($[${DIALSTATUS}!=CONGESTION]?Verbose(1,Звонок окончен со статусом ${DIALSTATUS}))
        same => n,Verbose(1,"Звонок завершен")


Re: Прогресс-серийное искание в asterisk

Добавлено: 24 май 2014, 23:08
Zavr2008
Идея хорошая, но годитца только для локальных телефонов..
А если там еще и мобильники через SIP транки операторов?
Тогда наверно только AMI.. (отвечаю сам себе)

Re: Прогресс-серийное искание в asterisk

Добавлено: 16 июн 2016, 09:44
debian-asterisk
подниму некрофила, все понятно, кроме одного:

в коде

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

exten => _900XXXXX,1,Wait(${EXTEN:3:2})
        same => n,Verbose(1,"Вызываем ${EXTEN:5}")
        same => n,Dial(LOCAL/${EXTEN:5}@internal-outgoing,,t)
        same => n,hangup()
что писать у себя вместо @internal-outgoing

Re: Прогресс-серийное искание в asterisk

Добавлено: 16 июн 2016, 10:11
ded
@from-internal