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

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

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

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.

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