Onvi再学习----分析设计方案

      之前版本的Onvif协议是使用gsoap框架生成的,每升级一次onvif版本都需要从onvif官网下载最新的wsdl。然后使用gsoap带的相关工具去生成框架代码。在onvif版本升级的时候改动太多。故考虑使用xml解析库以及socket实现一个onvif的服务器和客户端demo。

        从下面的Onvif的请求和响应报文来看,Onvif主要使用的是HTTP协议,另外就是xml技术。考虑在socket实现Onvif协议的Server端的时候,考虑使用TCP +固定的http头的方式来打http部分,后续数据使用xml的解析库来实现。

Onvif交互:

HTTP请求//

POST /onvif/device_service HTTP/1.1
Host: 192.168.9.106
Accept: */*
Connection: Close
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 2314

<?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:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsdd="http://schemas.xmlsoap.org/ws/2005/04/discovery" xmlns:chan="http://schemas.microsoft.com/ws/2005/02/duplex" xmlns:wsa5="http://www.w3.org/2005/08/addressing" xmlns:c14n="http://www.w3.org/2001/10/xml-exc-c14n#" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" xmlns:wsc="http://schemas.xmlsoap.org/ws/2005/02/sc" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:xmime="http://tempuri.org/xmime.xsd" xmlns:xop="http://www.w3.org/2004/08/xop/include" xmlns:tt="http://www.onvif.org/ver10/schema" xmlns:wsrfbf="http://docs.oasis-open.org/wsrf/bf-2" xmlns:wstop="http://docs.oasis-open.org/wsn/t-1" xmlns:wsrfr="http://docs.oasis-open.org/wsrf/r-2" xmlns:ns1="http://www.onvif.org/ver20/media/wsdl" xmlns:tan="http://www.onvif.org/ver20/analytics/wsdl" xmlns:tdn="http://www.onvif.org/ver10/network/wsdl" xmlns:tds="http://www.onvif.org/ver10/device/wsdl" xmlns:wsnt="http://docs.oasis-open.org/wsn/b-2" xmlns:tev="http://www.onvif.org/ver10/events/wsdl" xmlns:timg="http://www.onvif.org/ver20/imaging/wsdl" xmlns:tptz="http://www.onvif.org/ver20/ptz/wsdl" xmlns:trp="http://www.onvif.org/ver10/replay/wsdl" xmlns:trt="http://www.onvif.org/ver10/media/wsdl" xmlns:tse="http://www.onvif.org/ver10/search/wsdl">
  <SOAP-ENV:Header>
    <wsse:Security SOAP-ENV:mustUnderstand="true">
      <wsse:UsernameToken>
        <wsse:Username/>
        <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">4bW0XFdHJ4KQpPXRM5dyNfneU5Q=</wsse:Password>
        <wsse:Nonce>imMDXaEqaGLzdHCNRDGcnPngR9Y=</wsse:Nonce>
        <wsu:Created>2019-06-14T09:06:18Z</wsu:Created>
      </wsse:UsernameToken>
    </wsse:Security>
  </SOAP-ENV:Header>
  <SOAP-ENV:Body>
    <tds:GetServices>
      <tds:IncludeCapability>false</tds:IncludeCapability>
    </tds:GetServices>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
HTTP响应//

HTTP/1.1 200 OK
Server: gSOAP/2.8
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 5755
Connection: close

<?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:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsdd="http://schemas.xmlsoap.org/ws/2005/04/discovery" xmlns:chan="http://schemas.microsoft.com/ws/2005/02/duplex" xmlns:wsa5="http://www.w3.org/2005/08/addressing" xmlns:c14n="http://www.w3.org/2001/10/xml-exc-c14n#" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" xmlns:wsc="http://schemas.xmlsoap.org/ws/2005/02/sc" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:xmime="http://tempuri.org/xmime.xsd" xmlns:xop="http://www.w3.org/2004/08/xop/include" xmlns:ns2="http://www.onvif.org/ver10/pacs" xmlns:wsrfbf="http://docs.oasis-open.org/wsrf/bf-2" xmlns:wstop="http://docs.oasis-open.org/wsn/t-1" xmlns:tt="http://www.onvif.org/ver10/schema" xmlns:wsrfr="http://docs.oasis-open.org/wsrf/r-2" xmlns:ns1="http://www.onvif.org/ver10/accesscontrol/wsdl" xmlns:ns3="http://www.onvif.org/ver10/accessrules/wsdl" xmlns:ns4="http://www.onvif.org/ver10/actionengine/wsdl" xmlns:ns5="http://www.onvif.org/ver10/advancedsecurity/wsdl" xmlns:ns6="http://www.onvif.org/ver10/credential/wsdl" xmlns:ns7="http://www.onvif.org/ver10/doorcontrol/wsdl" xmlns:ns8="http://www.onvif.org/ver10/schedule/wsdl" xmlns:ns9="http://www.onvif.org/ver10/thermal/wsdl" xmlns:tad="http://www.onvif.org/ver10/analyticsdevice/wsdl" xmlns:tan="http://www.onvif.org/ver20/analytics/wsdl" xmlns:tdn="http://www.onvif.org/ver10/network/wsdl" xmlns:tds="http://www.onvif.org/ver10/device/wsdl" xmlns:tev="http://www.onvif.org/ver10/events/wsdl" xmlns:wsnt="http://docs.oasis-open.org/wsn/b-2" xmlns:timg="http://www.onvif.org/ver20/imaging/wsdl" xmlns:tls="http://www.onvif.org/ver10/display/wsdl" xmlns:tmd="http://www.onvif.org/ver10/deviceIO/wsdl" xmlns:tptz="http://www.onvif.org/ver20/ptz/wsdl" xmlns:trc="http://www.onvif.org/ver10/recording/wsdl" xmlns:trp="http://www.onvif.org/ver10/replay/wsdl" xmlns:trt="http://www.onvif.org/ver10/media/wsdl" xmlns:trv="http://www.onvif.org/ver10/receiver/wsdl" xmlns:tse="http://www.onvif.org/ver10/search/wsdl">
  <SOAP-ENV:Header>
    <wsse:Security SOAP-ENV:mustUnderstand="true">
      <wsse:UsernameToken>
        <wsse:Username/>
        <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">4bW0XFdHJ4KQpPXRM5dyNfneU5Q=</wsse:Password>
        <wsse:Nonce>imMDXaEqaGLzdHCNRDGcnPngR9Y=</wsse:Nonce>
        <wsu:Created>2019-06-14T09:06:18Z</wsu:Created>
      </wsse:UsernameToken>
    </wsse:Security>
  </SOAP-ENV:Header>
  <SOAP-ENV:Body>
    <tds:GetServicesResponse>
      <tds:Service>
        <tds:Namespace>http://www.onvif.org/ver10/device/wsdl</tds:Namespace>
        <tds:XAddr>http://192.168.9.106:80/onvif/device_service</tds:XAddr>
        <tds:Capabilities>
          <tds:Capabilities> 
            <tds:Network IPFilter="false" ZeroConfiguration="false" IPVersion6="false" DynDNS="false" Dot11Configuration="false" HostnameFromDHCP="false" NTP="0"/>  
            <tds:Security TLS1.0="false" TLS1.1="false" TLS1.2="false" OnboardKeyGeneration="false" AccessPolicyConfig="false" DefaultAccessPolicy="true" Dot1X="false" RemoteUserHandling="false" X.509Token="false" SAMLToken="false" KerberosToken="false" UsernameToken="true" HttpDigest="false" RELToken="false"/>  
            <tds:System DiscoveryResolve="false" DiscoveryBye="true" RemoteDiscovery="false" SystemBackup="false" SystemLogging="false" FirmwareUpgrade="true" HttpFirmwareUpgrade="false" HttpSystemBackup="false" HttpSystemLogging="false" HttpSupportInformation="false"/> 
          </tds:Capabilities>
        </tds:Capabilities>
        <tds:Version>
          <tt:Major>1</tt:Major>
          <tt:Minor>0</tt:Minor>
        </tds:Version>
      </tds:Service>
      <tds:Service>
        <tds:Namespace>http://www.onvif.org/ver10/events/wsdl</tds:Namespace>
        <tds:XAddr>http://192.168.9.106/onvif/Events</tds:XAddr>
        <tds:Capabilities>
          <tev:Capabilities WSSubscriptionPolicySupport="true" WSPullPointSupport="false" WSPausableSubscriptionManagerInterfaceSupport="false" MaxNotificationProducers="10" MaxPullPoints="10"></tev:Capabilities>
        </tds:Capabilities>
        <tds:Version>
          <tt:Major>1</tt:Major>
          <tt:Minor>0</tt:Minor>
        </tds:Version>
      </tds:Service>
      <tds:Service>
        <tds:Namespace>http://www.onvif.org/ver10/media/wsdl</tds:Namespace>
        <tds:XAddr>http://192.168.9.106/onvif/Media</tds:XAddr>
        <tds:Capabilities>
          <trt:Capabilities SnapshotUri="false" Rotation="false"> 
            <trt:ProfileCapabilities MaximumNumberOfProfiles="33"></trt:ProfileCapabilities>  
            <trt:StreamingCapabilities RTPMulticast="false" RTP_TCP="false" RTP_RTSP_TCP="true" NonAggregateControl="false"></trt:StreamingCapabilities> 
          </trt:Capabilities>
        </tds:Capabilities>
        <tds:Version>
          <tt:Major>1</tt:Major>
          <tt:Minor>0</tt:Minor>
        </tds:Version>
      </tds:Service>
      <tds:Service>
        <tds:Namespace>http://www.onvif.org/ver20/imaging/wsdl</tds:Namespace>
        <tds:XAddr>http://192.168.9.106/onvif/Image</tds:XAddr>
        <tds:Capabilities>
          <timg:Capabilities ImageStabilization="true"></timg:Capabilities>
        </tds:Capabilities>
        <tds:Version>
          <tt:Major>1</tt:Major>
          <tt:Minor>0</tt:Minor>
        </tds:Version>
      </tds:Service>
      <tds:Service>
        <tds:Namespace>http://www.onvif.org/ver20/analytics/wsdl</tds:Namespace>
        <tds:XAddr>http://192.168.9.106/onvif/Analytics</tds:XAddr>
        <tds:Capabilities>
          <tan:Capabilities RuleSupport="true" AnalyticsModuleSupport="true" CellBasedSceneDescriptionSupported="true"></tan:Capabilities>
        </tds:Capabilities>
        <tds:Version>
          <tt:Major>1</tt:Major>
          <tt:Minor>0</tt:Minor>
        </tds:Version>
      </tds:Service>
    </tds:GetServicesResponse>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

从上面Onvif的简单报文交互可以看到,Onvif主要就是通过HTTP+XML进行信令的传输,故选用如下的实现方案:

  • HTTP接收数据
  • XML解析(最终选用了Mini-XML库)

 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值