其它的不多说,直接开始步骤。
我的版本是2.8.109,目前最新版本。

实际上,onvif的源码是兼容Linux、Windows版本的,例如如果你已经在这篇文章ONVIF协议网络摄像机(IPC)客户端程序开发使用gSOAP生成ONVIF框架代码(C++,并支持h264、h265)01–>CentOS编译好了对应的Onvif源码,那么就可以直接使用了,例如你可以使用这份在Linux生成Onvif源码在Windows下生成静态库。

1 gsoap工具下载地址

1)下载
去下面网址按注释下载。

https://sourceforge.net/projects/gsoap2//最新版本,点击Files,然后下载

2)解压

3)windows与linux不一样,不需要安装相应配置,直接进入对应的目录即可。
进入以下目录。

2 使用gSOAP生成ONVIF框架代码

2.1 准备原材料
1)在win64创建了一个dev_onvif目录。并且在dev_onvif目录内创建bin,gsoap两个空目录。
2)拷贝wsdl2h.exe,soapcpp2.exe进去刚刚创建的bin目录。
3)将gsoap2.8/gsoap内的custom,extras,import,plugin,WS目录和dom.cpp,stdsoap2.h,stdsoap2.cpp(.c文件不需要处理,因为与同名的cpp是完全一样的)源代码文件拷贝到刚刚创建的gsoap。
所以目前的目录架构是这样的。
win64内部:

dev_onvif内部:

gsoap内部:

2.2 防止出现LONG64的错误
为了不让编译时出现LONG64的错误,我们需要在typemap.dat(在刚刚创建的gsoap/WS)中去掉一个注释,注意,只需要删除一个#即可。大概218行。

# xsd__duration = #import "custom/duration.h" | xsd__duration
改成
xsd__duration = #import "custom/duration.h" | xsd__duration

2.3 生成onvif.h头文件
为了方便,在dev_onvif目录下编写脚本onvif_head.sh,生成头文件。
需要注意的是:由于windows的wsdl2h不支持https协议,所以只能使用http。一开始我直接使用linux的下载方法导致我也浪费了点时间处理。
另外,最下面我给出了所有需要用到的wsdl文件和xsd文件。根据个人而定,网速好的话尽量在线下载好点。

但是,如果没有相关要求,建议最好全都下载,这样后续缺少模块后,不用每次都要重新下载一遍。
例如,获取profile时,需要ver20版本的media.wsdl,若只下载了ver10版本的media.wsdl,则没办法兼容,具体看ONVIF协议网络摄像机(IPC)客户端程序开发使用gSOAP生成ONVIF框架代码(C++,并支持h264、h265)01–>CentOS的注释。

