Asterisk: DISCONNECT with cause code 31 - Normal, unspecified (Разбор ошибок)
- В логах фиксируется
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 Частые вопросы (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.