События, которые не генерируются камерой ONVIF

У меня есть несколько камер и кодеров, совместимых с ONVIF, от которых я хочу получать события, например сигнализация движения.

Пока мне удалось подписаться (я думаю) с событиями wsdl, но никаких событий никогда не генерируется. Я проверил настройки устройства, чтобы убедиться, что оно использует обнаружение движения, и я слышу переключение реле при наличии движения, поэтому настройки верны.

Я использовал этот вопрос в качестве справки для своей попытки, но поскольку это не так получите принятый тент, я спрошу еще раз.

Вот как я настраиваю свои файлы wsdl:

ServicePointManager.Expect100Continue = false;
EndpointAddress endPointAddress = new EndpointAddress("http://" + CameraInformation.IpAddress + "/onvif/device_service");
HttpTransportBindingElement httpTransportBinding = new HttpTransportBindingElement { AuthenticationScheme = AuthenticationSchemes.Digest };
httpTransportBinding.KeepAliveEnabled = true;
TextMessageEncodingBindingElement textMessageEncodingBinding = new TextMessageEncodingBindingElement { MessageVersion = MessageVersion.CreateVersion(EnvelopeVersion.Soap12, AddressingVersion.WSAddressing10) };
PasswordDigestBehavior passwordDigestBehavior = new PasswordDigestBehavior(CameraInformation.Username, CameraInformation.Password);

CustomBinding customBinding = new CustomBinding(textMessageEncodingBinding, httpTransportBinding);
customBinding.SendTimeout = new TimeSpan(0, 0, 10);

Вот как я инициализирую свою потребительскую службу:

_notificationConsumerService = new NotificationConsumerService();
_notificationConsumerService.NewNotification += _notificationConsumerService_NewNotification;
_notificationConsumerServiceHost = new ServiceHost(_notificationConsumerService, new Uri("http://localhost:8085/NotificationConsumerService"));
_notificationConsumerServiceHost.Open();

класс NotificationConsumerService:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single, AddressFilterMode = AddressFilterMode.Any)]
public class NotificationConsumerService : OnvifEvents.NotificationConsumer
{
      public event EventHandler<EventArgs<OnvifEvents.Notify1>> NewNotification;

      public void Notify(OnvifEvents.Notify1 request)
      {
          var threadSafeEventHandler = NewNotification;
          if (threadSafeEventHandler != null)
              threadSafeEventHandler.Invoke(this, new EventArgs<OnvifEvents.Notify1>(request));
      }

      public Task NotifyAsync(System21.OnvifEvents.Notify1 request)
      {
         return new Task(() =>
            {
                 //return something?
            });
     }
}

     public class EventArgs<T> : EventArgs
     {
        public EventArgs(T data)
        {
            Data = data;
        }
        public T Data { get; set; }
     }

Загрузка клиента производителя уведомлений:

    var serviceAddress = new EndpointAddress(Capabilities.Events.XAddr.ToString());
    if (!string.IsNullOrWhiteSpace(CameraInformation.Username))
    {
         NotificationProducerClient.ClientCredentials.UserName.UserName = CameraInformation.Username;
         NotificationProducerClient.ClientCredentials.UserName.Password = CameraInformation.Password;
    }

и, наконец, добавьте подписку на событие:

if (Capabilities.Events == null)
      throw new ApplicationException("The streamer info does not support event");
try
{
       if (NotificationProducerClient == null)
            LoadNotificationProducerClient();

       var subScribe = new OnvifEvents.Subscribe()
       {
            ConsumerReference = new OnvifEvents.EndpointReferenceType
            {
                  Address = new OnvifEvents.AttributedURIType { Value = _notificationConsumerServiceHost.BaseAddresses.First().ToString() },
            }
       };
       if (!string.IsNullOrWhiteSpace(initialTerminationTime))
            subScribe.InitialTerminationTime = initialTerminationTime;

       OnvifEvents.SubscribeResponse response = NotificationProducerClient.Subscribe(subScribe);
}

Catch (FaultException ex)
{
    Console.Write(ex.ToString());
}
catch (Exception ex)
{
    Console.Write(ex.ToString());
}

Возможный awnser из связанного вопроса заключался в том, что AddressingVersion был установлен на None, когда он должен был быть установлен на WSAddressing10, но я столкнулся с этим ранее, поэтому это не решение этой проблемы.


person Rik    schedule 21.04.2015    source источник


Ответы (2)


Я думаю, что переключение реле связано с ИК-режимом, а не с обнаружением движения. Попробуйте открыть камеру в ODM. Это реализация с открытым исходным кодом для обнаружения ONVIF и подписок на события.

person Mujahid Daud Khan    schedule 21.04.2015
comment
Переключение реле действительно срабатывает при обнаружении движения (устройство имеет выходные контакты, которые можно использовать для обнаружения движения). Я использовал ODM, чтобы увидеть, действительно ли устройство генерирует события, и оно это делает. - person Rik; 21.04.2015

Не уверен, что это актуально, но просто взглянув на этот код, не следует вызывать

_notificationConsumerServiceHost = new ServiceHost(_notificationConsumerService, new Uri("http://localhost:8085/NotificationConsumerService"));

быть чем-то вроде:

_notificationConsumerServiceHost = new ServiceHost(_notificationConsumerService, new Uri("http://<RemoteIP>:8085/NotificationConsumerService"));

то есть "localhost" может не разрешить хост на камере, и в этом случае запрос вызова теряется.

person Sotirios    schedule 26.10.2015