Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты на сайте предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, программного обеспечения, баз данных, сетевого оборудования и других компонентов инфраструктуры. Перед выполнением действий создайте резервную копию и по возможности протестируйте изменения в безопасной среде. Пользователь самостоятельно оценивает риски и несет ответственность за результат. При отсутствии необходимых знаний обратитесь к квалифицированному ИТ-специалисту.

CAUSE_20_SUBSCRIBER_ABSENT IP-Телефония и СКУД

Asterisk: Unable to create channel PJSIP cause 20 Subscriber absent (Решение)

Обновлено: 24.08.2026 · Официальная документация ↗
  • В логах фиксируется 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 на аппарате.

💡 Практика специалистов: Ошибки cause 20 в 90% случаев — это нормальное поведение системы, когда софтфон пользователя выключен. Главное — правильно обрабатывать статус CHANUNAVAIL в extensions.conf, отправляя вызов в очередь переадресации.

Частые вопросы (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.

Полезные материалы
Рекомендуем