Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

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

Asterisk: DISCONNECT with cause code 31 - Normal, unspecified (Разбор ошибок)

Обновлено: 24.08.2026  ·  Официальная база знаний
  • В логах фиксируется WARNING[7890]: sig_pri.c: Received DISCONNECT with cause code 31 (Normal, unspecified) on channel 0/2.
  • Исходящие звонки на определенные направления (междугородние, мобильные) сбрасываются сразу после набора.
  • Оператор связи не возвращает детальную причину сбоя, подставляя общий дефолтный код 31.
  • В SIP-трассировке вызов завершается ответом SIP/2.0 400 Bad Request или SIP/2.0 500 Server Internal Error.

1. Анализ причины формирования Cause 31

Код Cause 31 (Normal, unspecified) возвращается коммутатором оператора связи, когда вызов отклонен по внутренней причине (неверный формат CallerID, заблокированное направление, отсутствие баланса), но АТС провайдера не настроена на отдачу точных диагностических кодов.

2. Корректировка плана нумерации Type of Number (pridialplan / prilocaldialplan)

В файле /etc/asterisk/chan_dahdi.conf проверьте настройки плана нумерации:

[channels]
switchtype = euroisdn
signalling = pri_cpe

; Настройка формата исходящего номера (Called Number)
pridialplan = dynamic    ; или national / unknown / international

; Настройка формата АОН (CallerID)
prilocaldialplan = dynamic ; или national / unknown / international

internationalprefix = 00
nationalprefix = 0
localprefix = 
privateprefix = 

3. Проверка передачи разрешенного CallerID (АОН)

Провайдеры E1 часто блокируют вызовы, если переданный АОН не принадлежит выделенному пулу номеров компании:

[from-internal]
exten => _8XXXXXXXXXX,1,NoOp(Установка правильного АОН)
 same => n,Set(CALLERID(num)=4951234567)
 same => n,Set(CALLERID(all)="Company" <4951234567>)
 same => n,Dial(DAHDI/g1/${EXTEN},60)
 same => n,Hangup()

4. Глубокий анализ Q.931 SETUP пакета

asterisk -rx "pri set debug 2 span 1"
# Изучите поле 'Calling Number' и 'Called Number' в исходящем пакете SETUP
Практический опыт инженера: Если на потоке E1 вы получаете Cause 31 на все исходящие вызовы, в 95% случаев проблема в параметре prilocaldialplan=unknown: оператор ожидает АОН строго в национальном 10-значном формате без восьмерки (например, 495XXXXXXX).

Частые вопросы (FAQ)

Почему оператор присылает Cause 31 вместо конкретного кода ошибки?

Cause 31 используется как 'универсальная заглушка' в протоколе ISDN PRI/SS7, когда коммутатор оператора не имеет явного маппинга внутренней ошибки (например, сработал антифрод или лимит кредита) на стандарты Q.850.

Что означают параметры pridialplan = national vs unknown?

Они управляют байтом Type of Number (TON) в заголовке Q.931 SETUP. При national номер 4951234567 передается как национальный 10-значный. При unknown номер передается как есть без модификации префиксов.

Как эмулировать Cause 31 в диалплане для теста?

Вы можете принудительно завершить звонок с нужным кодом: same => n,Set(HANGUPCAUSE=31) и same => n,Hangup().

Что делать, если Cause 31 возникает только на международные звонки?

Проверьте, открыт ли у оператора доступ к категории МН-связи (International), и скорректируйте отправку префикса выхода (00 или 810) через pridialplan = international.