繁体   English   中英

无法在ONVIF中实施事件订阅

[英]Unable to implement event subscription in ONVIF

我正在通过使用Onvif设备管理器dll(onvif.services,发现,会话和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();

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

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

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

1,实时拉点通知界面(拉点机制)

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

3.Notification流接口。 (元数据流)

实时拉点通知界面

该界面提供了防火墙友好的通知界面。 在此客户端中,将以固定间隔从摄像机拉出拉动事件的消息。 因此,我们创建一个拉点订阅,然后从摄像机拉出事件。

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

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

摄像机将在此接口中将事件通知客户端。 发送通知的连接是由摄像机发起的,并且建立在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);
            }
            );

    }
}

通知流接口

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

我还没有尝试过该界面。

上面的代码没有过滤器,因此它将为所有事件提供通知。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM