ONVIF Ошибка PullMessages: подписка на события истекла или закрыта
- Периодический сбой получения событий тревоги, детекции движения и проходов СКУД по ONVIF.
- Вызов метода
PullMessagesвозвращает ошибкуwsnt:SubscriptionEndилиThe subcription has expired or does not exist. - Сервер VMS перестает реагировать на аппаратные тревожные входы (Alarm Inputs) камеры.
1. Архитектура доставки событий PullPoint в ONVIF
Сервис событий ONVIF PullPoint Event Mechanism работает по модели аренды подписки (Subscription Lease). Клиент создает точку подписки через CreatePullPointSubscription, получая уникальный URL с временем жизни (InitialTerminationTime, например PT60S — 60 секунд). Для поддержания подписки клиент обязан регулярно вызывать метод Renew.
Если клиент задержал вызов PullMessages или Renew дольше установленного таймаута, камера автоматически уничтожает объект подписки для освобождения памяти, возвращая ошибку при следующем запросе.
2. Создание долгоживущей подписки (CreatePullPointSubscription)
<soapenv:Body>
<tev:CreatePullPointSubscription xmlns:tev="http://www.onvif.org/ver10/events/wsdl">
<!-- Запрашиваем время жизни подписки 10 минут (PT10M) -->
<tev:InitialTerminationTime>PT10M</tev:InitialTerminationTime>
</tev:CreatePullPointSubscription>
</soapenv:Body>В ответе сохраните возвращенный адрес подписки (SubscriptionReference -> Address), например: http://192.168.1.50/onvif/subscription?idx=12.
3. Продление подписки методом Renew
Отправляйте запрос Renew по таймеру до истечения срока аренды:
<soapenv:Body>
<wsnt:Renew xmlns:wsnt="http://docs.oasis-open.org/wsn/b-2">
<wsnt:TerminationTime>PT10M</wsnt:TerminationTime>
</wsnt:Renew>
</soapenv:Body>4. Обработка ошибки и автоматическое переподключение (Reconnect Loop)
В архитектуре сервиса интеграции предусмотрите перехват исключения завершения подписки:
- При получении кода ошибки
SubscriptionEndилиInvalidMessageContentзакройте старый сокет; - Инициируйте процедуру
Unsubscribe(подавление ошибок); - Создайте новую подписку через
CreatePullPointSubscriptionи перенаправьте циклPullMessagesна новый URL.
Частые вопросы (FAQ)
Какой оптимальный таймаут указывать в PullMessages?
Рекомендуемый таймаут ожидания сообщений (Timeout) в запросе PullMessages составляет от 5 до 30 секунд (например, PT15S) при лимите сообщений MessageLimit=10.
Почему подписка разрывается при нестабильном Wi-Fi/4G канале?
При потере связи клиент пропускает цикл отправки Renew или PullMessages. Камера считает клиента отключенным и удаляет подписку по истечении TerminationTime.
Сколько одновременных подписок на события поддерживает одна камера?
Большинство встраиваемых IP-камер аппаратно ограничены лимитом в 2–4 одновременных PullPoint сессий. При превышении лимита новые подписки отклоняются.
Как получать события без постоянного создания Pull-подписок?
Используйте базовый механизм WS-BaseNotification (Push-уведомления), где камера сама отправляет HTTP POST запросы на эндпоинт вашего веб-сервера (ConsumerReference).