Настройка таймаутов ответа, переадресации по занятости и Follow-Me в Asterisk
- Бесконечное зацикливание вызовов (Call Loop) между двумя переадресованными номерами.
- Звонок обрывается через 20 секунд до того, как мобильный телефон сотрудника успевает зазвонить.
- Не срабатывает перевод звонка при отклонении входящего вызова на IP-телефоне (DND / Busy).
- Ошибки отображения CallerID звонящего при внешней переадресации через транк оператора.
1. Архитектура переадресации в диалплане
Asterisk поддерживает три основных типа переадресации:
- CFU (Call Forward Unconditional): безусловная переадресация всех вызовов;
- CFB (Call Forward on Busy): переадресация при занятости абонента;
- CFNA (Call Forward on No Answer): переадресация по истечении времени ожидания (таймаута).
2. Настройка базы AstDB для динамического включения переадресации
Добавьте сервисные коды в /etc/asterisk/extensions.conf:
[from-internal]
; Включение безусловной переадресации (*72) -> Ввод номера -> Сохранение
exten => _*72X.,1,NoOp(=== Enable CFU for ${CALLERID(num)} to ${EXTEN:3} ===)
same => n,Set(DB(CFU/${CALLERID(num)})=${EXTEN:3})
same => n,Playback(call-fwd-unconditional)
same => n,Playback(activated)
same => n,Hangup()
; Отключение безусловной переадресации (*73)
exten => *73,1,NoOp(=== Disable CFU for ${CALLERID(num)} ===)
same => n,dbDel(CFU/${CALLERID(num)})
same => n,Playback(call-fwd-unconditional)
same => n,Playback(de-activated)
same => n,Hangup()3. Логика дозвона с проверкой статусов и таймаутов
[sub-dial-user]
exten => s,1,NoOp(=== Calling User ${ARG1} ===)
; 1. Проверка безусловной переадресации в AstDB
same => n,Set(CFU_TARGET=${DB(CFU/${ARG1})})
same => n,GotoIf($["${ISNULL(${CFU_TARGET})}" = "0"]?cfu_redirect)
; 2. Дозвон на внутренний SIP аппарат с таймаутом 20 сек
same => n,Dial(PJSIP/${ARG1},20,tT)
same => n,NoOp(Dial Status: ${DIALSTATUS})
; 3. Анализ статуса ответа
same => n,GotoIf($["${DIALSTATUS}" = "BUSY"]?handle_busy)
same => n,GotoIf($["${DIALSTATUS}" = "NOANSWER"]?handle_noanswer)
same => n,GotoIf($["${DIALSTATUS}" = "CHANUNAVAIL"]?handle_unavail)
same => n,Hangup()
; Ветка занятости: перевод на мобильный номер
same => n(handle_busy),NoOp(User Busy - Redirecting)
same => n,Dial(PJSIP/89991112233@trunk-provider,25)
same => n,Hangup()
; Ветка не ответа: перевод на голосовую почту
same => n(handle_noanswer),NoOp(No Answer - Voicemail)
same => n,VoiceMail(${ARG1}@default,u)
same => n,Hangup()
; Переход по CFU
same => n(cfu_redirect),NoOp(Redirecting by CFU to ${CFU_TARGET})
same => n,Dial(PJSIP/${CFU_TARGET}@from-internal,30)
same => n,Hangup()4. Настройка каскадного дозвона через модуль followme.conf
В файле /etc/asterisk/followme.conf опишите профиль абонента 101:
[101]
musicclass=default
context=from-internal
takecall=1
decline=2
call-from-prompt=followme/call-from
; Сначала звоним на внутренний номер 15 секунд, затем параллельно на мобильный
number=>101,15,1
number=>89991112233@from-internal,25,2Вызов приложения в диалплане:
exten => 101,1,Followme(101,ant) Частые вопросы (FAQ)
Как защитить АТС от бесконечного зацикливания переадресаций (Call Loop)?
Используйте счетчик переадресаций в канале. Увеличивайте переменную Set(__FWD_COUNT=$[0${FWD_COUNT} + 1]) при каждом шаге. Если FWD_COUNT > 5, сбрасывайте вызов с сообщением об ошибке.
Почему при переадресации на мобильный телефон оператор отклоняет вызов с ошибкой 403/404?
Многие операторы запрещают передавать чужой CallerID (подмену номера). Перед вызовом внешнего транка принудительно подставьте ваш зарегистрированный городской номер: Set(CALLERID(num)=84951234567).
Чем отличается одновременный дозвон (Ringall) от каскадного Follow-Me?
Ringall звонит на все указанные телефоны одновременно. Follow-Me звонит по цепочке с задержками и запрашивает подтверждение поднятия трубки (нажмите 1, чтобы принять вызов), исключая срабатывание мобильного автоответчика.
Как проверить содержимое базы переадресаций AstDB из консоли?
Выполните команду asterisk -rx 'database show CFU', либо удалите зависшую запись вручную: asterisk -rx 'database del CFU 101'.