Asterisk: Unable to create channel PJSIP cause 20 Subscriber absent (Решение)
- В логах фиксируется
ERROR[8901]: app_dial.c: Unable to create channel of type 'PJSIP' (cause 20 - Subscriber absent). - В диалплане переменная
${DIALSTATUS}возвращает значениеCHANUNAVAIL. - Вызывающий абонент слышит сигнал 'Занято' или сброс вызова.
- Команда
pjsip show endpoint <номер>показывает отсутствие активных зарегистрированных контактов в секции AOR.
1. Проверка статуса регистрации вызываемого абонента
asterisk -rx "pjsip show endpoint 102"
asterisk -rx "pjsip show aor 102"Если в выводе параметр Contacts: 0 или Contact: <unavailable> — устройство физически не зарегистрировано на сервере.
2. Проверка логов регистрации на стороне сервера
asterisk -rx "pjsip set logger on"
# Фильтр по IP или номеру абонента
grep -i "102" /var/log/asterisk/messages | grep -iE "register|unregistered|expire"3. Обработка недоступности абонента в диалплане
Добавьте проверку статуса ${DIALSTATUS} в /etc/extensions.conf, чтобы звонок не падал с ошибкой:
[from-internal]
exten => 102,1,NoOp(Вызов абонента 102)
same => n,Dial(PJSIP/102,25)
same => n,GotoIf($["${DIALSTATUS}" = "CHANUNAVAIL"]?unavailable:check_busy)
same => n(unavailable),NoOp(Абонент 102 не в сети)
same => n,Playback(followme/no-answer)
same => n,VoiceMail(102@default,u)
same => n,Hangup()
same => n(check_busy),GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:hangup)
same => n(busy),Playback(vm-isonphone)
same => n(hangup),Hangup()4. Проверка сети на клиентском телефоне
Если телефон должен быть онлайн: проверьте подачу питания PoE, корректность логина/пароля в auth, совпадение порта (5060 UDP) и активность функции Keep-Alive на аппарате.
Частые вопросы (FAQ)
Что означает ISDN Q.850 Cause 20?
Cause 20 (Subscriber absent) означает, что запрошенный адресат не найден в сети оператора (в SIP транслируется как 404 Not Found или 480 Temporarily Unavailable).
Почему статус CHANUNAVAIL появляется при отправке вызова на правильный номер?
Если в pjsip.conf у эндпоинта нет ни одного активного IP-адреса в AOR (телефон выключен, нет интернета, истек Registration Expiry), Asterisk не знает, куда отправить INVITE, и немедленно возвращает Cause 20.
Как функция DEVICE_STATE() помогает до вызова Dial()?
Вы можете проверить статус: GotoIf($["${DEVICE_STATE(PJSIP/102)}" = "UNAVAILABLE"]?offline), чтобы мгновенно перевести звонок на мобильный или голосовую почту без задержки.
Что делать, если телефон зарегистрирован, но Asterisk все равно выдает Cause 20?
Проверьте, совпадает ли имя AOR с именем Endpoint в pjsip.conf (параметр aors = 102), и не заблокирован ли Contact проверкой qualify_timeout.