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

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

Новичком считается только что прочитавший «Астериск - будущее телефонии»
http://asterisk.ru/knowledgebase/books
и пытающийся сделать большее

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

RamonSantiago
Сообщения: 14
Зарегистрирован: 14 май 2014, 15:29

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

Сообщение 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 сек. Хочется убрать паузу перед переходом к следующему абоненту, если текущий не доступен.

Прошу поделиться велосипедом или толкнуть в правильном направлении.
Аватара пользователя
zzuz
Сообщения: 1658
Зарегистрирован: 21 сен 2010, 13:33
Контактная информация:

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

Сообщение zzuz »

Избавьте от непонятной строки
exten => _900XXXXX,1,Wait(${EXTEN:3:2})
Ваше жонглирование цифрами безусловно впечатляет , но это только усложняет Вам жизнь.
Линия24 - Системы Массового Телефонного Обслуживания
RamonSantiago
Сообщения: 14
Зарегистрирован: 14 май 2014, 15:29

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

Сообщение 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.

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

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

Сообщение 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 самостоятельно
ЛС: @rostel
RamonSantiago
Сообщения: 14
Зарегистрирован: 14 май 2014, 15:29

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

Сообщение 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,"Звонок завершен")
Вдруг кому еще пригодится.
Vlad1983
Сообщения: 4251
Зарегистрирован: 09 авг 2011, 11:51

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

Сообщение Vlad1983 »

наводка для оптимизации: вместо Set можно использовать MSet
ЛС: @rostel
RamonSantiago
Сообщения: 14
Зарегистрирован: 14 май 2014, 15:29

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

Сообщение 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,"Звонок завершен")

Аватара пользователя
Zavr2008
Сообщения: 2215
Зарегистрирован: 27 янв 2011, 00:35
Контактная информация:

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

Сообщение Zavr2008 »

Идея хорошая, но годитца только для локальных телефонов..
А если там еще и мобильники через SIP транки операторов?
Тогда наверно только AMI.. (отвечаю сам себе)
Российские E1 шлюзы Alvis. Модернизация УПАТС с E1,Подключение к ИС "Антифрод" E1 PRI/SS#7 УВР Телестор, Грифин и др..
debian-asterisk
Сообщения: 62
Зарегистрирован: 22 май 2016, 11:12
Контактная информация:

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

Сообщение 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
ded
Сообщения: 15631
Зарегистрирован: 26 авг 2010, 19:00

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

Сообщение ded »

@from-internal
Ответить
© 2008 — 2025 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH