2017-01-11 61 views
0

我通過使用Onvif設備管理器dll(onvif.services,discovery,session和utils.async,common,diagnostic,fsharp dll)實現ONVIF。無法在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

經過大量的閱讀和搜索後,我使用Onvif設備管理器dll實現了Event。

我們可以通過三種方式訂閱事件。

1.Real時間拉點通知界面。(拉點機制)

2.基本通知界面(Push機制)

3.Notification(通知)流接口。 (元數據流)

實時拉點通知界面

該接口提供了防火牆友好的通知接口。在這個客戶端將定期從攝像頭拉扯事件的消息。所以我們創建一個拉點訂閱,然後從相機中拉出事件。

CODE

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(); 
    } 
} 

基本通知界面(Push機制)

在這個界面中相機會通知客戶有關事件。發送通知的連接由攝像機發起並建立在TCP協議上,因此我們需要在此處提供防火牆的許可。

該接口的優點是客戶端不需要是設置訂閱的相同實體,即相機可以在訂閱完成後將該事件發送給任何客戶端。

CODE

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); 
      } 
      ); 

    } 
} 

通知流接口

在這個界面中,我們在一個RTP或RTSP流接收實時事件通知。首先,設置一個媒體配置文件,其中包含具有所需事件過濾器的MetadataConfiguration。之後,可以獲取並使用該配置文件的流 URI。

我還沒有試過這個接口。

上面的代碼沒有過濾器,所以它會通知所有的事件。