Asterisk: DISCONNECT with cause code 16 - Normal call clearing (Q.850)
- В журнале вызовов фиксируется
WARNING[6789]: sig_pri.c: Received DISCONNECT with cause code 16 (Normal call clearing) on channel 0/1. - Звонок завершается штатно со стороны одного из участников разговора (абонент повесил трубку).
- В CDR поле
dispositionполучает статусANSWEREDилиBUSY. - В дампе Q.931 отображается сообщение
DISCONNECT (0x45) -> Cause: 16 (Normal call clearing).
1. Интерпретация кода Q.850 Cause 16
Код Cause 16 (Normal Call Clearing) является штатным статусом телефонии по стандарту ITU-T Q.850. Он указывает, что соединение было успешно разорвано по инициативе одного из абонентов (повешена трубка) или логикой диалплана (команда Hangup()).
2. Проверка инициатора сброса в PRI Debug
asterisk -rx "pri set debug 2 span 1"
# Анализ направления сообщения DISCONNECT:
# Если '-- < [08 02 81 90]' (стрелка влево) — трубку повесил оператор связи/городской абонент.
# Если '-- > [08 02 81 90]' (стрелка вправо) — трубку повесил Asterisk/внутренний абонент.3. Предотвращение ложных срабатываний в extensions.conf
Если вызовы обрываются слишком быстро с кодом 16, проверьте таймауты в диалплане:
[outgoing-calls]
exten => _X.,1,NoOp(Вызов абонента)
same => n,Dial(DAHDI/g1/${EXTEN},45,tT) ; Убедитесь, что таймаут не равен 0 или слишком мал
same => n,NoOp(Причина отбоя HANGUPCAUSE: ${HANGUPCAUSE})
same => n,Hangup()4. Отключение избыточного логирования нормального отбоя
В /etc/asterisk/logger.conf исключите уровень предупреждений для штатных сообщений:
console => notice,warning,error
messages => notice,warning,error Частые вопросы (FAQ)
Является ли Cause 16 ошибкой?
Нет. Cause 16 — это стандартный информационный код успешного завершения звонка без сбоев оборудования или сети.
Какой SIP ответ соответствует ISDN Cause 16?
Если звонок уже был отвечен, Cause 16 транслируется в SIP-запрос BYE с заголовком Reason: Q.850;cause=16. Если звонок отменен до ответа — в SIP 200 OK на CANCEL.
Почему Asterisk пишет WARNING в лог для Cause 16?
В некоторых версиях Asterisk модуль sig_pri выводит все события DISCONNECT с уровнем WARNING, если в канале были активны специфические сервисные таймеры или трансляции.
Как получить код причины завершения в диалплане?
Используйте стандартную переменную канала ${HANGUPCAUSE}. Она вернет числовое значение по стандарту ITU-T Q.850 (например, 16, 17, 34).