gpt4 book ai didi

c# - 无法在 ONVIF 中实现事件订阅

转载 作者:太空宇宙 更新时间:2023-11-03 21:05:18 25 4
gpt4 key购买 nike

我正在使用 Onvif 设备管理器 dll(onvif.services、discovery、session 和 utils.async、common、diagnostic、fsharp dll)实现 ONVIF。

到目前为止,我能够发现 onvif 设备,获取范围(设备信息)及其配置文件,流式传输视频并实现 ptz 控制。

现在我正在实现事件订阅,但我无法订阅任何特定事件。

Here is my code of event subscription. and i don't know what to do next.

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

谁能告诉我如何实现事件订阅?

最佳答案

经过大量阅读和搜索,我已经使用 Onvif 设备管理器 dll 实现了事件。

我们可以通过三种方式订阅事件。

1.实时拉点通知接口(interface)(拉点机制)

2.基本通知接口(interface)(推送机制)

3.通知流接口(interface)。 (元数据流)

实时拉点通知界面

该接口(interface)提供了一个防火墙友好的通知接口(interface)。在此客户端中,将定期从相机中拉取拉取事件的消息。因此,我们创建一个拉点订阅,然后从相机中拉取事件。

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

基本通知界面。(推送机制)

在此界面中,相机将通知客户端有关事件。发送Notification的连接由摄像头发起,建立在TCP协议(protocol)上,所以这里需要防火墙的许可。

此接口(interface)的优点是客户端不需要是设置订阅的同一实体,即相机可以在订阅完成后将事件发送给任何客户端。

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

}
}

通知流接口(interface)

在此界面中,我们通过 RTP 或 RTSP 流实时接收事件通知。首先,设置一个媒体配置文件,其中包含一个带有所需事件过滤器的 MetadataConfiguration。之后,流可以获取和使用该配置文件的 URI。

我还没有尝试过这个界面。

以上代码没有过滤器,所以它会为所有事件发出通知。

关于c# - 无法在 ONVIF 中实现事件订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41589693/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com