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

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

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

BLF_SUBSCRIPTION_FAILED IP-Телефония и СКУД

Диагностика сбоев BLF (Busy Lamp Field): подписки SUBSCRIBE и события NOTIFY

Обновлено: 24.08.2026 · Официальная документация ↗
  • Индикаторы кнопок быстрого набора на IP-телефонах (Yealink, Fanvil, Grandstream) не горят, светятся серым или не меняют цвет при занятости коллеги.
  • Сервер возвращает ошибку SIP/2.0 489 Bad Event на запросы подписки.
  • Высокая нагрузка на процессор АТС из-за лавины повторных запросов SUBSCRIBE.
  • Статус в консоли АТС меняется (InUse), но телефон не получает уведомление NOTIFY.

1. Проверка наличия и состояния Hints в Asterisk

BLF работает исключительно при наличии зарегистрированного хинта (связки добавочного номера и состояния канала):

# Просмотр всех зарегистрированных хинтов
asterisk -rx "core show hints"

# Проверка конкретного номера
asterisk -rx "core show hint 101"

Если хинт отсутствует, добавьте его в диалплан /etc/asterisk/extensions.conf:

exten => 101,hint,PJSIP/101
exten => 102,hint,PJSIP/102

2. Настройка поддержки подписок на события в PJSIP

Отредактируйте /etc/asterisk/pjsip.conf для разрешения подписок на присутствие (Presence/Dialog):

[global]
type=global
default_outbound_endpoint=default_outbound_endpoint

[101]
type=endpoint
context=from-internal
allow_subscribe=yes
sub_min_expiry=60
sub_max_expiry=3600

# Обязательная привязка генератора диалогов
[101]
type=subscription_persistence

# Включение публикации состояния
[101-in-dialog-info]
type=inbound-publication
event_asterisk-devicestate

[101]
type=auth
auth_type=userpass
username=101
password=SecretPassword

3. Проверка прохождения SIP SUBSCRIBE / NOTIFY через Wireshark / sngrep

Запустите консольный анализатор SIP:

sngrep -d any
  • Найдите транзакцию с методом SUBSCRIBE и заголовком Event: dialog.
  • Убедитесь, что сервер отвечает SIP/2.0 200 OK.
  • После изменения статуса абонента сервер ОБЯЗАН отправить запрос NOTIFY с телом application/dialog-info+xml, содержащим состояние: <state>early</state> (звонит), <state>confirmed</state> (разговаривает) или <state>terminated</state> (свободен).

4. Настройка на стороне IP-телефона

  • Тип клавиши DSSKey: BLF (или Busy Lamp Field).
  • Значение (Value): добавочный номер (например, 101).
  • ID подписки / Extension: тот же номер (101).
  • Режим Dialog-Info: установите RFC 4235 / Broadsoft Dialog-Info.
💡 Практика специалистов: Если у вас в сети более 500 телефонов, массовая отправка NOTIFY при одновременной смене статусов может вызвать шторм прерываний CPU. Обязательно ограничивайте частоту отправки уведомлений директивой `notifyringing = no` или оптимизируйте таймеры с помощью `max_subscription_rate`.

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

Почему сервер возвращает '489 Bad Event' на запрос SUBSCRIBE от телефона?

Это означает, что сервер не поддерживает или не включил обработчик событий, запрошенный в заголовке 'Event:'. Например, телефон запрашивает 'Event: dialog', а на стороне Asterisk отключен модуль res_pjsip_dialog_info или res_pjsip_exten_state.

Почему BLF перестает обновляться через час после включения аппарата?

Истекает таймер подписки (Subscription-Expires). Если телефон из-за агрессивного NAT не может отправить повторный SUBSCRIBE, либо сервер забыл продлить сессию подписки, отправка NOTIFY прекращается.

Как использовать одну кнопку BLF для индикации и перехвата звонка (Call Pickup)?

В настройках телефона задайте 'BLF Pickup Code' (например, *8 в Asterisk). При нажатии на мигающую красным кнопку телефон отправит INVITE на *8101 и перехватит входящий вызов на себя.

Как сбросить зависшие подписки в PJSIP?

Выполните в консоли Asterisk команду: pjsip show subscriptions, найдите зависший URI и выполните перезапуск модуля: module reload res_pjsip_pubsub.so.

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