背景

之前几篇博客讲述了如何搜索发现设备、进行身份鉴权认证、获取设备基本信息。我们使用ONVIF的目的,一般是监控设备状态和设置参数。在这之前必须先获取设备的能力集合,知道设备有哪些参数内容可以读取和设置。

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


一、这个接口的重要性

我们需要读取摄像机的运行参数、监控设备状态、修改设备参数、操作设备,都必须实现知道这个设备到底支持哪些参数和内容。
这里要用到的接口就是GetCapabilities,也就是获取设备能力的接口。



二、接口的内容

官方的描述就不全部贴上来了,有点长,有需要的可以仔细看看官方文档。

关于这个GetCapabilities有什么用,在下文会有解释。



GetCapabilities

Description:
Any endpoint can ask for the capabilities of a device using the capability exchange request response operation. The device shall indicate all its ONVIF compliant capabilities through the GetCapabilities command. The capability list includes references to the addresses (XAddr) of the service implementing the interface operations in the category. Apart from the addresses, the capabilities only reflect optional functions.

SOAP action:
http://www.onvif.org/ver10/device/wsdl/GetCapabilities

Input:
[GetCapabilities]
Category - optional, unbounded; [CapabilityCategory]
List of categories to retrieve capability information on.
- enum { 'All', 'Analytics', 'Device', 'Events', 'Imaging', 'Media', 'PTZ' }

三、示例代码

其实这里的代码,跟之前调用其它接口的代码并没有太大的不一样。
唯一改变的内容,其实就是服务地址而已,鉴权的方法也是一模一样的。

 private async void HttpGetCapabilities()
        {
            //ONVIF服务所在的地址
            var url = "http://192.168.110.163/onvif/device_service";
            //创建一个http请求
            using (var client = new HttpClient())
            {
                //清楚http请求的所有默认Header,在Header中添加SOAPAction
                client.DefaultRequestHeaders.Clear();
                client.DefaultRequestHeaders.Add("SOAPAction", "https://www.onvif.org/ver10/device/wsdl/GetCapabilities");
                //这段xml字符串是复制过来的,用它生成一个xml结构,然后选择性的修改一部分内容
                String xmlStr = "<?xml version=\"1.0\" encoding=\"utf - 8\"?><s:Envelope xmlns:s=\"http://www.w3.org/2003/05/soap-envelope\"><s:Header><wsse:Security xmlns:wsse=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\" xmlns:wsu=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\"><wsse:UsernameToken><wsse:Username>admin</wsse:Username><wsse:Password Type=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest\">59zlfHOLcoptDNzx2MVvsIiqcow=</wsse:Password><wsse:Nonce>hlCkYZgzndYSXPcrr+RRXg==</wsse:Nonce><wsu:Created>2017-12-28T09:57:22Z</wsu:Created></wsse:UsernameToken></wsse:Security></s:Header><s:Body xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"><GetCapabilities xmlns=\"http://www.onvif.org/ver10/device/wsdl\"/></s:Body></s:Envelope>";
                XmlDocument doc = new XmlDocument();
                doc.LoadXml(xmlStr);
                XmlNode username = doc.GetElementsByTagName("wsse:Username").Item(0);
                XmlNode digest = doc.GetElementsByTagName("wsse:Password").Item(0);
                XmlNode nonce = doc.GetElementsByTagName("wsse:Nonce").Item(0);
                XmlNode created = doc.GetElementsByTagName("wsu:Created").Item(0);
                Console.WriteLine(username.InnerText.ToString());
                Console.WriteLine(digest.InnerText.ToString());
                Console.WriteLine(nonce.InnerText.ToString());
                Console.WriteLine(created.InnerText.ToString());
                //生成请求和相应的参数
                username.InnerText = "admin";
                nonce.InnerText = GetNonce();
                created.InnerText = GetCreated();
                digest.InnerText = GetPasswordDigest(nonce.InnerText, created.InnerText, "123456");
                Console.WriteLine(doc.OuterXml);
                //设置一下 http post的格式
                var content = new StringContent(doc.OuterXml, Encoding.UTF8, "application/xml");
                //发起请求
                var response = await client.PostAsync(url, content);
                //查看响应信息
                var responseString = await response.Content.ReadAsStringAsync();
                Console.WriteLine(responseString.ToString());
            }
        }

四、返回的结果

咱们先来看看,这个接口返回了什么信息。

