經過大量的閱讀和搜索後,我使用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。
我還沒有試過這個接口。
上面的代碼沒有過濾器,所以它會通知所有的事件。
這是理解ONVIF事件訂閱如何工作或者如何編碼的問題嗎? – kajojeq
這個問題是關於事件訂閱如何工作。但現在我可以訂閱所有的事件,但我無法過濾掉事件。 –
你應該回答你自己的問題,如果你解決了這個問題,關心 – kajojeq