背景

之前的文章详细的描述了ONVIF的基本原理和流程,每个步骤和接口都给出了相应的Demo。对于c#和DotNet平台上的开发来说,通过引用服务(引用 web service)的方式进行开发会节省很多的时间。

文章发表的顺序可能有点乱,麻烦根据《基于ONVIF协议的摄像机监控管理平台(1)概述》里面的文章目录进行阅读,抱歉了


一、基本思路

  1. 在VS(visual studio 2008 2010 2013 2015)中,通过添加服务引用、或者添加web引用的方式,生成onvif服务框架代码。



  2. 自行编写代码,实现代码广播、组播,搜索发现设备,获取服务地址。

  3. 利用第一步中生成的框架代码,去服务地址调用相应的接口api。



  4. 需要鉴权认证的接口,就添加鉴权auth所需的username,digest token等信息。

二、怎么使用c#的服务引用功能

  1. 创建一个 c# winform 项目或者其它c# 项目。

  2. 右键点击项目,在弹出的菜单中选择添加服务引用。



  3. 有两种添加引用的方式,一种是服务引用,一种是web引用。我接下来会写篇文章解析一下。我demo中用得是服务引用。

  4. 在地址栏中填入onvif官方 wsdl的地址链接,点击转到即可。
    爱唠叨的老鱼



  5. 我这里主要用到Devicemanagement和Media两部分,所以只添加了两个。
    https://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl
    https://www.onvif.org/ver10/media/wsdl/media.wsdl

  6. 如果添加服务成功,在项目里面就会有个 Service Reference的目录,就是刚刚生成的代码框架。

三、使用c#和onvif的官方wsdl文件生成相应的代码框架

  1. DeviceManagement用到的主要 DeviceClient

  2. Media用到的主要是MediaClient

四、向摄像机发起web service请求

  1. 这里先举个简单例子吧。

  2. 这个是服务地址 http://192.168.110.163:80/onvif/device_service 。前面的文章有写到。

  3. 代码demo

        private void ReferenceTest()
        {
         var messageElement = new TextMessageEncodingBindingElement();
            messageElement.MessageVersion = MessageVersion.CreateVersion(EnvelopeVersion.Soap12, AddressingVersion.None);
            HttpTransportBindingElement httpBinding = new HttpTransportBindingElement();
            httpBinding.AuthenticationScheme = AuthenticationSchemes.Digest;
            CustomBinding bind = new CustomBinding(messageElement, httpBinding);
            //绑定服务地址
            EndpointAddress serviceAddress = new EndpointAddress("http://192.168.110.163:80/onvif/device_service");
            ServiceReference1.DeviceClient deviceClient = new ServiceReference1.DeviceClient(bind, serviceAddress);
            //查看系统时间
            ServiceReference1.GetSystemDateAndTimeResponse date = deviceClient.GetSystemDateAndTime(new ServiceReference1.GetSystemDateAndTimeRequest());         Console.WriteLine(date.SystemDateAndTime.UTCDateTime.Date.Month.ToString());
            //查看设备能力
            ServiceReference1.GetCapabilitiesResponse cap= deviceClient.GetCapabilities(new ServiceReference1.GetCapabilitiesRequest());
            Console.WriteLine(cap.Capabilities.Media.XAddr.ToString());
        }

五、关于鉴权认证

由于自动生成的c#框架代码没有文档,所以鉴权认证部分搜索起来资料很少。我专门在下一篇文章里面讲一下。

补充说明

有问题的可以咨询我。有偿咨询,哈哈

后记

有任何的疑问或者想法,或者对本文有质疑或者补充的话,欢迎在留言区评论,期待你的分享!


同时,也欢迎关注扫描屏幕下方关注本人微信公众号或者打赏一下这篇文章。



http://xzh.i3geek.com

爱唠叨的老鱼

爱唠叨的老鱼

技术经理,个人站长,创业者

0 条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据