2017-01-11 4 views
0

Я реализую ONVIF с помощью диспетчера устройств DLL (onvif.services, discovery, session и utils.async, common, diagnostic, fsharp dll).Невозможно реализовать подписку на события в ONVIF

До сих пор я мог обнаружить устройства onvif, получать области (информацию об устройстве) и его профили, передавать потоковое видео и реализовывать управление ptz.

Теперь я осуществляю подписку на события, но я не могу подписаться на какое-либо конкретное событие.

Это код моего кода. и я не знаю, что делать следующий.

OnvifParam deviceparam = ONVIFDevices[listBox1.SelectedIndex]; 
deviceparam.Account = new NetworkCredential { UserName = "admin", Password = "admin" }; 
var sessionFactory = new NvtSessionFactory(deviceparam.Account); 

int listenport = 8085; 
string EventListeningPort = null; 
int.TryParse(EventListeningPort, out listenport); 
Uri uri = new Uri(deviceparam.Uris[0].ToString()); 
deviceparam.URL = uri.ToString(); 
Profile[] profiles = null; 
var f = sessionFactory.CreateSession(uri); 
profiles = f.GetProfiles().RunSynchronously(); 
deviceparam.Profiles = profiles; 

OdmSession o = new OdmSession(f); 

var subs = o.GetBaseEvents(listenport).Subscribe(); 

var eventprop = f.GetEventProperties(); 

FilterType filter = new FilterType(); 

Может кто-нибудь сказать мне, как осуществить подписку на событие?

+0

Проблема с пониманием того, как работает подписка на событие ONVIF или проблема с ее кодом? – kajojeq

+0

Этот вопрос касался того, как работает подписка на события. Но теперь я могу подписаться на все события, но я не могу отфильтровать события. –

+1

Возможно, вы должны ответить на свой вопрос, если решите эту проблему, – kajojeq

ответ

2

После много чтения и поиска я внедрил Событие, используя DLL-файлы диспетчера устройств Onvif.

Существует три способа подписаться на события.

1.Real время Pull-точка Notification интерфейса. (Выдвижной механизм точки)

2.Basic Notification интерфейс. (Push механизм)

3.Notification Streaming интерфейс. (Потоковое Metadata)

в реальном масштабе времени Pull-точка уведомления Интерфейс

Этот интерфейс обеспечивает межсетевой экран дружественный интерфейс уведомлений. В этом клиенте на регулярной основе будут вытягивать сообщения события события с камеры. Таким образом, мы создаем подписку на pull-point, а затем вытягиваем события из камеры.

КОД

class Events 
{ 
    public void GenerateEvent() 
    { 
     // for this device must be discoverable and and its account and uri must be known 

     var sessionFactory = new NvtSessionFactory(deviceparam.Account); // deviceparam is camera and account contaion its username and password 
     var sess = sessionFactory.CreateSession(uri); 
     OdmSession os = new OdmSession(sess); 
     os.GetPullPointEvents()// this function contains function for the subscription and pull messages 
      .Subscribe(
      evnt => 
      { 
       Console.WriteLine(EventParse.ParseTopic(evnt.topic)); 
       var messages = EventParse.ParseMessage(evnt.message); 
       messages.ForEach(msg => Console.WriteLine(msg)); 
      }, err => 
      { 
       Console.WriteLine(err.Message); 
      } 
      ); 

    } 
} 

public static class EventParse 
{ 
    public static string ParseTopic(TopicExpressionType topic) 
    { 
     string topicString = ""; 

     topic.Any.ForEach(node => { 
      topicString += "value: " + node.Value; 
      }); 

      return topicString; 
    } 

    public static string[] ParseMessage(Message message) 
    { 
     List<string> messageStrings = new List<string>(); 

     messageStrings.Add("messge id: " + message.key); 

     if(message.source!= null) 
      message.source.simpleItem.ForEach(sitem => 
      { 
       string txt = sitem.name + " " + sitem.value; 
       messageStrings.Add(txt); 
      }); 

     if (message.data != null) 
      message.data.simpleItem.ForEach(sitem => 
      { 
       string txt = sitem.name + " " + sitem.value; 
       messageStrings.Add(txt); 
      }); 

     return messageStrings.ToArray(); 
    } 
} 

Basic Notification Interface. (Push механизм)

В этой камере интерфейс уведомляет клиента о событии. Соединение, по которому отправляется уведомление, инициируется камерой и устанавливается по протоколу TCP. Поэтому нам нужно разрешение брандмауэра.

Преимущество этого интерфейса заключается в том, что клиенту не обязательно должен быть тот же объект, который устанавливает подписку, то есть камера может отправить событие любому клиенту после завершения подписки.

КОД

class Events 
{ 
    public void GenerateBaseEvent() 
    { 
     // for this device must be discoverable and and its account and uri must be known 

     var sessionFactory = new NvtSessionFactory(deviceparam.Account); // deviceparam is camera and account contaion its username and password 
     var sess = sessionFactory.CreateSession(uri); 
     OdmSession os = new OdmSession(sess); 
     os.GetBaseEvents(9865)// some random port number 
      .Subscribe(
      evnt => 
      { 
       Console.WriteLine(EventParse.ParseTopic(evnt.topic)); 
       var messages = EventParse.ParseMessage(evnt.message); 
       messages.ForEach(msg => Console.WriteLine(msg)); 
      }, err => 
      { 
       Console.WriteLine(err.Message); 
      } 
      ); 

    } 
} 

Уведомление Streaming Интерфейс

В этом интерфейсе мы получаем уведомления о событиях в режиме реального времени в течение RTP или RTSP потока. Во-первых, настроен профиль мультимедиа, содержащий метаданныеконфигурации с нужным фильтром событий. После этого может быть извлечен и использован URI для потока .

Я еще не пробовал этот интерфейс.

У выше кода нет фильтра, поэтому он будет уведомлять обо всех событиях.

Смежные вопросы