#!/bin/bash
#wsdl2h -help查看选项帮助if [ ! -d "onvif_head" ]; then mkdir onvif_head
elserm -rf onvif_head/*
fi# 注意,这里是进入了onvif_head/目录的,所以下面是../bin/wsdl2。
cd onvif_head/#有些地址缺少onvif节点是因为加上onvif可能会打不开。例如第三个media,但是有时又行,我试过晚上可能比较慢。甚至突然无法下载。我试过有些是因为不支持https协议导致的,可以试试换成http。
#并且注意:想要开发光圈,对比度,饱和度设置的,需要添加imaging.wsdl,这是我后面加上的.不过不是嵌入式的,建议还是全部下载吧,我后面也是全部下载#下面是所有的wsdl和xsd(下面只有2个xsd),根据需求添加。在线下载时,xsd可以不管,xsd一般是下载到本地后好像才有用的,具体忘记了。反正在线下载就不会错。../bin/wsdl2h -x -t ../gsoap/WS/typemap.dat -o onvif.h \
http://www.onvif.org/onvif/ver10/network/wsdl/remotediscovery.wsdl http://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl \
http://www.onvif.org/onvif/ver10/events/wsdl/event.wsdl http://www.onvif.org/onvif/ver10/display.wsdl http://www.onvif.org/onvif/ver10/deviceio.wsdl \
http://www.onvif.org/onvif/ver20/imaging/wsdl/imaging.wsdl http://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl \
http://www.onvif.org/onvif/ver20/media/wsdl/media.wsdl http://www.onvif.org/onvif/ver20/ptz/wsdl/ptz.wsdl \
http://www.onvif.org/onvif/ver10/receiver.wsdl http://www.onvif.org/onvif/ver10/recording.wsdl \
http://www.onvif.org/onvif/ver10/search.wsdl http://www.onvif.org/onvif/ver10/replay.wsdl \
http://www.onvif.org/onvif/ver20/analytics/wsdl/analytics.wsdl http://www.onvif.org/onvif/ver10/analyticsdevice.wsdl \
http://www.onvif.org/onvif/ver10/schema/onvif.xsd http://www.onvif.org/ver10/actionengine.wsdl \
http://www.onvif.org/ver10/pacs/accesscontrol.wsdl http://www.onvif.org/ver10/pacs/doorcontrol.wsdl \
http://www.onvif.org/ver10/advancedsecurity/wsdl/advancedsecurity.wsdl http://www.onvif.org/ver10/accessrules/wsdl/accessrules.wsdl \
http://www.onvif.org/ver10/credential/wsdl/credential.wsdl http://www.onvif.org/ver10/schedule/wsdl/schedule.wsdl \
http://www.onvif.org/ver10/pacs/types.xsd

1.4 因鉴权需要,修改onvif.h头文件
在脚本生成的onvif_head目录内的onvif.h头文件添加下面内容。

#import "wsse.h"

1.5 根据onvif.h生成onvif框架的代码
在onvif_head.sh同路径创建onvif_code.sh,添加如下内容:

#!/bin/bash
if [ ! -d "soap" ]; then mkdir soap
elserm -rf soap/*
fi
cd soap../bin/soapcpp2 -2 -x -C ../onvif_head/onvif.h  -L -I ../gsoap/import -I ../gsoap/
#-2表示获取1.2资源代码,-x表示不获取XML信息文件,-C表示只生成客户端代码
#-L表示不生成客户端或者服务端的库,-I表示import导入路径

添加权限后执行脚本。
报错,这是因为这两个文件重定义了。

#import "wsdd10.h" // wsdd10.h中又#import "wsa.h"
#import "wsa5.h"   // wsa.h和wsa5.h两个文件重复定义了int SOAP_ENV__Fault

解决: 将gsoap源码的wsa5.h(位于刚刚创建的gsoap/import目录)的SOAP_ENV__Fault函数改成其他名字或者直接注释掉。
我是改成其它名字。

将int SOAP_ENV__Fault修改为int SOAP_ENV__Fault_alex

重新执行脚本即可。

1.6 结果
可以看到,成功生成了onvif.h和相应的客户端代码。

上面的命名空间都是这样的内容,所以只需要留一个wsdd.nsmap即可。

3 整理代码

1)在soap的同级目录中创建一个ONVIFAPI文件夹,用于存项目开发时使用。

2)拷贝刚刚生成soap目录内的相关源文件到ONVIFAPI。

cp ../soap/soapH.h ../soap/soapStub.h ../soap/soapC.cpp ../soap/soapClient.cpp ../soap/wsdd.nsmap .

3)拷贝plugin里面的源码到ONVIFAPI。

cp ../gsoap/plugin/wsseapi.* ../gsoap/plugin/wsaapi.* ../gsoap/plugin/threads.* ../gsoap/plugin/smdevp.* ../gsoap/plugin/mecevp.* ../gsoap/plugin/md5evp.* .

4)拷贝custom里面的源码到ONVIFAPI。

cp ../gsoap/custom/struct_timeval.* ../gsoap/custom/duration.* .

5)拷贝dom.cpp,stdsoap2.h,stdsoap2.cpp到ONVIFAPI。

cp ../gsoap/dom.cpp ../gsoap/stdsoap2.* .

6)修改.c后缀成.cpp,防止无法编译vector这些C++特有的容器。这里可能你会拷贝多一个wsseapi的.c文件,删除即可。并且同名的.c和.cpp文件是完全一样的,我使用工具对比过了。所以你可以方心的修改后缀即可。我的版本是2.8-109,共24个文件。

7)关联自己的命名空间,修改stdsoap2.cpp文件,在开头加入下面内容。实际上你也可以在其它地方添加,但是容易重定义命名空间,所以我们到最后编写Onvif的函数时,需要类似模板一样,不要将头文件和.cpp文件分离。

#include “wsdd.nsmap”

上面就已经完成了整个onvif框架的搭建。然后拷贝到你想要开发的项目即可。实际上过程和linux是极其相似的。

4 注意点总结

  • 1)windows的wsdl2h不支持https协议,在下载wsdl文件时必须使用http协议。
  • 2)如果不想上面利用http在线下载的话,就必须提前将所有(或者个人需要的)的wsdl和所需要的xsd文件下载下来。官网如下:
https://www.onvif.org/profiles/specifications/

可以看到,官网也不是全部都有对应的wsdl,但是xsd文件还有足够我们使用的。如果没有对应的wsdl文件,例如remotediscovery.wsdl就没有,这时我们需要按照我上面所给的网址单独下载下来(还是在线好吧)。或者若wsdl和xsd缺少,我们也可以去typemap.dat所在的目录中查找,最好按照缺少的网址下载,因为typemap.dat所在的目录中并不是每个缺少文件都有。

  • 3)并且,如果我们是提前下载完在生成onvif的框架的话,在生成onvif,h时,必须将每个wsdl文件的schemaLocation的路径修改成本地存放的路径,而不能再是http网址原来的路径。

    改成:

ONVIF协议网络摄像机(IPC)客户端程序开发使用gSOAP生成ONVIF框架代码(C++)03-->Windows相关推荐

  1. ONVIF协议网络摄像机(IPC)客户端程序开发(3):理解什么是Web Services

    ONVIF协议网络摄像机(IPC)客户端程序开发(3):理解什么是Web Services 1. 专栏导读 本专栏第一篇文章「专栏开篇」列出了专栏的完整目录,按目录顺序阅读,有助于你的理解,专栏前面文 ...

  2. ONVIF协议网络摄像机(IPC)客户端程序开发(2):第一次使用IPC摄像头

    ONVIF协议网络摄像机(IPC)客户端程序开发(2):第一次使用IPC摄像头 1. 专栏导读 2. 适合读者 本文只适合第一次拿到IPC摄像头,很好奇该怎么使用IPC的读者.已经玩过IPC的,可以略 ...

  3. ONVIF协议网络摄像机(IPC)客户端程序开发(8):获取设备基本信息

    ONVIF协议网络摄像机(IPC)客户端程序开发(8):获取设备基本信息 1 专栏导读 本专栏第一篇文章「专栏开篇」列出了专栏的完整目录,按目录顺序阅读,有助于你的理解,专栏前面文章讲过的知识点(或代 ...

  4. ONVIF协议网络摄像机(IPC)客户端程序开发(5):门外汉理解ONVIF协议

    1. 专栏导读 本专栏第一篇文章「专栏开篇」列出了专栏的完整目录,按目录顺序阅读,有助于你的理解,专栏前面文章讲过的知识点(或代码段),后面文章不会赘述.为了节省篇幅,突出重点,在文章中展示的示例代码 ...

  5. 自行实现ONVIF协议网络摄像机(IPC)开发(0):专栏开篇

    一. 前言 最近做了一个海思车载视频的项目,设备作为客服端实现对市场上主流IPC视频流的获取,现在网上很多资料基本都是使用Web Services组成API实现的,这里博主所有ONVIF协议都是通过自 ...

  6. ONVIF协议网络摄像机(IPC)客户端程序开发(9):鉴权(认证)

    1 专栏导读 本专栏第一篇文章「专栏开篇」列出了专栏的完整目录,按目录顺序阅读,有助于你的理解,专栏前面文章讲过的知识点(或代码段),后面文章不会赘述.为了节省篇幅,突出重点,在文章中展示的示例代码仅 ...

  7. 一、ONVIF协议:使用gSOAP生成ONVIF框架代码

    1 前言   特别感谢@许振坪大佬的文章,使得我能在很短的时间内,通过ONVIF协议获得设备信息.   因为时间的原因,我项目完结之后,再补充相关基础知识,本文章主要记录框架代码生成步骤和遇见的问题. ...

  8. gSOAP生成ONVIF框架代码

    gSOAP生成ONVIF框架代码 一次性把所有可能会用到的WSDL文档都纳入编译,以便得到一份尽可能齐全的ONVIF接口代码.我这样做是为了省事,但我希望你在心底里能明白一件事情:ONVIF有好多个模 ...

  9. ONVIF网络摄像头(IPC)客户端开发—ONVIF介绍

    1.前言: 网上已经有很多关于ONVIF开发的资料,这里概括介绍一下ONVIF协议以及介绍一下我自己在开发ONVIF网络摄像头的一些流程和经验,做个开发记录和经验总结,以备将来查看,也可供他人参考.如 ...

最新文章

  1. 零知识证明实践教程,第一部分
  2. IBM发布人脸识别最强工具,多样性数据集,100万张人脸图像!
  3. [原]职场中,要善于交换利益
  4. 「文末预告,注意查收」告别枯燥的理论,回归技术
  5. SQL 触发器 当修改TEST表中的F1字段时,同时根据条件修改F2字段
  6. RealARM 210开发板 u-boot传递mac地址到内核的方法
  7. 步进电机无细分和20细分_细分网站导航会话
  8. laravel如何生成swagger接口文档
  9. oracle 并行执行 杀掉会话,oracle – 为什么即使我禁用并行DML和并行DDL也会创建并行会话...
  10. Science报道新研究:同行评审后的研究仅比预印本研究质量提高4%
  11. matlab2016a网盘
  12. 端口映射vc++6.0编译【转】
  13. 一文读懂什么是数字证书
  14. 理财入门:思维转变和资产理解以及财务自由说明。
  15. 每日总结-----12月15日
  16. 鼠标到达a标签时变成手型
  17. 慢慢的长大,慢慢的成长
  18. DBA运维工具-OLazy
  19. VUE简介及简单应用案例
  20. ffmpeg中的ts/mp4封装格式支持哪些编码格式

热门文章

  1. PS2手柄代码移植-合泰平台
  2. 计算机一级2021excel,2021年计算机一级EXCEL操作题-20210514115911.doc-原创力文档
  3. 二维码URL多种用法总结
  4. Android 基于AccessibilityService智能安装Apk 仿 豌豆荚
  5. 如何在线批量将XPS转PDF
  6. window7 sp1安装python3.8.5
  7. 视图优化oracle,干货|Oracle复杂视图优化案例分析
  8. jsp连接oracle数据库
  9. 【数分书单】分析思维《一本小小的蓝色逻辑书》第四章小结
  10. 没有耐心去等待成功的到来,只好用一生的耐心去面对失败