Возникла такая необходимость - после ответа, делается перевод звонка из города на внутренний номер, а там никого нет. Надо вернуть звонок обратно на тот внутренний номер, который принимал звонок изначально из города!
Нашёл как это сделать, причём вариант "слепого перевода", т.е. без контроля ответа:
...
[globals]
TRANSFER_CONTEXT=blind_transfer_mikhed_ringback
...
[local_phones] ; контекст локальных звонков
exten => _XXXX,1,Answer()
exten => _XXXX,n,Dial(SIP/${EXTEN},45,tT)
exten => _XXXX,n,Hangup()
...
; в этот контекст попадают все переводимые звонки:
[blind_transfer_mikhed_ringback]
exten => _X.,1,NoOp("Blindtransfer: " ${BLINDTRANSFER})
exten => _X.,n,Set(ExtLength=${LEN(${EXTEN})}).
; ${BLINDTRANSFER} - это не оригинальный номер, а оригинальный канал, например: SIP/1111-433242424242
exten => _X.,n,Set(OrigNumber=${BLINDTRANSFER:4:${ExtLength}})
; делаем основной звонок:
exten => _X.,n,Dial(SIP/${EXTEN},45,tTg)
; если он удался, то вешаем трубку, если нет - возвращаем тому, кто переводил звонок:
exten => _X.,n,GotoIf($["${DIALSTATUS}" = "ANSWER"]?hangup:callback)
exten => _X.,n(callback),Dial(local/${OrigNumber}@local_phones,45,tT)
; Обратите внимание: здесь делается только одна попытка вернуть звонок.
; Однако на самом деле к моменту возврата звонка сотрудник может быть уже занят.
; Так что имеет смысл делать несколько попыток, или перенаправлять звонки куда-либо еще.
exten => _X.,n(hangup),Hangup().
...
Вообщем потестил маленько - работает (особо нет возможности - PBX уже работает и сбои вызывают раздражение у работников), но пока получилось только внутри, а наружу при этом, вызовы перестали идти, ну эт от корявости диалплан-теста.
Вопросы:
1. Диал план построен на основе примера, описанного в Вашей статье. Как в него грамотно вписать оное?
А именно: в
[globals]
TRANSFER_CONTEXT=blind_transfer_mikhed_ringback до или после DIR_RECORDS=/home/records/ или без разницы?
2. Всё остальное, для перевода и возвращения при не ответе, как грамотно вписать в уже имеющейся контекст (ну как у Вас в статье), или так - только контролируем статус прохождения звонка, или только контролируем перевод и не ответ. Или можно совместить? Или как реализовать лучше? Но задача однозначна: С города звонят => Ответ => если надо, перевод звонка => если там не ответили => вернуть звонок тому, кто переводил!
Я тут не подскажу. Это надо проверять, тестировать на месте. Я такое ни разу не настраивал. TRANSFER_CONTEXT не важно, где стоит, лишь бы в секции [globals]. Я так понял, звонят по меди, отвечает тоже медный телефон, а потом отправляет на абонента астериск? И надо после звонка на астериск, если никто не ответил, вернуть звонок обратно на медный телефон?
Не, проще: мой случай - 1 городская линия на шлюзе => Входящий звонок поступает на внутренний номер Astera - секретарь - он в соседний кабинет на внутренний номер переводит и не дожидается ответа (типа занят сильно), а там никто не отвечает, и надо звонок вернуть ему обратно, чтоб человек из города не перезванивал.
Повторюсь: Для контекста внутренних звонков "впихнул" абы как и заработало, а, только всю другую обработку статусов звонков внутри при этом закоментил. А вот снаружи: секретарь ответил - перевёл - а возврат, при не ответе, не получил. Почему и спрашиваю как лучше это всё совместить или лучше не совмещать? Просто понравилась мне возможность обработки статуса набора из Вашей статьи..! И ещё, Важно: А в [call-in], ну это у меня контекст для входящих (для линии шлюза), этот момент (возврат перевода) надо прописывать?
Так у меня же описана такая ситуация. Это штатная функция астера, называется Attended Transfer, она по-умолчанию выключена. Если номер, на который отправили звонок, не ответил, он возвращается обратно тому, кто перенаправлял.
http://serveradmin.ru/nastroyka-servera-telefonii-asterisk-s-nulya/#i-6
Пардон, читал ведь, но уже "замылился разум" под текущими делами и задачами, завтра протестим
Ан нет, не та ситуация, на самом деле: Attended Transfer - это фукция так называемого "сопровождаемого" перевода звонка, т.е. мы сами контролируем - есть абонент на месте или нет (ответил/не ответил). Я же говорил изначально о "слепом" переводе, т.е на нажал перевод и положил трубку, а aster сам контролирует ответ, а при не ответе возвращает звонок обратно, к переведшему его.
Короче, с помощью
TRANSFER_CONTEXT=blind_transfer_mikhed_ringback
переписал сегодня диалплан полностью и всё классно работает, причём и в случае "сопровождаемого" перевода тоже: Attended Transfer - включен ну типа послушал, послушал вызов и положил трубу не дождавшись пока ответит на кого перевёл. Если так и на ответил, получи звонок обратно.
Единственно контроль статуса прохождения вызова (существует номер/не существует, занят и т.д.) сюда ещё не "прикручивал". Попробую в понедельник.