SIP 487 Request Terminated: отмена вызова, метод CANCEL и сброс звонящим
Вызов не завершается разговором и сопровождается следующей последовательностью пакетов:
- В SIP-трассировке на запрос
INVITEвозвращается ответSIP/2.0 487 Request Terminated. - Перед получением 487 со стороны вызывающего абонента или АТС отправляется запрос
CANCEL. - В CDR-статистике вызовы помечаются как
NO ANSWER,CANCELLEDилиABANDONED. - В сценариях параллельного дозвона (Ring Group) один аппарат отвечает на звонок, а остальные немедленно получают статус 487.
1. Анализ последовательности сигнального диалога
Ошибка 487 является стандартной реакцией протокола SIP на отмену еще не установленной сессии:
UAC (Звонящий) UAS (Сервер/Абонент)
| |
|------ INVITE ------>| (Инициация звонка)
|<-- 100 Trying ------|
|<-- 180 Ringing -----| (Идет КПВ)
| |
|------ CANCEL ------>| (Звонящий повесил трубку)
|<-- 200 OK (CANCEL)--|
|<-- 487 Terminated --| (Подтверждение прекращения INVITE)
|------ ACK --------->|2. Траблшутинг таймаутов в Asterisk (Ring Groups / Queues)
Если 487 возникает преждевременно, проверьте значение времени дозвона (Ring Time) в extensions.conf:
; Слишком короткий таймаут (10 сек) приведет к досрочной отправке CANCEL:
[from-internal]
exten => 200,1,Dial(PJSIP/201&PJSIP/202,10)
; Увеличьте время дозвона до стандартных 30-40 секунд:
exten => 200,1,Dial(PJSIP/201&PJSIP/202,35)
same => n,Hangup()3. Исключение ложных срабатываний в очередях FreePBX
В настройках Queues проверьте параметр Agent Timeout. Если он меньше времени, необходимого оператору для поднятия трубки, АТС будет постоянно разрывать сессию через CANCEL -> 487 и переходить к следующему оператору.
4. Проверка работы таймеров T1 и B в SIP-стеке
Если вызываемый клиент не присылает 180 Ringing в течение таймера B (по умолчанию 32 сек), вызывающий UAC сам отправит CANCEL с последующим получением 487 от шлюза.
Частые вопросы (FAQ)
Является ли статус 487 Request Terminated признаком аварии?
В большинстве случаев нет. Это штатный код завершения диалога INVITE, если звонящий абонент положил трубку до того, как на другом конце подняли трубку, либо если вызов перехватил другой оператор в группе.
Что произойдет, если CANCEL отправлен после получения 200 OK на INVITE?
CANCEL уже не сработает, так как диалог считается установленным. В этом случае UAC обязан немедленно отправить сообщение BYE для завершения разговора.
Почему все телефоны в группе вызова, кроме ответившего, фиксируют пропущенный вызов с 487?
Когда один телефон отвечает (200 OK), АТС рассылает CANCEL на остальные аппараты. Телефоны отвечают 487 и многие модели записывают это в журнал как 'Пропущенный вызов'. Для устранения включите заголовок 'Reason: SIP;cause=200;text="Call completed elsewhere"'.
Как передать заголовок Call Completed Elsewhere в Asterisk?
В команде Dial используйте флаг 'c': same => n,Dial(PJSIP/101&PJSIP/102,30,c). Это предотвратит появление ложных записей о пропущенных звонках на неответивших телефонах.