Диагностика сбоев BLF (Busy Lamp Field): подписки SUBSCRIBE и события NOTIFY
- Индикаторы кнопок быстрого набора на 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/1022. Настройка поддержки подписок на события в 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=SecretPassword3. Проверка прохождения 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.
Частые вопросы (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.