После много чтения и поиска я внедрил Событие, используя 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 для потока .
Я еще не пробовал этот интерфейс.
У выше кода нет фильтра, поэтому он будет уведомлять обо всех событиях.
Проблема с пониманием того, как работает подписка на событие ONVIF или проблема с ее кодом? – kajojeq
Этот вопрос касался того, как работает подписка на события. Но теперь я могу подписаться на все события, но я не могу отфильтровать события. –
Возможно, вы должны ответить на свой вопрос, если решите эту проблему, – kajojeq