<?xml version="1.0" encoding="utf-8"?>

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:SOAP-ENC="http://www.w3.org/2003/05/soap-encoding" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xop="http://www.w3.org/2004/08/xop/include" xmlns:xmime4="http://www.w3.org/2004/11/xmlmime" xmlns:wsa5="http://www.w3.org/2005/08/addressing" xmlns:wsrf-bf="http://docs.oasis-open.org/wsrf/bf-2" xmlns:wstop="http://docs.oasis-open.org/wsn/t-1" xmlns:wsrf-r="http://docs.oasis-open.org/wsrf/r-2" xmlns:tes-e="http://www.onvif.org/ver10/events/wsdl/EventBinding" xmlns:tev="http://www.onvif.org/ver10/events/wsdl" xmlns:tes-nc="http://www.onvif.org/ver10/events/wsdl/NotificationConsumerBinding" xmlns:tes-np="http://www.onvif.org/ver10/events/wsdl/NotificationProducerBinding" xmlns:tes-sm="http://www.onvif.org/ver10/events/wsdl/SubscriptionManagerBinding" xmlns:tns1="http://www.onvif.org/ver10/topics" xmlns:xmime="http://www.w3.org/2004/06/xmlmime" xmlns:tt="http://www.onvif.org/ver10/schema" xmlns:wsnt="http://docs.oasis-open.org/wsn/b-2" xmlns:tds="http://www.onvif.org/ver10/device/wsdl" xmlns:timg="http://www.onvif.org/ver20/imaging/wsdl" xmlns:tmd="http://www.onvif.org/ver10/deviceIO/wsdl" xmlns:tptz="http://www.onvif.org/ver20/ptz/wsdl" xmlns:trt="http://www.onvif.org/ver10/media/wsdl" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:ter="http://www.onvif.org/ver10/error" xmlns:tan="http://www.onvif.org/ver20/analytics/wsdl" xmlns:tan-ae="http://www.onvif.org/ver20/analytics/wsdl/AnalyticsEngineBinding" xmlns:tan-re="http://www.onvif.org/ver20/analytics/wsdl/RuleEngineBinding" xmlns:trc="http://www.onvif.org/ver10/recording/wsdl" xmlns:trp="http://www.onvif.org/ver10/replay/wsdl" xmlns:tse="http://www.onvif.org/ver10/search/wsdl" xmlns:tpl="http://www.onvif.org/ver10/plus/wsdl" xmlns:tplt="http://www.onvif.org/ver10/plus/schema">
  <SOAP-ENV:Header/>
  <SOAP-ENV:Body>
    <tds:GetCapabilitiesResponse>
      <tds:Capabilities>
        <tt:Analytics>
          <tt:XAddr>http://192.168.110.163:80/onvif/analytics</tt:XAddr>
          <tt:RuleSupport>true</tt:RuleSupport>
          <tt:AnalyticsModuleSupport>true</tt:AnalyticsModuleSupport>
        </tt:Analytics>
        <tt:Device>
          <tt:XAddr>http://192.168.110.163:80/onvif/device_service</tt:XAddr>
          <tt:Network>
            <tt:IPFilter>false</tt:IPFilter>
            <tt:ZeroConfiguration>false</tt:ZeroConfiguration>
            <tt:IPVersion6>false</tt:IPVersion6>
            <tt:DynDNS>false</tt:DynDNS>
          </tt:Network>
          <tt:System>
            <tt:DiscoveryResolve>true</tt:DiscoveryResolve>
            <tt:DiscoveryBye>true</tt:DiscoveryBye>
            <tt:RemoteDiscovery>false</tt:RemoteDiscovery>
            <tt:SystemBackup>true</tt:SystemBackup>
            <tt:SystemLogging>true</tt:SystemLogging>
            <tt:FirmwareUpgrade>true</tt:FirmwareUpgrade>
            <tt:SupportedVersions>
              <tt:Major>2</tt:Major>
              <tt:Minor>40</tt:Minor>
            </tt:SupportedVersions>
            <tt:SupportedVersions>
              <tt:Major>2</tt:Major>
              <tt:Minor>20</tt:Minor>
            </tt:SupportedVersions>
            <tt:SupportedVersions>
              <tt:Major>2</tt:Major>
              <tt:Minor>10</tt:Minor>
            </tt:SupportedVersions>
            <tt:SupportedVersions>
              <tt:Major>2</tt:Major>
              <tt:Minor>0</tt:Minor>
            </tt:SupportedVersions>
          </tt:System>
          <tt:IO>
            <tt:InputConnectors>0</tt:InputConnectors>
            <tt:RelayOutputs>0</tt:RelayOutputs>
          </tt:IO>
          <tt:Security>
            <tt:TLS1.1>false</tt:TLS1.1>
            <tt:TLS1.2>false</tt:TLS1.2>
            <tt:OnboardKeyGeneration>false</tt:OnboardKeyGeneration>
            <tt:AccessPolicyConfig>false</tt:AccessPolicyConfig>
            <tt:X.509Token>false</tt:X.509Token>
            <tt:SAMLToken>false</tt:SAMLToken>
            <tt:KerberosToken>false</tt:KerberosToken>
            <tt:RELToken>false</tt:RELToken>
          </tt:Security>
        </tt:Device>
        <tt:Events>
          <tt:XAddr>http://192.168.110.163:80/event/evtservice</tt:XAddr>
          <tt:WSSubscriptionPolicySupport>true</tt:WSSubscriptionPolicySupport>
          <tt:WSPullPointSupport>true</tt:WSPullPointSupport>
          <tt:WSPausableSubscriptionManagerInterfaceSupport>true</tt:WSPausableSubscriptionManagerInterfaceSupport>
        </tt:Events>
        <tt:Imaging>
          <tt:XAddr>http://192.168.110.163:80/onvif/imaging</tt:XAddr>
        </tt:Imaging>
        <tt:Media>
          <tt:XAddr>http://192.168.110.163:80/onvif/media</tt:XAddr>
          <tt:StreamingCapabilities>
            <tt:RTPMulticast>true</tt:RTPMulticast>
            <tt:RTP_TCP>true</tt:RTP_TCP>
            <tt:RTP_RTSP_TCP>true</tt:RTP_RTSP_TCP>
          </tt:StreamingCapabilities>
          <tt:Extension>
            <tt:ProfileCapabilities>
              <tt:MaximumNumberOfProfiles>6</tt:MaximumNumberOfProfiles>
            </tt:ProfileCapabilities>
          </tt:Extension>
        </tt:Media>
        <tt:Extension>
          <tplt:Plus>
            <tplt:XAddr>http://192.168.110.163:80/onvif/plus</tplt:XAddr>
            <tplt:PTZTrack>false</tplt:PTZTrack>
            <tplt:PrivacyMask>true</tplt:PrivacyMask>
            <tplt:H265>true</tplt:H265>
            <tplt:SVAC>false</tplt:SVAC>
            <tplt:OperationPtzArea>false</tplt:OperationPtzArea>
          </tplt:Plus>
          <tt:DeviceIO>
            <tt:XAddr>http://192.168.110.163:80/onvif/deviceio</tt:XAddr>
            <tt:VideoSources>1</tt:VideoSources>
            <tt:VideoOutputs>0</tt:VideoOutputs>
            <tt:AudioSources>0</tt:AudioSources>
            <tt:AudioOutputs>0</tt:AudioOutputs>
            <tt:RelayOutputs>0</tt:RelayOutputs>
          </tt:DeviceIO>
          <tt:Recording>
            <tt:XAddr>http://192.168.110.163:80/onvif/recording</tt:XAddr>
            <tt:ReceiverSource>false</tt:ReceiverSource>
            <tt:MediaProfileSource>true</tt:MediaProfileSource>
            <tt:DynamicRecordings>false</tt:DynamicRecordings>
            <tt:DynamicTracks>false</tt:DynamicTracks>
            <tt:MaxStringLength>128</tt:MaxStringLength>
          </tt:Recording>
          <tt:Search>
            <tt:XAddr>http://192.168.110.163:80/onvif/search</tt:XAddr>
            <tt:MetadataSearch>false</tt:MetadataSearch>
          </tt:Search>
          <tt:Replay>
            <tt:XAddr>http://192.168.110.163:80/onvif/replay</tt:XAddr>
          </tt:Replay>
        </tt:Extension>
      </tds:Capabilities>
    </tds:GetCapabilitiesResponse>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

实际上我们看到的是很长的一段,每个人用到的ONVIF的需要都不太一样,所以这么多的信息我们也未必就要全部了解。



五、怎么使用这个接口的返回信息

  1. 我们之前讲的都是ONVIF的devicemgmt部分的内容。
  2. 实际上ONVIF是有很多模块的。具体的可以看一下官方网页。《Network Interface Specifications》
  3. 分为accesscontrol.wsdl accessrules.wsdl actionengine.wsdl等等一共十几二十几个模块服务。
  4. 这些模块服务分别对应不同的服务。
  5. 关于上面那段 返回结果,我们最重要的是获取到某个服务的服务地址,也就是XAddr。
  6. 例如,Media服务,返回结果里面可以看到地址是 http://192.168.110.163:80/onvif/media
        <tt:Media>
          <tt:XAddr>http://192.168.110.163:80/onvif/media</tt:XAddr>
          <tt:StreamingCapabilities>
            <tt:RTPMulticast>true</tt:RTPMulticast>
            <tt:RTP_TCP>true</tt:RTP_TCP>
            <tt:RTP_RTSP_TCP>true</tt:RTP_RTSP_TCP>
          </tt:StreamingCapabilities>
          <tt:Extension>
            <tt:ProfileCapabilities>
              <tt:MaximumNumberOfProfiles>6</tt:MaximumNumberOfProfiles>
            </tt:ProfileCapabilities>
          </tt:Extension>
        </tt:Media>
  1. 如果我们需要用到 media服务里面的接口的话,就会用到这些内容了。

六、补充说明一下

这篇文章只是讲述怎么获取设备能力,以及获取到设备能力之后,怎么去解读这些信息。
关于如何使用这些能力,后续的文章会有进一步说明。

后记

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




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



http://xzh.i3geek.com

爱唠叨的老鱼

爱唠叨的老鱼

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

0 条评论

发表评论

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

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